攻撃は最大の防御なり

50代おやじの適当なブログです。

[Android] adbの使い方 その2

2011-09-28 15:11:23 | Android
今回はadbを使って通常起動状態の端末にリソースを突っ込む方法を解説します。
まずは端末の状態を確認します。「adb shell」で端末に入りましょう。
ここでカーソルが「$」の人と「#」の人が居ると思います。
以前にも書きましたが「$」は一般ユーザー「#」はrootユーザーでしたね。
機種にもよりますが何も弄っていない状態だと「$」だと思います。
root端末の場合はここで「su」と入力するとrootに切り替わります。

この挙動の違いは/default.propに記載されているro.secureの値によって決まります。
0の場合はrootでログイン。1の場合は一般ユーザーでログイン。
どちらも出来る事は変りませんが一般ユーザーの場合は若干面倒臭いかな?といったレベルですね。
これを変更するにはdefault.propの値を書き換えてしまえば良いのですが
以前話したinit.rcと同じでこのファイルはboot.imgに入っていて書き換えられないようになっています。
この変更を施したboot.imgを「unsecureなboot.img」と呼びます。

前置きはこの位にして本題に入ります。
端末にリソースを突っ込むには前回書いた「adb push」を使うのですが
/system以下は書き換えが出来ないように読み取り専用でmountされています。
先ずは/systemを一度umountして読み書き可能な状態で再mountしてやる必要があります。
上記のunsecureな状態になっている人は「exit」で一度shellを抜けて

adb remount

を実行するだけでOKです。
それ以外の人で例えばHTC Sensationの場合は

mount -o rw,remount /dev/block/mmcblk0p22 /system

と入力します。
この例の「/dev/block/mmcblk0p22」はsystemに割り当てられた、NANDパーティションのデバイス名です。
これは機種毎に違います。
「mount」と入力すると各領域に割り当てられたデバイス名が表示されるので置き換えて下さい。



これで「adb push」を使えば突っ込める状態になりましたが、あと一点気をつけたい所があります。
「adb shell」上で「df」を実行します。



これはパーティション毎の空き容量です。
以前話ましたがAndroidは同一ディレクトリーツリー上に複数のデバイスが割り当てられているんでしたよね。
これを見れば一目瞭然。この場合system以下は120128Kの空き容量があるということになります。
systemにサイズのでかいファイルを突っ込もうとすると途中でディスクフルになる場合があり
端末上には壊れたファイルが残ります。
端末が起動しなくなった場合はこの辺りも疑ってみてください。

pushを使って物を突っ込む場合はshellから抜けてこう入力します。
shellを抜けるには「exit」若しくは、ちょっと荒っぽいですがctrl-Cですよ。

adb push a.txt /system/

この場合はa.txtをsystem直下に突っ込みます。

adb push [入れたいリソース] [入れる場所]

と言う構文ですね。
これはあくまで一例でFontの入れ方の方で詳しく書きます。

次回はリカバリー状態の端末にリソースを突っ込む方法についてです。

最新の画像もっと見る

3 コメント

コメント日が  古い順  |   新しい順
Unknown (Unknown)
2011-10-24 11:14:12
一つ分らないのですが下記の通り、#でマウント後shellから抜け/system/へ書き込みを行うと権限が無いと怒られます。

C:\Users\***>adb shell
$ su
su
# mount -o rw,remount /dev/block/mtdblock4 /system
mount -o rw,remount /dev/block/mtdblock4 /system
# ^C
C:\Users\***>adb push a.txt /system/
failed to copy 'a.txt' to '/system//a.txt': Permission denied

私が考えた解決策は以前のroot化で下記コマンド打ちました。

adb shell
su
echo 'ro.kernel.qemu=1' > /data/local.prop

このようにすればshellを抜けてadb push a.txt /system/は通ります。

これ以外に方法はあるのでしょうか?
Unknown (アレ)
2011-10-24 17:12:24
普段secureな状態で使っていないんで、いい加減な事を書いてすみません。

ご指摘の通りsecureな状態ではadb pushが行えないようです。
adb のソースを見る限りro.secure=0の場合には
ro.kernel.qemu=1を設定する以外に方法は無いようですね。
一つ勉強になりました。ありがとうございます。

しかし、ro.kernel.qemuを設定している状態では
一部システムUIが不安定になるようで
作業後はlocal.propを削除して再起動が必要になるようです。

常用ではやはりro.secure=0に修正したboot.imgを使用したほうが良さそうですね。
Unknown (Unknown)
2011-10-24 19:55:24
ぃぇぃぇ…いい加減だなんて飛んでもないです。
述べられている情報を拝見してかなり知識の底上げができました。

そこなんですよね!!
EVO WiMAX(笑)の付属SMT-i9100でlocal.propを置き去りにすると音とGPSが機能しなくなります。

ro.secure=0とかro.kernel.qemuとかは何のことかサッパリです(笑)
root化でリブート後でもその状態を記憶するコマンドと認識しており、たまたま
adb shell
su
echo 'ro.kernel.qemu=1' > /data/local.prop
をしたらshell抜けてadbでpushできた次第であります。

ro.secure=0この辺りを少し調査してきます。
回答ありがとうございました。

コメントを投稿