仙石浩明の日記

Android

2012年2月1日

adb (Android Debug Bridge) 経由で rsync を使ってバックアップできるようにしてみた 〜 shell の echo back を回避する方法

最初の Android 4.0 端末である Galaxy Nexus は、 今までの Android 端末と異なり USB Storage として使うことができない。 PC とデータをやりとりしたいときは MTP (Media Transfer Protocol) を使えということらしい。 従来の Android 端末は、 PC と USB ケーブルで接続することによって、 Android 端末のストレージ (microSD カードなど) を USB Storage として PC からアクセスすることができた。

ただし、 PC と Android 双方から同じストレージを同時に読み書きすると破綻するので、 PC からアクセスするときは、 Android 端末からそのストレージを一時的に切り離す (umount する) 実装になっている。 このため、 ストレージに Android が必要とするデータがあると、 切り離したときに問題が起きる。 例えば着信音 (着メロ) を microSD カード上に置いていると、 切り離しているときに電話がかかってきても、 その着信音を鳴せない (Nexus S などだと、 設定した着信音がアクセスできない場合は、 デフォルトの着信音に切り替わる)。

MTP はブロックデバイス単位でなくファイル単位でストレージを管理する。 したがって PC との接続時でも Android 端末からストレージ全体がアクセスできなくなるという問題がない。 しかも MTP は Windows Vista 以降なら標準でサポートしている。 と、 このように (Samsung と Google は) 考えて、 Galaxy Nexus では USB Storage の代わりに MTP を使うようにしたのだろう (Samsung の一つ前の世代の Android 端末である Galaxy S でも MTP が使える)。 なお、 今後登場する Android 4.0 (Ice Cream Sandwich, ICS) 端末で USB Storage 機能が廃止されるかどうかは不明。 少なくとも Nexus S を ICS にシステムアップデートしても、 従来通り USB Storage を使うことができた。

一見妥当のように見える MTP の採用だが、 実際に使ってみると問題が多い。 ストレートに言えば 「全く使い物にならない」。 Windows XP だと Windows Media Player 10 以降のバージョンをインストールしないと MTP が使えないし、 Windows 以外だと、 標準で MTP をサポートしている OS はほとんどない。 しかも Windows でも、 MTP うんぬん以前に Samsung 端末用の USB ドライバを入手するのが大変。 以前は SAMSUNG_USB_Driver_for_Mobile_Phones.exe が単体で配布されていたようだが、 今は Kies をインストールしないと入手できない (-_-メ)。

さんざん苦労して MTP が使えるようにしても、 データ転送速度が極めて遅い (まだ実装がこなれてないため?)。 さらに、 普通のブロックデバイス (あるいはファイルシステム) として OS から見えないため、 MTP 対応を謳っていない限り、 普通のバックアップアップツールでは扱えないことが多い。 数MB 程度のファイルを一つ二つコピーする程度であればさほど問題無いが、 バックアップなど大量のデータを転送したい場合は不向き。

私の場合、 Galaxy Nexus のストレージ (/mnt/sdcard パーティション, 実際には /data/media を FUSE で /mnt/sdcard に mount している) を毎日 PC (Linux マシン) へバックアップしたい。 全部で数GB の大きさがあるので、 全データを毎回コピーするのは非現実的。 そこで rsync backup for Android アプリを使ってみた。 このアプリは、 内部に rsync と ssh コマンドを持っていて、 rsync を以下のような形で実行している:

/data/data/eu.kowalczuk.rsync4android/files/rsync -vHrltD \
    --chmod=Du+rwx,go-rwx,Fu+rw,go-rw --no-perms --delete-after \
    -e '/data/data/eu.kowalczuk.rsync4android/files/ssh -y -p 22 \
            -i /data/data/eu.kowalczuk.rsync4android/files/dss_key' \
    /mnt/sdcard/ sengoku@senri.gcd.org:~/android/sdcard/

Galaxy Nexus には有線LAN が無いので WiFi 経由で通信することになるが、 PC 同士で rsync する場合と全く同じで、とても簡単。 Android も Linux なのだから、 MTP みたいな得体の知れないものを無理に使うより、 使い慣れた rsync の方が断然 (・∀・)イイ!!

とはいえ、 使ってると WiFi の通信の遅さが気になってきた。 「USBテザリング」 を使えば USB ケーブル経由で TCP/IP 通信を行なうこともできるが、 rsync でデータ転送を行なうためだけにテザリングするのは牛刀な感じが否めない。 また、 テザリングの場合 Android の default route が 3G 回線へ向いてしまうので、 特定のアドレス (プライベート IP アドレス) を USB へ向ける route 設定が必要。

そもそも Android 端末と PC とは adb (Android Debug Bridge) でデータをやりとりしているのだから、 rsync も adb 上で行ないたいと思うのが人情というもの。

前フリが長くなったが、ここからが本題。

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 09:44
2012年1月4日

スマートフォン用の外付バッテリー

あけましておめでとうございます。今年もよろしくお願いします。

近頃のスマートフォン (スマホ) は、 ちょっと使ってるとバッテリーが一日もたない。 出先でバッテリー切れになると大変困るので、 外付バッテリーを携帯している人も多いのではないか。 外付バッテリーには、 リチウムイオン二次電池 (充電式電池, 充電池) を利用するものと、 単三乾電池 (あるいはエネループ等のニッケル水素二次電池) を利用するものがあるが、 前者は (安全性の観点から) 充電池を交換できないことが多く、 充電池が寿命を迎えると使い捨てになってしまう (eneloop mobile booster KBC-L54D など。3900円もするものを使い捨てにするのはモッタイナイ)。

一方後者は、 リチウムイオン充電池に比べると質量あたりの蓄えられる電力量 (重量エネルギー密度) が小さい。 18650 リチウムイオン充電池が、 3.7V * 2400mAh / 47g = 188Wh/kg 程度あるのに対し、 単三のエネループは 1.2V * 1900mAh / 27g = 84Wh/kg と、 リチウムイオン充電池の半分以下しかなく、 スマホの充電用としては力不足。

特に、 単三形ニッケル水素充電池 2本を用いる外付バッテリー (eneloop stick booster など) は、 2.4V (1.2V * 2) を倍以上の 5V (USB の電源電圧) に昇圧して出力するため、 900mAh 程度 (1.2V * 2 * 1900mAh / 5V, 損失があるはずなので実際にはもっと少ないはず) しか出力できず、 スマホを充電しても満充電にはほど遠い。 単三形ニッケル水素充電池を用いるなら 3本〜4本を直列すべきだが、 そうすると重く大きくなってしまい常時携帯するには不適。

というわけで、 私はスマホの充電に、 いわゆる中華充電器 (18650 Batttery Powered USB Bright Torch, 本体側面に 「PORTABLE POWER」 と書かれている) を使っている。 これはリチウムイオン充電池を利用する外付バッテリーだが、 18650 と呼ばれる (直径 18mm 長さ 65.0mm という意味) 安価な汎用リチウムイオン充電池 (一個 300円〜500円) を用いるため、 充電池が寿命を迎えたら充電池のみ交換できる。 18650 充電池の電圧 3.7V を 5V に昇圧して USB コネクタで出力する他、 充電回路も組み込まれているので、 USB ケーブルをつなぐだけで充電も可能。

18650 battery

写真 ↑ の直方体 (白と黒) が中華充電器。 黒い方は裏蓋を外して中身の 18650 充電池が見える状態にして撮影。 手前の面の USB A ソケットに USB ケーブルを接続して充放電を行なう。 中の赤い 18650 充電池は、 ノートPC 用のバッテリーを殻割りして取り出した充電池なので、 接着剤を剥した痕がある。 その隣の青い (「UltraFire」 と書いてある) 18650 充電池は、 香港の鴨寮街 (深水埗駅の出口すぐ) で買った 18650 充電池 2個パック (2個で HK$68 = 約 680円)。

Battery Graph while charging

もちろん、 安全回路なしのリチウムイオン充電池をセル単体 (つまり 18650) で扱うことは危険であり、 発火や爆発の可能性も考慮にいれた運用が求められる。 その危険性故に、 日本では 18650 は、 一般には市販されていない (秋葉原などでは売っている店もある)。 18650 を充電器から日常的に出し入れするなど、 ニッケル水素充電池 (エネループ等) と同様の感覚で扱うことは絶対に避けるべき。

この中華充電器は軽量コンパクトでありながら、 スマホを (ほぼ) 満充電にできるくらいの電力量があるので、 私は常に持ち歩いている。

Galaxy Nexus (香港で購入した GT-I9250) のバッテリーが残り 10% になった段階 (左のグラフで 19:47 の時点) で、 中華充電器による充電を開始してみた (ディスプレイを消灯したまま放置)。 2時間55分後 (22:42) に充電が停止し、 94% まで充電することができた。

Galaxy Nexus のバッテリーは、 1750mAh のリチウムイオン充電池 (スマホの中では容量が大きい方)。 3.7V 2400mAh の 18650 を 5V に昇圧して出力する中華充電器で、 Galaxy Nexus を 10% から 94% まで充電できれば悪くない。 つまり、 充電電気量は 3.7V * 2400mAh / 5V ≒ 1700mAh 程度になる (実際には損失がある) ので、 84% (94% - 10%) を充電できれば充分。 3時間弱の充電中も Galaxy Nexus が 150mAh くらいは消費しているはず (Galaxy Nexus など大抵のスマホは、 ほとんど使わない待受け状態で放置していても 12時間くらいしかバッテリーが持たない) なので、 実際に充電された電気量は 1750mAh * 84% + 150mAh = 1620mAh くらいになっていると思われる。

充電 (中華充電器にとっては放電) が停止したときの中華充電器の 18650 の電圧が 3.38V で、 リチウムイオン充電池の放電終止電圧 2.7V よりだいぶ高いが、 中華充電器の昇圧回路が機能する電圧がこのあたりなのだろう。 また、 中華充電器を満充電したときの 18650 の電圧は、 4.13V だった。 充電中の電圧は 4.2V を超えていないようなので (オシロスコープを持ってないので正確なところは不明)、 まあ大丈夫なのだろう。

Filed under: Android,香港 — hiroaki_sengoku @ 11:56
2011年8月23日

Android 端末で Picasa を使用して画像を共有できなかったので、対策を考えてみた

share - Picasa

Android 上のアプリの多くは 「共有」 機能を用いて他のアプリへデータを送ることができる。 例えば画像ビューアだと、 「メニュー」 から 「共有」 を選び、 「Picasa」 を選ぶことで Android 標準の com.google.android.apps.uploader (マイアップロード) アプリを使って、 Picasa ウェブアルバムへ画像をアップロードできる (← 左図)。

ところが、 この Picasa には Google アカウントとの連係に問題があって、 Android 端末の状態によっては Picasa へのアップロードができなくなってしまう。 つまり、 「Picasa」 を選んだときに、 「Googleアカウントを追加」 する画面に遷移してしまい先に進めない (↓ 下図)。

add Google Account

既にこの携帯に登録済の Googleアカウントで、 画像をアップロードしたいのに、 「マイアップロード」 が現在の登録済アカウントを認識できず、 アカウントの追加を求めてくる。

[戻る] ボタンを押すと 「マイアップロード」 が終了してしまうので、 仕方なく [次へ] をタップして Googleアカウントを追加しようとすると、 「アカウントが既に存在します」 と言われてしまう (↓ 下図)。

Google Account exists already

「アカウントが存在する」 のが分かってるなら、 そのアカウントで画像をアップロードしろよ! と言いたくなるが、 画面には [戻る] しかないのでどうにもならない。

Google ヘルプを見ると、 http://picasaweb.google.com に一度もアクセスしない状態でアップロードを試みると、 このような二進も三進も行かない状態に陥る、 ということらしい。 そこまで分かってるなら対策しろよ、 と言いたくなる。 まあ、 Google 的には、 Picasa へ直接アップロードするのではなく、 Google+ 経由で使って欲しいということなのかもしれないが。

delete Google Account

もちろん、 現在の Googleアカウントをいったん削除すれば、 アカウントを追加することは可能になる (はず)。 しかし、 アカウントを削除しようとすると、 「携帯のメール、連絡先などのすべてのデータも削除されます」 などと脅される (右図 →)。

アカウントを削除しても、 再度アカウントを追加すれば、 削除されたメールや連絡先も再同期されるのだとは思うが、 「1つ目のアカウントを絶対削除したらだめ」 という先達の意見をスルーするのも気が引ける。

また、 知らぬ間にPicasaとの同期が始まるケースもあるらしいが、 ただ待ってるというのも能がないし、 待っていれば必ず始まるというものでもないだろう。

そこで、 アカウントを削除すること無く、 他への影響を最小限に抑えつつ、 Picasa Web Albums を同期させる方法を考えてみた。

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 07:31
2011年6月2日

Android 端末上で透過型プロキシを動かしてみる 〜 VPN のように使えて、しかも省電力

透過型プロキシ (Transparent Proxy) というのは、 ブラウザから 「見えない」 プロキシのこと。 ブラウザ自身は WWW サーバにアクセスしているつもりなのに、 ブラウザが送信したリクエストをプロキシが横取りし、 プロキシから出し直す。 サーバからのレスポンスは当然プロキシに返り、 プロキシがそれをブラウザに送信するのだけど、 パケットがブラウザに届くまでの間に送信元アドレスが書き換えられて、 サーバから直接レスポンスが届いたようにブラウザからは見える。

フツーの 「見える」 プロキシは、 ブラウザ等でプロキシ設定が必要であるのに対し、 透過型プロキシだと設定が不要。 だから一部の ISP (インターネット接続プロバイダ) などで、 フツーのプロキシの代りに使われていたりする (ユーザにプロキシ設定の方法を説明する必要がなくてサポートコストが削減できる)。 あるいは企業等で、 従業員が仕事と関係ない Web ページを閲覧していないか監視するために、 社内から社外へ接続するゲートウェイ等に透過型プロキシを設置して、 社外への http アクセスを記録していたりする (監視だけならパケットをダンプするだけでも用が足りるが、 アクセス先のサイト毎に細かな制御を行なおうとすると、 プロキシを使った方が楽)。

このように、 透過型プロキシはその存在を隠すために使われることが多いが、 ブラウザにプロキシ設定の機能が無い場合は、 透過型プロキシを使わざるを得ない。 例えば、 Android 端末で使われるブラウザの多くが、 なぜかプロキシ設定の機能を持っていない。 プロキシ経由でアクセスされると、 モバイル端末からのアクセスなのか、 フツーの PC からのアクセスなのか、 区別がつかなくなってしまうので、 あえてプロキシ設定できないようにしているのかも知れないが、 プロキシを使わないとアクセスできない場合は困ってしまう。

私の場合、 勤務先の LAN 内のサーバに社外からアクセスするとき、 社内アクセス専用のプロキシ (ここでは仮にホスト名を proxy.klab.org とする) を利用している。 例えば senri.gcd.org (自宅のサーバ、つまり社外) からこのプロキシをアクセスすると、 こんな感じ:

senri:~ $ openssl s_client -connect proxy.klab.org:443 -cert cert.pem -key key.pem -CApath /usr/ssl/certs -quiet
Enter pass phrase for key.pem:xxxxxxxx

depth=1 /C=US/O=Equifax/OU=Equifax Secure Certificate Authority
verify return:1
depth=0 /serialNumber=-cn4oMJtlqoqfQZaTat68U68dNVbM8iQ/C=JP/O=*.klab.org/OU=GT41256819/OU=See www.rapidssl.com/resources/cps (c)09/OU=Domain Control Validated - RapidSSL(R)/CN=*.klab.org
verify return:1
CONNECT irc.klab.org:6667 HTTP/1.1

HTTP/1.0 200 OK

:irc.klab.org NOTICE AUTH :*** Looking up your hostname...
:irc.klab.org NOTICE AUTH :*** Found your hostname

行末に 「」 がある行が入力行。 「」 は Enter キー押下。 秘密鍵 key.pem でクライアント認証を受けて proxy.klab.org に接続し、 CONNECT リクエストを送信することにより、 社内の任意のサーバ:ポートに接続できる。 上記の例では社内 IRC サーバである irc.klab.org:6667 に接続しているが、 もちろん社内の任意の WWW サーバにも接続できる。

説明を簡単にするため proxy.klab.org と書いたが、 実際には VPN Warp を使っている (だから proxy.klab.org というサーバは存在しない)。 VPN Warp も stone で接続することができるので、 以下の説明は VPN Warp の場合もほとんど同様に適用することができる。

プロキシというと、 ファイアウォールの内側から外部のインターネットをアクセスするために用いるものと思っている人が多いせいか、 外からファイアウォールの内側をアクセスするためのプロキシは、 特にリバースプロキシ (reverse proxy) と呼ばれることもある。

proxy.klab.org を透過型プロキシとして利用できれば、 社内の任意のサーバに透過的にアクセスできるようになる。 例えばこんな感じ:

senri:~ $ adb shell
$ getprop ro.build.description
soju-user 2.3.4 GRJ22 121341 release-keys
$ su
# busybox traceroute irc.klab.org
traceroute to irc.klab.org (10.10.0.18), 30 hops max, 38 byte packets
 1  110.158.20.29 (110.158.20.29)  701.203 ms  90.517 ms  85.570 ms
 2  *  *  *
 3  *  *  *
 4  110.158.18.138 (110.158.18.138)  79.540 ms !A  *  *
 5  *  *  *
 6  *  ^C
senri:~ $ adb shell
$ telnet irc.klab.org 6667
:irc.klab.org NOTICE AUTH :*** Looking up your hostname...
:irc.klab.org NOTICE AUTH :*** Found your hostname

soju-user 2.3.4 GRJ22」 つまり Android 2.3.4 な Nexus S で、 パケットが届かないはずの irc.klab.org (10.10.0.18) に対して、 telnet でアクセスできている。 telnet でアクセスできるということは、 もちろん任意の IRC アプリで irc.klab.org にアクセスできるということ。

VPN (Virtual Private Network) でも同じことができる! という声が聞こえてきそうだが、 VPN だと TCP でデータを送受信していないときも、 VPN セッションを張っているだけでいろんなパケット (例えば ARP) が行き交って、 そのたびに電波が飛んで電池を消耗するので、 あまりモバイル向きではないと思う。

あるいは、 ConnectBot などを使って ssh で port forward を行なう方法もあるが、 これまた ssh セッションを張りっぱなしだと電池消耗が心配だし、 かといって IRC を使う前に毎回 ssh 接続を行なうのはメンドクサイ。 また、 通信先/宛先ポートが増えるたび port foward 設定を追加するのもメンドクサイ。

その点、 透過型プロキシだと実際にパケットが飛ぶときのみ通信が行なわれるので、 電池消耗をあまり心配せずに TCP セッションを張りっぱなしにできる。 また、 LAN 内の通信先/宛先ポートが増えても設定変更は不要。 モバイルで LAN 内にアクセスする方法として最適だと思う (便利なのに普及していないのはナゼ?)。

(続きを読む...)
Filed under: Android,stone 開発日記 — hiroaki_sengoku @ 09:41
2011年5月18日

nook color を買って CyanogenMod 7 をインストールしてみた 〜 レンガ化リスクが無い PC のようなタブレット端末

ハワイ滞在中、 泊ったホテルのすぐ近くに米国最大の書店チェーン Barnes & Noble があった。 当然しばしば立ち寄ったが、 電子ブックリーダ nook のデモ機を店内の一番目立つ場所 (入口を入ってすぐのところ) に並べて説明員が張り付いていて、 いつ訪れても、 来店する人々に nook を勧めたり説明したりしていた。 昨年 (2010年4月) 訪れたときもこういう状態だったので、 もうかれこれ一年以上やっているのだと思うが、 今回は昨年と違って、 nook color がラインアップに加わっている。

電子ブックリーダというと、 初代 nook や Kindle や BORDERS (米国二番手の書店チェーン, 経営再建中) の kobo eReader など、 電子インク (E Ink) をディスプレイに用いた機種が思い浮かぶが、 nook color は普通の液晶ディスプレイ。 電子書籍を読むなら圧倒的に電子インクの方が適していると思うが、 あいにく日本では電子書籍の普及は今一つだし、 近い将来普及が進むかというとなかなか難しそう (そもそも普及に懸ける書店の意気込みがぜんぜん違う)。 だから (英語がニガテな私は) 電子インクなブックリーダにはあまり興味がなかった (自炊は大変そう)。 でも、 nook color は液晶ディスプレイなので Android タブレットとして使えそう。

店頭デモ機をいじってみると、 そのままでも WWW ブラウザで日本語表示できるし、 ちょっと検索してみるとハックもいろいろ進んでいる (Android 3.0 honeycomb も動く) ようだ。 しかも $249 と Android タブレットとしてみると格安。 同じく 7インチ液晶の Galaxy Tab (382g) よりは重いが、 9.7インチ液晶の iPad2 (601g, ずっしり重くて私には無理) よりは軽い 450g.

というわけでハワイ滞在最終日に衝動買い (^^;)。 ちょうど円高が進んでいる昨今でもあるし〜 (言い訳)。 説明員のお姉さんに、 コレちょうだいと言うと、 すぐカウンターの下から (そんなところに在庫を入れていたのか) 取り出してレジへ。 ハワイ州の Sales Tax 4.710% が加算されて $260.73 (約 21000円)。 そのままスーツケースに放り込んで帰国。

で、 まず root 化。 Auto-Nooter 3.0.0 を使うと、 root 権限の取得から各種ソフトウェアのインストールまで、 全自動でやってくれるらしい。 Auto-Nooter をダウンロードして、 micro SD カードに書込み、 nook color に挿入して USB ケーブルで PC とつなぐと、 勝手にブートして勝手に全部やってくれる。 なんて簡単な...

ところが!

(続きを読む...)
Filed under: Android,Hawaii — hiroaki_sengoku @ 07:43
2011年5月7日

米国 T-Mobile のプリペイド SIM カードで Nexus S を使ってみた

米国 AT&T のプリペイド SIM カードは、 $100 ぶんの度数を購入 (refill) すると、 1年間有効。 昨年訪米したときに $100 refill しておいた (さらに直前に Data Package 100MB を購入しておいた) ので今回の訪米では、 最初から (飛行機の外へ出た直後から) Nexus One で通信できた。

ところが今回は Nexus One の他に Nexus S も (ついでに言うと Galaxy S も) 持ってきている。 Nexus S は、 UMTS (W-CDMA) I/IV/VIII (2100MHz/AWS/900MHz) のみ対応で、 AT&T の UMTS II (1900MHz) は対応していない。 もちろん EDGE (Enhanced Data Rates for GSM Evolution) なら Nexus S でも対応しているが、 3G 対応スマートフォンで EDGE を使うのは悲しすぎる。 そこで AWS (Advanced Wireless Services, 上り1.7GHz 下り2.1GHz) を使う T-Mobile のプリペイド SIM カードを購入してみた。

いたるところにある AT&T ストア (ホノルル市で 7ヶ所) と比べると、 T-Mobile ストアはホノルル市に 2ヶ所しかないが、 うち一軒は幸いダウンタウンの比較的アクセスしやすい場所 1100 Alakea St にあるので、 T-Mobile store ハワイ唯一の公共交通機関 TheBus で行ってみた:

ちなみにホノルル市のもう一軒は Kahala にあるようだが、 (車無しでは) とてもアクセスしにくそう。 しかも Google Map で見ると、 「存在しないと報告されました」 などと書いてある。

ダウンタウンの T-Mobile ストアに入るなり、 スタッフが寄ってきたので Prepaid SIM を 「Pay As You Go」 プランで買いたい旨を伝えた。 ID (写真入りの身分証明書) を求められたので、 写真入りの Debit カードを提示したら、 住所を言う必要もなく、 携帯電話を見せる必要もなく、 すんなり購入できて、 しかも (頼んでないのに) Activation まで行なってくれた。

店内に椅子がなかったので、 店の外に出て石段 (上の写真の 「1100 ALAKEA」 と書いてあるブロック) に腰掛けて、 購入した SIM を Nexus S に入れてみた。 Nexus S から、 Nexus One の電話番号へかけたら、 無事 Nexus One の着信音が鳴った。 Activation はホテルに戻ってからゆっくりやろうと思っていただけに、 あっさり Nexus S が使用可能状態になってしまって拍子抜け。

(続きを読む...)
Filed under: Android,Hawaii,SIM — hiroaki_sengoku @ 17:57
2011年4月8日

Galaxy S を Android 2.2.1 へ更新したら、アプリが次々と異常終了するようになってしまった 〜 原因と復旧方法

Sorry! The app has stopped unexpectedly.

Galaxy S を Kies 経由 (SAMSUNG 公式の方法) で 2.2.1 (ビルド番号 FROYO.ZSJPK) へアップデートしたら、 ほとんど全てのアプリが起動直後に異常終了するという事態に陥ってしまった。

← のような 「Sorry!」 ダイアログが、 ブート中に次々と表示される。 これは jp.softbank.mb.mail つまり SoftBankメールが異常終了したことを知らせるダイアログだが、 これ以外にも Battery Graph, K-9 Mail, Dropbox, Calendar Pad, ROM Manager などなど、 ブート時に自動起動されるウィジェットやサービスなどが、 次々と異常終了して同様の 「Sorry!」 ダイアログで画面が埋め尽された。 「Force close」 ボタンを押してダイアログを閉じても、 後から後からダイアログが繰り返し現れる深刻な事態。

一体何が起ったのかと呆然としながら 「Force close」 を押し続けていると、 言語 (英語/中国語) を選択する画面が表示された。 これはセットアップウィザード (PhoneSetupWizard.apk) で、 普通は初回のみ起動されるアプリ。

なぜホーム画面が表示されないのかと思いつつ、 ウィザードにしたがって時刻などを設定していくと、 異常終了してウィザードが再起動してしまった。 つまり言語設定からやり直し。 これが繰り返される無限ループに陥り、 ホーム画面に移行できなくなってしまった。

いったい何が起ったのか?

検索したら Kies を使って 2.2.1 BOJS5 へアップデートしたら PhoneSetupWizard.apk の無限ループに陥った、 という同様の症例が見つかったが、 もし SAMSUNG 公式の方法で 2.2.1 へアップデートしたとき、 常にこのような問題が起きるのだとしたら、 もっと大騒ぎになるはず。 だから、 単にアップデートしただけで発症するのではなく、 なにか別に発症の条件があるのではないか?

RyanZA's OCLF 2.0 を使っていて、 きちんと OCLF (One Click Lag Fix) を無効化してから 2.2.1 へアップデートしたのに、 アプリが動かなくなったという症例も見つかった。 Galaxy S はアプリのデータ用のフラッシュメモリ (/data ディレクトリ) の書込み速度が遅く、 しばしばフリーズする (いわゆる 「プチフリ」) 問題があり、 多くの人が OCLF 等のツール (ext2 なイメージファイルを /data パーティションに作って loop device 経由で /data にマウントしてくれるツール。 ファイルシステムが rfs から ext2 になることによりプチフリが軽減される) を使っていると思われるし、 もちろん私も使っている。

私の場合、 まず OCLF を無効化 (ext2 上のデータを /data 以下へ書き戻して loop device をアンマウント) し、 Kies を使って 2.2.1 へアップデートを行なった。 次に OCLF を有効化し、 しばらくフツーに Galaxy S を使ってみて問題無いことを確認した後、 バックアップを取っておこうと ClockworkMod recovery へ再起動してバックアップを行なった (うっかり OCLF を有効化したままバックアップしてしまったので、 data.img が 1.6GB になってしまった ^^;)。

ここまでは全く正常。

フツーの Android だと recovery mode では (通常起動時とは別の) recovery mode 専用のブートイメージ (recovery image) が使用されるので、 この recovery image を書き換えてバックアップ機能を持たせたり、 カスタムROM を書込む機能を持たせたりできる。 ClockworkMod recoveryAmon RA recovery が有名。
ところが Galaxy S の場合は、 recovery mode でも通常起動と同じブートイメージが使用され、 /system/bin/recovery が実行される。 しかもこの recovery が、 バージョン <3e> 以降から (正規の) 署名付 update.zip でないと書込めず (つまりカスタムROM 等を書込めない) しかも書込んだときは強制的に初期化するようになった。
そこで 改変版 3e Recovery が作られた。 この改変版で /system/bin/recovery を置き換えると、 初期化せずに任意の update.zip を読み込むことができて、 かつ ROM Manager に含まれる recovery-update.zip を読み込むと、 Galaxy S でも ClockworkMod recovery が利用できる。

で、 バックアップが正常に終了したあと起動したら前述したような異常事態に陥った、 という顛末。
同様の異常事態に陥ったかたは、 何をしたらそうなったか教えて頂けると幸い。

この手のトラブルが起きたとき、 Web 上でよく見かける対処方法といえば 「初期化」 (wipe data / factory reset)。 そりゃ初期化すれば直ることが多い (より事態が悪化して再起不能になるケースも無いわけではないので、 手放しで推奨するわけにはいかない) が、 トラブルの原因が闇に葬られるので、 私としてはきちんと原因究明した上で (可能なら設定等も温存したまま) 直したい。

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 07:57
2011年3月24日

Nexus S を素のまま root 化する方法 〜 アンロック不要、リカバリROM書換も初期化も不要 (GRH78 まで)

遅ればせながら Nexus S を入手した。

もちろん、 真っ先に行なったのは root 権限の取得。 「正規に」 root 権限を取得できるのが、 Nexus S の唯一(?)の存在理由なのだから、 root を取らずにいじるというのは邪道だろう。 root を取らないのであれば Galaxy S などで充分。

Android 端末の root 権限を取得するには大別して次の二つの方法がある:

  1. ブートローダをアンロックしてリカバリを書換 (fastboot oem unlock)
  2. セキュリティホールを利用して root 権限を奪取 (RageAgainstTheCage)

1. の方法は Google 正規の方法。 開発目的で Android 端末をいじるときは root 権限を取得したほうが何かと便利なので、 Nexus One や Nexus S など開発者用の Android 端末は、 「仕様」 として root 権限を取得できるようになっている。

開発用でない端末の root を取れてしまうとセキュリティ上の脅威となる (他人の端末で勝手に root を取ってプライベートデータを盗み読むなど) ので、 端末上の全データを消去した上でないとアンロックできない。 なので、 root を取る前にアプリをインストールしたり、 設定を変更したりすると、 アンロックしたとき全て消えてしまって二度手間になる。 だから Nexus S を入手したら、 何よりも真っ先にアンロックすべき (← くどい)。

2. の方法は、 (root 権限で起動される) adbd が、 setuid(2) を使って root 権限を手放す (adbd は shell ユーザ権限で動く) ときに、 エラー (setuid の返値) チェックを行なっていない、 というバグ (セキュリティホール) を利用する。 具体的には RageAgainstTheCage exploit を利用して (再起動した) adbd が setuid を呼び出すときにリソース不足 (errno = EAGAIN) で失敗させ、 adbd が root 権限を手放さずにそのまま走るようにすることにより、 root 権限が利用できるようになる。

一般の (開発者用でない) 端末をいじり倒したい場合には便利な方法だが、 当然ながら悪用もできるわけで、 ユーザが意図しないところでアプリが勝手に root 権限を奪取してしまうと、 極めてやっかいなことになる。 実際そういうマルウェアも出回っているらしい。

Android Gingerbread 2.3.3 以降でこのバグが修正され、 RageAgainstTheCage では root 権限を奪取できないようになったのは当然と言える。 むしろ遅きに失したくらい。 これだけ有名かつ重大なセキュリティホールを今まで放置した Google は万死に値する。

というわけで、 Nexus S の箱を開封して真っ先にアンロックしようと FASTBOOT MODE にした (音量大ボタンを押しながら電源を入れる) のだが、 アンロックコマンド (fastboot oem unlock) が使えるなら、 もしかすると、 その他の fastboot コマンドも使えるのではないか? という思いがよぎり...

senri:~ $ fastboot boot recovery-clockwork-3.0.0.5-crespo.img
downloading 'boot.img'... OKAY
booting... OKAY

ありゃ (^^;)、 clockwork リカバリで起動してしまった。 リカバリイメージをフラッシュしていない点に注目。 フツーは、 アンロックした上でリカバリイメージを書込み、 リカバリモードで起動して root 化するのだが、 そうした手順をすっ飛ばして起動できてしまった。

ちなみに、 リカバリイメージを書込むにはアンロックが必要であるようだ:

senri:~ $ fastboot flash recovery recovery-clockwork-3.0.0.5-crespo.img 
sending 'recovery' (3980 KB)... OKAY
writing 'recovery'... FAILED (remote: Bootloader Locked - Use "fastboot oem unlock" to Unlock)
senri:~ $ 

フラッシュに書込みできなくても、 任意のカーネルを起動できたら何でもできるわけで、 ロックする意味がなくなってしまう。 実際、 root 権限があれば flash_image コマンドでリカバリイメージを書き込むことができた。 アンロック不要で 「fastboot boot」 コマンドが実行できてしまうのは、 バグなのではないか?

バグか仕様かはサテオキ、 現状の Nexus S は、 アンロックせず、 フラッシュへの書込みもせずに clockwork リカバリが起動できたので、 初期状態のフルバックアップが可能。 しかも、 clockwork リカバリは、 adbd が root 権限で動いている (これはバグではなく仕様) ので、 adb でアクセスすれば root になれる。

senri:~ $ adb shell
~ # 

う〜ん、簡単すぎ。 こんなことでいいのだろうかと思いつつ、 アンロックする手間が省けたので、 clockwork リカバリのメニューから 「mount /system」 を実行し、 su コマンドをインストール:

senri:~ $ adb push su-2.3.6.1-ef/system/bin/su /system/bin/
596 KB/s (26264 bytes in 0.042s)
senri:~ $ adb install su-2.3.6.1-ef/system/app/Superuser.apk
1825 KB/s (196521 bytes in 0.105s)
	pkg: /data/local/tmp/Superuser.apk
Success
senri:~ $ adb shell
~ # chmod 4711 /system/bin/su
~ # 

というわけで、 Nexus S を素のまま root 化できてしまった。 ブートイメージやリカバリイメージを変更する必要がないので、 文鎮化リスクが全く無い安全な root 化方法と言えるが、 逆に言うと端末に痕跡を全く残さずに root 権限を奪取できてしまうわけで、 いいんだか悪いんだか...

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 09:14
2011年1月17日

Huawei IDEOS U8150 の各国キャリア向けファームウェアの比較

華為 (华为, Huawei) の IDEOS U8150 は、 各国キャリア向けのファームウェアが公開されている。 華為終端 (华为终端, Huawei Device) の中文 (中国語) ページで 「U8150」 を検索すると、 香港數碼通 (数码通, SmarTone Vodafone) 向けファームウェアが、 Worldwide ページで 「U8150」 を検索すると、 Italy Vodafone 向けファームウェアが、 それぞれダウンロードできる。 また、 華為終端サイトの検索では見つけられなかったが、 米国 T-Mobile (Postpay) 向け (T-Mobile Comet) も華為終端サイトからダウンロードできる。 その他、 台湾などアジア各国向けやオーストラリア向けもダウンロードできるようだ

IDEOS U8150 の既知のファームウェアについてまとめてみる:

CBSPBasebandAMSS キャリア等ビルド日時 CST
127818052210B235 香港 數碼通2010-08-08 16:16:18
1978210322201003B238 台灣 遠傳2010-09-03 19:57:29
0082222201003B239 Singapore C2O Mobile2010-09-11 12:31:46
18282222201003B239 Pakistan CMPak2010-09-11 12:31:46
19182222201003B239 Australia2010-09-11 12:31:46
1268230122201003B239 USA T-Mobile2010-09-17 21:21:49
2038230122201003B239 Belarus Velcom2010-09-17 18:37:35
2038230122201003B239 Australia BP CJ2010-09-17 18:37:35
12682522201003B239 New Zealand 2degrees2010-09-26 17:15:43
12682622201003B254 Australia Virgin mobile2010-10-14 20:39:16
12682622201003B254SP01 Mexico Iusacell2010-10-14 20:39:16
12682722201003B254 Peru Movistar2010-10-21 20:53:39
12682722201003B254 BrightPoint2010-10-21 20:53:39
12682722201003B254 Philippine TCI2010-11-06 12:23:13
028270122201003B254 Italy Vodafone2010-10-19 22:28:32
1268270322201003B254 Italy Vodafone2010-11-20 12:39:21
12682822201003B254 Australia Vodafone2010-10-27 18:48:49
1268280122201003B256 Singapore M12010-10-27 18:48:49
2308280122201003B256 Pakistan Ufone2010-10-27 18:48:49
12682922201003B257 Normal2010-11-01 22:52:56
12682922201003B257 Cambodia Beeline2010-11-01 22:52:56
12682922201003B257 South Africa Vodacom2010-11-01 22:52:56
12682922201003B257 Finland Techdata2010-11-01 22:52:56
1268290222201003B257 Vietnam VHH2010-11-01 22:52:56
12683022201003B259 EMOBILE2010-11-24 21:19:04
1268300122201003B257 Norway Telenor2010-11-10 03:55:12
1268310222201003B257SP01 日本通信2010-11-25 16:54:11
1268310322201003B257SP01 日本通信2010-11-25 16:54:11
12683222201003B257 Cambodia CamGSM2010-11-23 18:38:55
1268320122201003B257 India Aircel2010-11-29 18:18:52
1268320222201003B257 India Tata DoCoMo2010-11-29 18:18:52
1268320422201003B257SP01 India Tata DoCoMo2010-11-29 18:18:52
12683322201003B257 Italy WIND2010-12-03 12:04:10
25383622201003B257 Germany2011-01-11 17:35:05
1678360322201003B266 Sudan Zain2011-01-28 12:00:11
12683622201003B257 Holand2011-02-14 12:33:39

ビルド番号は、 どのファームウェアも 「U8150V100R001」 で始まっているので、 その後に続く 「C〜B〜SP〜」 の数値のみ記した。 「USA T-Mobile」 は、 ファームウェアのファイル名では C85 なのだが、 実際に使ってみると U8150V100R001C126B823SP01 と表示されるので、 C126 と記した。 日本通信が販売している IDEOS も C126 だが、 T-Mobile Comet と何らかの共通点があるのだろうか?

「B〜」 の数値を昇順に並べてみると、 ファームウェアをビルドした日時 (ro.build.date) も昇順に並ぶことが分かる。 このことから、 「B〜」 はビルドした順に付けた番号と推測される。

「AMSS」 のバージョンは、 「*#*#2846579#*#*」 をダイヤルすると表示される 「テスト中」 メニューの 「ProjectMenu」 を選び、 その中の 「4.Veneer information query」 を選び、 その中の 「1.S/H version query」 を選ぶと表示される。 「テスト中」 とか 「Veneer」 (化粧張り) とか、 メニューの項目名がいかにもアレだが、 こうした詳細情報を表示する機能をつぶさずに出荷している点は好感が持てる。 日本のメーカとかだと、 こういう機能は全力でつぶしてくる。 力をかける場所を間違ってるんじゃ? と思いたくなるくらい。 わたし的には、 「*#*#4636#*#*」 や 「*#*#8255#*#*」 などの機能をつぶしている Android 端末は 「買ってはいけない」。

AMSS (Advanced Mobile Subscriber Software) というのは、 ベースバンドチップ上で動く基本ソフトウェア。

BREW は, 米QUALCOMM 社が 2001年 1月31日に発表した携帯電話向けダウンローダブルアプリケーションプラットフォームであり, ARM のアーキテクチャに基づいて作られた CPU をコアに持つ, 同社のベースバンドチップ MSM (Mobile Station Modem) シリーズに組み込まれた基本ソフトウェア AMSS (Advanced Mobile Station Software) 上で動作する.

AMSS のバージョンは、 どのファームウェアも 「M7x25V100R001C00」 で始まっているので、 その後に続く 「B〜」 のみ記した。 例えば Italy Vodafone 向けファームウェアの AMSS のバージョンは M7x25V100R001C00B254 なので 「B254」 と記した。

香港で IDEOS U8150-B を購入した香港數碼通向けファームウェア B818 (上表 B 欄の数値、以下同様) だったが、 このファームウェアだと日本の一部(?)のキャリアの SIM でデータ通信できないという問題がある (音声通話は可能)。 例えば、 ソフトバンクの銀SIM/黒SIM や、 WILLCOM CORE 3G の SIM では接続できなかった。

Italy Vodafone 向けファームウェア B827 を書込むと、 ソフトバンク SIM などでも 3G データ通信できるようになるが、 香港數碼通向け B818 と Italy Vodafone 向け B827 では何が違うのだろうと思ったので、 少し調べてみた。 ちなみに B818 だけでなく B822, B823 にも同様の問題がある。 つまり B823 までと B827 以降では何かが変わったようだ。

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 09:52
2011年1月6日

香港で Hutchison (3HK) SIM カードと Galaxy S (GT-I9000) を買ってみた

2009年の年末に香港に行ったときは、 Hutchison と CSL の SIM を比較して CSL を選んだが、 単に CSL の HK$1000 Prepaid SIM の有効期限が 2年だった (フツーは 6ヶ月) ことに魅力を感じたからで、 データ通信自体を比較したわけではなかった。 そこで今回は Hutchison Telecom Hong Kong (和記電訊, 3HK) の 3G Int'l Roaming Rechargeable SIM Card (3G 國際漫遊循環儲值咭) HK$98 (約1080円) を買うことにした。

3HK 3G Int'l Roaming Rechargeable SIM

今回の訪港は夜のフライトで、 しかも向かい風 (偏西風) が強くて到着が大幅に遅れ、 香港国際空港に着いたのは 23:00 過ぎ。 出発ロビーの 3Shop (3HK の店) も 1010 Centre (CSL の店) も既に閉ってる (正確に言えば到着ロビーに着いた時点で 23:30 だったので行くのを断念)。

ホテルへのバス (パックツアーなので空港⇔ホテルの送迎が含まれてる) の中で 24:00 を過ぎたので、 さっそく Nexus One (2009年の年末に購入した HK$1000 Prepaid SIM を入れてある) で 「179179」 にダイヤルして、 CSL の Mobile Broadband Service の 5-day pass を申し込む (HK$178, 約1960円)。

CSL の Mobile Broadband Service (データ通信サービス) は 24:00 が課金の区切りとなるので、 24:00 前に申し込んでしまうとそれが一日目とカウントされてしまう (例えば 23:00 に使い始めると、 1-day pass なのに 24:00 までの 1時間しか使えない恐れがあるが、 本当にそうなるのか恐くて実験できない ^^;)。 もっと早い時間に香港に着く場合だと、 最初の日に Mobile Broadband Service を申し込むべきか悩ましいことになる。
その点、 3HK SIM だと、 24:00 区切りなのは CSL と同じだが、 一日の上限 HK$28 (約310円) に達するまでは HK$2/MB の従量課金なので、 何時に着こうが迷わずデータ通信を開始することができる。
CSL の 1-day pass は HK$50 (約550円) なので 3HK の HK$28 が圧倒的に安く感じられるが、 5日間で考えると CSL の HK$178 に対し、 3HK は HK$28*5 = HK$140 と、 差が縮まる。

で、ホテルに着いて Nexus One を WiFi AP (ポータブル Wi-Fi アクセスポイント, Android 2.2 の標準機能) として使う。 ホテルの部屋でも無線LAN サービスが提供されているのだが、 一日の利用料が HK$100 (約1100円) とバカ高いので、 滞在中はずっと Nexus One をアクセスポイント代わりに使った。 ノートPC 2台 (前回前々回、香港で購入した NetBook) と Android 端末 2台 (今回購入した Galaxy S と IDEOS U8150-B) でこの 「WiFi AP」 を利用したが、 常に安定して利用できた。 しかも日中は (当然だが) スマートフォンとして使えるわけで、 これならモバイル WiFi ルータ専用機なんて要らない。

翌日、 旺角へ行って適当に歩いていて見つけた 3Shop (亞皆老街40-46號) で
3G Int'l Roaming Rechargeable SIM Card (3G 國際漫遊循環儲値咭) HK$98 を買う。
そして、 そこからほど近い電器店、 百老滙 Broadway (西洋菜南街78號) で Galaxy S (i9000) を買った。

(続きを読む...)
Filed under: Android,SIM,香港 — hiroaki_sengoku @ 09:36
2010年12月31日

香港の深水埗で華為 IDEOS U8150-B (EMOBILE S31HW) を買ってみた

年末に香港へ行って電脳街を巡るのが毎年の恒例行事になってきた。 香港の電脳街は、 すでに秋葉原を追い越した感じがする。 近頃の秋葉は面白いモノをあまり見かけなくなり、 たまに見かけても、 大抵は香港などで流行ってるモノを単に持ち込んだだけで、 しかも値段は香港の倍以上だったりする。 デフレと言われて久しい日本だが、 PC にしろケータイにしろ値段が高すぎる。 これから発展していくアジアと、 これから衰退していくだけの日本ということなのか。

いつものように深水埗の高登電腦中心を巡回していたら、 大一(香港)有限公司IDEOS U8150-B を HK$1380 で売っているのを見つけた。 U8150-B といえば来年1月中旬にイー・モバイルから発売される予定の Pocket WiFi S (S31HW) の同型機。 ただし、 ファーウェイによれば、 グローバル展開されている 「IDEOS」 と日本向け S31HW は別の製品、 ということらしい。 なぜ日本は 「グローバル展開」 の対象ではないのだろう?

「Pocket WiFi S」は、 音声通話機能とAndroid™ 2.2を搭載したWi-Fiルーターです。 Android™ 2.2搭載端末としては国内最安※1となる端末価格19,800円(税込)での提供と、 国内最軽量※2の重さ約105gサイズを実現しました。

「国内最安」 「国内最軽量」 つまり世界基準では安くもなければ軽くもないということ。 本来 Android は 2.2 froyo 以降からデフォルトで 「ポータブルWi-Fiアクセスポイント」 として使えるのに、 わざわざ 「Wi-Fiルーター」 と呼んでいるあたりにも、 いかに日本が世界標準からずれてきてしまっているかを感じる。

とはいえ、 日本では 19,800円でしか買えない端末が HK$1380 (約 14,500円) で買えるのなら悪くない。 思わず衝動買いしてしまった。 画面が QVGA (2.8" 320x240) だったり、 内蔵カメラが貧弱 (一応 320万画素なのだが...) だったり、 CPU が MSM7225 528MHz だったりと、 Android 端末としては見劣りするものの W-CDMA I/II/V/IX (2100/1900/850/1700MHz) に対応したスマートフォンが 15,000円弱で買えるとなると、 一気に普及が進むヨカン。 ちょうど 2年前、 ここ香港で 4バンド GSM 機を HK$899 (約 10,000円) で買ったのが遠い昔のことのようだ。

中華 Android 端末なんて 「安かろう悪かろう」 だろうなどと思ってはいけない。 カスタマイズしすぎて Android とは別物になりつつある国産スマートフォンより、 よほど素直で使いやすい (そして圧倒的に安い)。 買った当初は値段相応の期待しか持っていなくて、 メイン端末が壊れたときなどの非常用端末くらいの感覚だったのだが、 高解像度の画面 (およびマルチタッチ) を必要としないアプリのほとんどがそのまま動いてしまった。 これなら非常用としてだけでなく、 大きな端末を持ち歩きたくない時とかにも使えそう。 Android 2.2 へアップデートできない一部の国産 Android 端末だと、 動かないアプリが沢山でてきてしまう。

ただし、 多くのアプリ開発者が QVGA などという尋常でない低解像度を想定していないためか、 Android マーケットでダウンロードできないアプリが少なからずある。 そういうアプリも別の Android 端末でダウンロードして得た apk ファイルを、 「adb install」 コマンドなどで IDEOS へインストールしてみると、 ほとんどが特に問題無く使えるようだ。

購入時のファームウェアは、

Androidバージョン2.2
ベースバンドバージョン2210
カーネルバージョン2.6.32.9-perf
huawei@product #1
ビルド番号U8150V100R001C127B818SP05

だったが、 この 「ビルド番号」 だと、 日本の一部(?)のキャリアの SIM でデータ通信できないという問題がある (音声通話は可能)。 例えば、 ドコモの SIM で mopera U を使う場合は 3G 通信可能だが、 ソフトバンクの銀SIM/黒SIM や、 WILLCOM CORE 3G の SIM では接続できなかった。

Huawei のページで U8150 のファームウェアを検索してみると、

ProductSoftware NameRelease Date
U8150U8150 V100R001C02B82 7SP02(Italy Vodafone ) 2010-12-15

が見つかった。 Italy Vodafone と書いてあるあたりが気になるが、 google で検索してみると、 このファームウェアを書込んだら 3G 通信できるようになった、 という旨のページを見つけた:

huaweidevice.comのサイトから、 「U8150 V100R001C02B82 7SP02(Italy Vodafone ) Host Software」 をダウンロードして解凍し、 出てきたファイルをmicroSDにコピーして、 ボリューム上と終話ボタンを押しながら電源を入れればファームアップが始まります。 一度目最後に失敗したら一度電池を抜いてもう一度同じ操作をすれば、ファームアップが正常に完了です。
ファームアップ後は、 まっさらに初期化されるため、 最初から設定しなおしです。 とはいえ、Andorid2.2とマーケットアプリのおかげで、 Googleアカウントを入れれば、 アプリも全部自動で勝手にマーケットからダウンロードして復活してくれるので楽です。 ファームアップ後のrooted も可能です。

さらに、 元のファームウェア V100R001C127B818SP05 も Huawei サイトからダウンロードできるようなので、 最悪の事態になっても元に戻せるだろうと思い、 上記ファームウェアを IDEOS に書込んでみた。 ファームウェアに同梱されている 「U8150 Software Upgrade Guideline」 に書込み方法の説明がある (英語版とイタリア語版の説明書が同梱)。

こばこのひみつ」 に書かれている通り、 書き込みの最後で 「失敗」 するのだが、 いったん電池を抜いて再起動すると正常に起動した。 また RageAgainstTheCage exploit を利用して root 権限を再取得できた。

更新後のバージョンは以下の通り:

Androidバージョン2.2
ベースバンドバージョン22201003
カーネルバージョン2.6.32.9-perf
huawei@product #1
ビルド番号U8150V100R001C02B827SP01

ダウンロードしたファームウェアのファイル名は末尾が 「...7SP02」 だったのに、 ビルド番号が 「...7SP01」 なのが気になるが、 ソフトバンクの銀SIM や WILLCOM CORE 3G SIM で試してみたところ、 正常に 3G 通信できている。

Filed under: Android,香港 — hiroaki_sengoku @ 01:11
2010年12月4日

Android 端末 IS01 のカーネルを入れ替えてみた 〜 さよならデッカード LSM

先週末 IS01 で root 権限が必要なアプリが使えるようになったばかりなのに、 そのわずか 4日後、 スマートフォン@2ch掲示板に以下の書き込みがあり、 カーネル空間への侵入口が明らかにされてしまった。 一番乗りを果たした goroh_kun さんに敬意を表しつつも、 IS01 のプロテクトがこの程度だったことが残念でもある。 「root を取られても大丈夫な作りになっている」 と開発者が豪語し、 しかも IS01 の発売から 5ヶ月間も破られなかったのだから、 さぞかし鉄壁の守りなのだろうと思っていたのに、 こんな分かりやすい穴があったとわ... (負け惜しみ ^^;)。

【ROM焼き】au IS01 root2 〜わたくし達も未来へ〜

...

317 :goroh_kun:2010/12/01(水) 03:14:21 ID:LGLTLBmZ

自動起動仕込むところを大体見つけました。
どなたか協力お願いします。

/data/の直下にlocal.propを置く
ここで、内容をoverrideできます。
サービス起動時のおダイナミックライブラリがある
サービスプログラムを探す。

getpropしてみると、

rild.libpathが/system/lib/libril-qc-1.soといかにも起動時に使っていそう。
rildaemonから使われているプラグインと思われます。

そこで、
local.propの中身を
rild.libpath=/data/lib/libril-wrapper.so
rild.wrapper.cmd=/data/rootkit.boot.sh
rild.libpath2=/system/lib/libril-qc-1.so

で、このプラグインを/data配下から読み出されるようにして、
libril-wrapper.soにて、ダイナミックロード時に
自動実行したいプログラムを指定できるようにします。
で、自動実行したいプログラムをlibril-wrapper.soで実行後
本来のrild用のプラグインをロードして、rildに引き渡すようにします。

これでいけるのではないかと思っているのですが、やるよって方は
いらっしゃいますか?

rild.libpath プロパティは、 RIL (Radio Interface Layer) デーモン rild が参照している。 rild は rild.libpath の値をダイナミックライブラリのパス名として dlopen(3) に渡し、 dlsym(3) でライブラリ内の関数 RIL_Init 呼び出す。 つまり、 rild が起動される前に rild.libpath の値を書き換えておけば、 rild に任意のプログラムを起動時に実行させることが可能になる。

したがって守る側 (つまり開発者の立場) から考えると、 (1) rild.libpath が書き換えられないようにするか (2) 任意のプログラムの実行が脅威にならないよう、 rild 起動前に防御を固めてしまえばよい。

プロパティは、 以下の 4 つのファイルで設定できる。 どれか一つでも改変可能であれば、 (1) の方法は使えない。

  • /default.prop
  • /system/build.prop
  • /system/default.prop
  • /data/local.prop

IS01 の場合、 (たとえ root が奪取されても) /system ディレクトリ下は改変できないようになっている。 また、 /default.prop は initramfs 内のファイルなので、 改変しても再起動すれば揮発してしまう。 だから上記 4ファイルのうち /data/local.prop 以外は改変不可能。

Android では /system ディレクトリ下は read only でも構わないが、 /data ディレクトリ下は Android 動作中に書き換えることが前提となっている。 もちろん /data/local.prop だけは書き換え不可能にするとか、 あるいは再起動時に自動的に /data/local.prop を書き戻す、 という方法も考えられなくもないが、 そもそも論で言えば /data/local.prop は、 システムのプロパティをオーバーライドするための設定ファイルであって、 その本来の趣旨からいえば書き換え不可能にすることは望ましくない。

したがって守るなら (2) の方法が自然。 というか、 /data/local.prop で rild.libpath の値を変更されても、 rild はユーザ空間で動くデーモンなのだから、 本来は 「任意のプログラムの実行」 が可能でも脅威にはならないはず。

ところが IS01 の開発チームは致命的なミスを犯した。

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 12:59
2010年11月27日

月額8円で運用できる Android 端末 IS01 で、root 権限が必要なアプリを使えるようにしてみた

Android 搭載スマートブック IS01 by SHARP (愛称 「メガネケース」) が、 本体価格 0円 + 契約事務手数料 2835円 + 月々 8円 * 2年しばり = 3027円 で入手できるとネット上で話題になっていたので買ってみた。 メジャーアップデート対応なしと公式に宣告されてしまった IS01 ではあるが、 「ワンセグ放送が視聴できて WiFi 通信もできるポメラもどき」 と割りきったとしても激安なので 「ふたつでじゅうぶんですよ」 と言われつつ 3つ入手した。

「グローバル展開もしていないから xda の助けも得られない」 と総統閣下に嘆かれつつも、 RageAgainstTheCage exploit を利用すれば root になることは一応できる (ベースバンドバージョン / ビルド番号 01.00.07 で確認):

senri:/home/sengoku % adb push rageagainstthecage /data/local/tmp/
senri:/home/sengoku % adb shell
$ cd /data/local/tmp
$ chmod 755 rageagainstthecage
$ ./rageagainstthecage
[*] CVE-2010-EASY Android local root exploit (C) 2010 by 743C

[*] checking NPROC limit ...
[+] RLIMIT_NPROC={1856, 1856}
[*] Searching for adb ...
[+] Found adb as PID 8223
[*] Spawning children. Dont type anything and wait for reset!
[*]
[*] If you like what we are doing you can send us PayPal money to
[*] 7-4-3-C@web.de so we can compensate time, effort and HW costs.
[*] If you are a company and feel like you profit from our work,
[*] we also accept donations > 1000 USD!
[*]
[*] adb connection will be reset. restart adb server on desktop and re-login.
$ 
senri:/home/sengoku % adb shell
# 

ただし rageagainstthecage はタイミングが良くないと失敗するので、 少なくとも数回は繰り返し実行しないと root が取れない (運が悪いと何度実行しても成功しない上に adb で接続できなくなって再起動する羽目に陥ることも)。 IS01 を再起動するたびに rageagainstthecage を実行して root を取り直すのは著しく手間なので、 root が取れたら su コマンドをインストールしておくべき。

インストール先は、 一般ユーザ (shell 権限) でアクセス可能で、 かつ再起動しても消えない (つまり tmpfs とかでない) ボリュームで、 かつ mount 時に nosuid オプションをつけられていないことが必須条件になるが、 幸い IS01 ではフラッシュメモリ /dev/block/mtdblock7 が /sqlite_journals に nosuid 無しで mount されている:

senri:/home/sengoku % adb shell
$ grep -v '\(tmpfs\|nosuid\)' /proc/mounts
rootfs / rootfs ro 0 0
devpts /dev/pts devpts rw,mode=600 0 0
proc /proc proc rw 0 0
sysfs /sys sysfs rw 0 0
/dev/block/mtdblock7 /sqlite_journals yaffs2 rw 0 0
/dev/block/mtdblock5 /system yaffs2 ro 0 0
$ ls -l /sqlite_journals
drwxrwx--x system   system            1980-01-06 09:00 com.android.providers.settings
drwxrwx--x system   system            1980-01-06 09:00 com.android.providers.settingsex
drw-rw-rw- root     root              2010-11-26 18:51 lost+found

sqlite_journals というディレクトリ名からして SQLite 用のディレクトリと思われるが、 それならなぜ nosuid がつけられていないのだろうか? ガチガチに防御を固めているはずの IS01 にしては珍しい抜け穴の一つ。

ちなみに上記のように /dev/block/mtdblock5 も /system ディレクトリに nosuid オプション無しでマウントされているが、 こちらはカーネルの MTD ドライバで書き込みが禁止されている (SHARP が公開している IS01 のカーネル kernel/drivers/mtd/devices/msm_nand.c 参照) ので、 簡単には変更できそうにない (少なくとも rw で remount するだけでは書込めない)。

というわけで /sqlite_journals に bin ディレクトリを作って ChainsDD の su コマンド (android_system_extras に含まれる) を置いてみる。

# ls -l /sqlite_journals/bin/su
-rwsr-sr-x    1 root     root         26256 Aug 17 17:27 /sqlite_journals/bin/su

ところが!

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 15:46
2010年11月13日

iモード.net と imoten を使って iモードメールを自動送信する 〜 SubEtha SMTP のバグ

iモードメールを Android 端末で送受信するには、 sp モードiモード.net を利用する。 前者は sp モード専用の APN (Access Point Name) spmode.ne.jp に接続しないと利用できない (つまり無線LAN 経由では使えない) 上に、 ドコモが IMEI (International Mobile Equipment Identity, 端末識別番号) をチェックしていて、 契約端末でないとこの APN に接続できない (らしい)。 なので私は後者を利用している。

iモード.net は、 PC から iモードメールを読み書きできる Webメールサービス (月額210円)。 PC の代りに Android 端末上のアプリ (iMoNi が有名) からアクセスすれば、 Android 端末で iモードメールを読み書きできる。 あるいは iモード.net からメールを読み取って別のメールアドレス (例えば Gmail) へ転送するプログラムを (どこかのサーバで) 動かしておけば、 iモードメールを Android 端末で普通のメールとして受信できる。

前者の方法は、 メールの新着をどうやって知るか、 という問題がある。 Android 端末上のアプリが定期的に iモード.net にアクセスして新着をチェックすることになるが、 電池の消耗を考えればせいぜい 15分に一度チェックするのが限界で、 それ以上の頻度でチェックするのは現実的ではない。 つまり最大 15分間は新着を知るのが遅れる。 iMoNi にはドコモから送られてくる WAP PUSH を検知してメールをチェックしにいく機能もあるが、 3G 接続中は (なぜか) WAP PUSH を受け取れないらしい。

それに対し後者の方法は、 転送プログラムは Android 端末上で動くわけではないので、 電池のことを心配せずに iモード.net を頻繁にチェックできる。 iモード.net で取得したメールを Gmail へ転送するようにすれば、 Android 端末は Gmail の着信をリアルタイムで知ることができる。

前者の方法は Android 端末だけで iモードメールを読み書きできるのに対し、 後者の方法は転送プログラムを動かすサーバ (24時間稼働が望ましい) が必要になるので万人向けではないが、 そういったサーバを確保できるのなら、 iモードメールを普通のメールと同様に扱える後者の方法が圧倒的に便利。

というわけで、 私は imoten (imode.netのメールをSMTPで転送するプログラム) を使っている (まだ使い始めて 2日だが)。 1分も遅れずに Android 端末で着信を知ることができるので、 とても便利。

imoten には iモードメールを送信する機能もある。 すなわち imoten が SMTP サーバとして振る舞い、 受け取ったメールを iモード.net へ転送する。

ということはつまり Android 端末から iモードメールを送ることができるのはもちろん、 PC 上のメーラや任意のメール配信プログラムから iモードメールが送ることが可能。 試しにテストプログラムを書いてみた:

#!/usr/bin/perl
use strict;
use warnings;
use Net::SMTP;

my $smtp = Net::SMTP->new('senri.gcd.org', Port => 42525, Debug => 1);
$smtp->auth('imoten', 'xxxxxxxx');
$smtp->mail('sengoku');
$smtp->to('sengoku@gcd.org');
$smtp->data();
$smtp->datasend("To: sengoku\@gcd.org\n");
$smtp->datasend("\n");
$smtp->datasend("A test message\n");
$smtp->dataend();

imoten を動かしているサーバ senri.gcd.org の 42525 番ポートに SMTP 接続してメールを送信するプログラム。 imoten は SMTP PLAIN 認証をサポートしているので、
「$smtp->auth('imoten', 'xxxxxxxx');」 で、
ユーザ 「imoten」、 パスワード 「xxxxxxxx」 (伏字) を指定している。

ところが!

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 08:19
2010年10月25日

Android 端末 (Nexus One) でアプリを SDカードの ext3 パーティションにインストールする (Apps 2 SD)

新しい Android 端末が次から次へと発表される今日このごろ、 1月6日に発表された Nexus One は (まだ一年たっていないのに) 旧型機といった感じになりつつある。 特に端末内部メモリ容量が 200MB しかないのは致命的。 正確に言えば内蔵フラッシュメモリは 512MB だが、 システム側で 300MB ほど使うので、 ユーザが自由に使えるのは残り 200MB 程度となる (もちろんそれとは別に SD カードが使える)。

いまどき 200MB というのはいかにも少ない。 例えば私が Nexus One で使ってるアプリのうち、 サイズの大きいものを一部ピックアップしてみると、

アプリappdata合計
Google Earth20.32MB0.24MB20.56MB
Twitter2.70MB14.57MB17.27MB
Skype10.68MB3.40MB14.08MB
OpenWnn Flick対応版7.68MB4.78MB12.46MB
Adobe Flash Player12.40MB0.00MB12.40MB
Google Map8.09MB1.44MB9.52MB
Graffiti5.14MB0.84MB5.22MB
K-9 Mail2.67MB1.07MB3.74MB

わずか 8個のアプリだけで 100MB 近く使っている。 200MB に収めようと思えば、 インストールするアプリを相当厳選する必要がある (100個程度で限界)。

さすがにこれでは使い物にならないということで、 アプリを SDカード上にインストールできるようにする仕掛け Apps 2 SD (A2SD) が提案されてきた。 A2SD には App2sd など、 いろんな実装があるが、 基本的には SDカードに ext3 (あるいは ext4) パーティションを切り、 /system/ext あたりにマウントして (実はこれが難しい, 後述)、 /data/app などからシンボリックリンクを張る。

つまり、こんな感じ:

# cat /proc/mounts
	...
/dev/block/mtdblock3 /system yaffs2 ro,relatime 0 0
/dev/block/mtdblock5 /data yaffs2 rw,nosuid,nodev,relatime 0 0
	...
/dev/block/mmcblk0p2 /system/ext ext3 rw,nosuid,nodev,relatime,errors=continue,data=writeback 0 0
/dev/block/vold/179:1 /mnt/sdcard vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
/dev/block/vold/179:1 /mnt/secure/asec vfat rw,dirsync,nosuid,nodev,noexec,relatime,uid=1000,gid=1015,fmask=0702,dmask=0702,allow_utime=0020,codepage=cp437,iocharset=iso8859-1,shortname=mixed,utf8,errors=remount-ro 0 0
	...
# cd /data
# ls -l
drwxrwxr-x    1 system   system        2048 Oct 23 19:33 anr
lrwxrwxrwx    1 root     root            15 Oct 23 20:45 app -> /system/ext/app
lrwxrwxrwx    1 root     root            23 Oct 23 20:46 app-private -> /system/ext/app-private
lrwxrwxrwx    1 root     root            18 Oct 23 20:47 backup -> /system/ext/backup
lrwxrwxrwx    1 root     root            24 Oct 24 11:23 dalvik-cache -> /system/ext/dalvik-cache
drwxrwx--x    1 system   system        2048 Oct 24 11:59 data
drwxr-x---    1 root     log           2048 May 13 08:47 dontpanic
lrwxrwxrwx    1 root     root            17 Oct 23 20:02 local -> /system/ext/local
drwxrwx---    1 root     root          2048 May 13 08:47 lost+found
drwxrwx--t    1 system   misc          2048 Oct 24 14:02 misc
drwx------    1 root     root          2048 Oct 23 19:33 property
drwxrwxr-x    1 system   system        2048 Oct 24 14:20 system
lrwxrwxrwx    1 root     root            22 Oct 23 21:11 tombstones -> /system/ext/tombstones

アプリを Android 端末にインストールすると、 パッケージファイル (*.apk) が /data/app ディレクトリに格納 (「コピー防止」 アプリは /data/app-private ディレクトリに格納) され、 クラスファイル (classes.dex) が /data/dalvik-cache ディレクトリに格納される。 上記のように /data/app および /data/dalvik-cache はそれぞれ /system/ext/app および /system/ext/dalvik-cache へのシンボリックリンクにしてあるので、 内蔵フラッシュメモリ (/data パーティション) の代わりに SDカード (/system/ext パーティション) へ格納される、という仕掛け。

/data/data ディレクトリにはアプリが使用するデータが格納される。 /data/app および /data/dalvik-cache が、 アプリのインストール/アンインストール時のみ書き込みが行なわれるのに対し、 /data/data はアプリ動作中も読み書きが行なわれるわけで、 /data/data を SDカードへ移すとアプリの実行速度が低下したり、 あるいは頻繁な書込みによって SDカードの寿命が短くなったりする恐れがある。 もし /data/data も SD カード上に置こうとするなら、 使っている SDカードが充分高速 (Class6 以上?) で、 かつウェアレベリング (wear leveling) をサポートしているか確認したほうが無難。

私は /data/data は /system/ext へのシンボリックリンクを張らずに /data パーティションをそのまま使用している。 現時点での各パーティションの空き容量は次のような感じ:

# df
/dev:               197552K total,       0K used,  197552K available (block size 4096)
/mnt/asec:          197552K total,       0K used,  197552K available (block size 4096)
/system:            148480K total,  127580K used,   20900K available (block size 4096)
/data:              200960K total,  102148K used,   98812K available (block size 4096)
/cache:              97280K total,    9128K used,   88152K available (block size 4096)
/system/ext:       3690832K total,  269908K used, 3420924K available (block size 4096)
/mnt/sdcard:      11547432K total, 6808720K used, 4738712K available (block size 8192)
/mnt/secure/asec: 11547432K total, 6808720K used, 4738712K available (block size 8192)

私が使ってる SD カードは 16GB Class6 だが、 /data パーティションはまだ 99MB の空きがあるので /data/data を無理に /system/ext へ移動させることもないと判断した次第。

なお、Android 2.2 froyo から OS 標準で、 アプリを SD カードへ移動できるようになった。 しかし対応アプリでないと移動できないし、 現時点では多くのアプリが対応していない。 さらに 「USBストレージをON にする」 と SD カードへ移動したアプリは USB ストレージが ON の間は使えなくなるので注意が必要。

というわけで、 アプリを SDカード上にインストールできるようにするのは、 シンボリックリンクを /data から /system/ext へ張るだけのことなので全く難しくない。 しかしながら、 どうやって SDカード上の ext3 パーティションをマウントするか、 という問題がまだ残っている。

(続きを読む...)
Filed under: Android — hiroaki_sengoku @ 09:56
Older Posts »