goo blog サービス終了のお知らせ 

攻撃は最大の防御なり

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

[Android] busyboxをインストする その2

2011-09-01 08:40:57 | Android
前回はbusyboxのインストをしました。一人で何役もこなす賢い奴でしたね。
でも、Androidには既に似たような機能が入っています。toolboxです。

toolboxは/system/bin/に入っていて
busyboxと同じように一つのプログラムで何役もこなします。
でも、Androidの発売元からしたら端末の中身は余り弄くり回して欲しくないはずですよね。
なのでtoolboxは必要最小限の機能しか有していません。

ここでちょっとした問題を出します。
インストしたbusyboxにはmvというコマンドが含まれていました。



でも、toolboxにもmvコマンドは含まれていたんです。
じゃあどちらが使われるんでしょうか?



答えは「これだけの情報では判らない」ですねw
でも、きちんと優先順位はあります。その場の気分で変わったら困りますからね。
順序性は環境変数PATHで決まります。windowsのシステムで設定してやるあれと同じです。



OSはこの変数に設定された順序でプログラムを探していきます。
ここでは/system/binが/system/xbinより先に定義されていますよね。と言うことはtoolboxのmvが使われる事になります。
busyboxのmvが使いたい場合は/system/bin/mvを消すか、こうやってフルパスで呼ばないといけません。



ほら、同じmvでも応答が違うでしょ。こうやって機能がダブっている場合はbusyboxの方が高性能です。
出来ればbusybox側をディフォルトにしたいですね。

ここで「環境変数PATHの順序を変更してやればいいんじゃね?」と思った人は鋭いです。
じゃあもうちょっと突っ込んで環境変数PATHがどこで定義されているか見てみましょうか。
ルートディレクトリにあるinit.rcってファイルの中です。



書いてありましたね。
Androidはシステム起動時にこのファイルを読み込んで、中に記載されているプログラムを順次起動していく仕掛けになっています。
これはシステムを司る大切なファイルですので容易には書き換えられません。
この話も最後の方になるとその辺りを弄ることになる予定です。
ただ、かなり時間はかかると思いますがね。

Androidにはこう言った暗黙の了解的な事が多々あります。
フォントを入れ換えるとかシステムファイルを入れ換えるとか解説しているサイトは多いと思いますが
皆、この辺りの事は知っている前提で書かれているんですよね。
多分こうやって初歩の初歩から書いているサイトは少ないはずですが
この様な事を知らずにいきなり高度な事に手をだすと自分でリカバリーが出来ずはまることになります。
そうならない為にも「ふーん。そうなんだ」程度に読んでいってくれれば良いと思います。

[Android] busyboxをインストする

2011-08-31 10:07:05 | Android
今日はbusyboxをインストしようのお話です。

こいつを入れる為にはroot権限が必要です。
まずAndroidマーケットから「busybox Installer」をインストします。
実行してInstallを押して完了。簡単ですね!



素のAndroid端末はLinuxに比べて使えるコマンドが少ないんです。
そこを拡張して色んな事が出来るようにするのがbusyboxです。
でも、もうあなたは既にbusyboxを使っているかもしれませんね。
ClockworkMod Recoveryありますよね
?あれは内部的にbusyboxが使用されています。
前にも書いた通り通常起動とリカバリーはバンク切り替えみたいな感じで中身が入れ替わるようになっています。
裏で使っていたbusyboxを今回表にも入れてやった訳です。

じゃあ折角ですからbusyboxを見てみましょう。



/system/sbinに入れたのでその中身です。
大量にシンボリックリンクが張られていますね。実はbusyboxは一つのbusyboxという塊でしかありません。
ユーザーが色々なコマンドを発行するとbusyboxが呼びだされるようになっていて
busybox側が振る舞いを変えて実行結果を返してくる仕掛けになっています。賢い奴ですね。
でも、busyboxって言うのはAndroid専用のアプリじゃなくって、組み込みLinux用に作られたツールです。
例えばダーツボードで自動計算してくれるやつありますよね?あれの中身もLinuxです。そんな限られたメモリしかないような状況下で威力を発揮します。

今回はインストーラーを使いましたが実はこのbusyboxに乗っている機能は全てではありません。
busyboxはビルド時にどの機能を組み込むか、自分が必要な物を選ぶようになっています。
ですので出来上がりは十人十色になります。
興味があれば自分専用のbusyboxをビルドしてみると面白いんじゃないですか?

busyboxをインストしましたが、入れたからといって即何かが出来るようになるわけじゃないです。
でも、アプリが暗黙的にbusyboxの機能を使っていて正常に動かない場合がままあります。
それは避けたいのでなるべく早い内にインストしておいた方が吉ですね。
この話題もうちょっと引っ張ります。

今後の予定

2011-08-30 09:48:54 | Android
最近、面白くない記事が続いていますが
今後はこんな内容を書こうかと思っています。

・busyboxをインストールする
・Rom Managerを使おう
・adbとは何か?
・adbの使い方
・Android SDKのツール達
・フォントを入れ換えてみる
・インストしたアプリは何処へ?
・dalvik-cacheって何?
・systemディレクトリの構成
・apkの中身を見てみる
・apkとodex
・bootとrecovery
・boot.imgを展開してみる
・カーネルのconfig
・変更したboot.imgを使ってみる

一応自分の覚え書きの意味で。

[Android]パーミッションって何だろ?

2011-08-23 10:04:24 | Android
今回は以前書いたファイルの権限について書いて行きます。
では早速ルートディレクトリを覗いて見ましょう。



これは「ls」と言うカレントディレクトリの中身を表示するコマンドの結果です。
Androidをコマンドラインから操作する場合に頻繁に使うので少し覚えておきましょう。
行頭に「drwxr-xr-x」みたいな文字列がありますがこれがファイル等の参照権限を表しています。
最初の一文字がリソースの種別です。

- 通常ファイル
d ディレクトリ
l シンボリックリンク

シンボリックリンクはwindowsのショートカットと似たような機能ですが、そこにコピーが存在するするのと同じように扱えます。
この例だと

etc -> /system/etc

となっている場所。
etcの内容は/system/etcを参照しています。/system/etcの内容を変更した場合はetcの内容も変更されます。

その次からは3文字で一セット。ファイルとディレクトリではちょっと意味合いが違います。

ファイルの場合

 r 読み込み権限
 w 書き込み権限
 x 実行権限

ディレクトリの場合

 r ディレクトリ内容物の読み込み権限
 w ディレクトリ内への書き込み権限
 x ディレクトリ内に移動する権限

3文字が3セット並んでいます。
それぞれ所有ユーザーに対する権限、所有グループに対する権限、その他のユーザーに対する権限を表します。
グループと言うのは複数ユーザーの集合体です。

パーミッション表記の後に表示されているのがファイルの所有ユーザー、ファイルの所有グループ、ファイルサイズ、更新日時となります。
Androidは所詮一人で使う物ですのでファイル所有者は余り問題ではなく、参照権限が論点の中心となります。

この参照権限rwxの総組み合わせは8種類なので3桁の8進数表記を良く使用します。
「---------」であれば000「rwxrwxrwx」は777といった感じ。
この全ての組み合わせを覚える必要はなくAndroidの場合は2種類だけ覚えてください。

rw-r--r-- (644)

通常ファイルのパーミッション。これが一番多いかも。

rwxr-xr-x (755)

ディレクトリ及び実行ファイルのパーミッション。
/system/bin,/system/xbin等のファイルはこれじゃないと動かなくなります。

このパーミッションを変更する場合にはchmodというコマンドを使います。

chmod 644 build.prop

上記は「build.propをrw-r--r--の参照権限に変更する」という意味ですね。

このパーミッションを変更する必要性が生まれるのは、/system以下のファイルを入れ替えた場合です。
新規に入れた場合、上書きした場合に関わらず一定のパーミッションに変更されてしまうので適正なパーミッションに修正する必要があります。(ここはLinuxとちょっと違いますね)
この場合にどんなパーミッションが付与されるかはumaskによって決まっており機種毎に異なります。


要はシステムファイルを入れ替えた場合には適切なパーミッション設定をしてあげないと起動不能になる場合がありますよと言うことです。
しかし、通常通りadbで作業をしている人だったらとんでもなく変な事をしない限り復旧できます。
例えば/system/bin以下を全て644に変更してしまったとかねw それでも直せますが。
rootエクスプローラしか使えない人が起動不能にしてしまった場合はちょっと厄介ですね。
頑張ってadbを覚えるか、バックアップから戻すか、最悪はRUUで初期化か。

[Android]何故S-OFFを行うのか?

2011-08-16 01:12:11 | Android
前のrootとは何かの記事で書きましたが、rootは管理者ですからroot権限が使えれば一見何でも出来そうです。
しかしHTCの製品はちょっと特殊でして、rootであってもsystem領域の書き換えが出来ないようにセキュリティロックが掛かっています。これがS-ONです。
更にS-ONの状態では俺がシステムの一部を書き換えるのに使っているfastbootでの書き換えが出来ません。
この状態でroot権限が使えたとしても普通じゃ覗けないディレクトリ中を見てニヤニヤするか、一部の要root権限のアプリが使える様になるだけで
HTCが用意した使い方以外、何の手も加えられないんですよ。

もし、この状態である日突然あなたの使っていたスマフォがブート画面が表示されるだけで起動しなくなったとします。
そうするとHTCが用意しているRUU(Rom Update Utility)で初期化するしか直す方法が無くなります。
今まで折角使いやすくしてきた設定もインストしてきたアプリも皆消えてしまいます。
何かやる気を無くしますよね。
バックアップが取れればそんな問題も発生しないんですけど。

S-OFFを行うとカスタムROMの導入やsystem領域の書き換えとかが出来るようになりますが
弄っている人だって高いお金を出した機体ですから出来れば壊したくないわけです。
もし、おかしくしてしまってもバックアップから戻す事が出来るというお膳立てがあるから成り立っているのです。

S-OFFを行う恩恵は「バックアップが取れる状態になること」に尽きます。
別にS-OFFしたからと言ってカスタマイズしなきゃいけないわけでもありませんし、好きに使えばいいのです。

[Android] Androidの内部構成について

2011-08-16 01:08:12 | Android
今回はAndroidの内部構成について書きます。

・ Androidの起動モード

 Androidには通常起動モードとリカバリー起動モードがあります。
 通常起動はそのままなので分かるとして、
 リカバリー起動はファームのバージョンアップ適用時に使われるモードです。
 所謂、端末のメンテナンス用ですね。

・フラッシュメモリの構成

 Androidのファームウェアはフラッシュメモリに保存されています。
 ROMと呼ぶことが多いですが、ハード的なROMとは異なり書き換る事が可能です。
 このフラッシュメモリ領域はいくつかのパーティションに別れていて
 各々役割が異なります。
 代表的な領域と役割を以下に記載します。

 hboot領域

  所謂ブートローダーの領域です。
  Android起動時に最初に実行される場所で、
  ここが破壊されてしまうと起動不可に陥ります。
  S-OFFはこの領域を書き換えるので危険な行為ではあります。

 boot領域

  通常起動のシステム的にコアとなるファイルが納められた領域で
  Androidファイルシステム上のルートディレクトリに展開されます。
  この領域はファイル単体の変更、削除、新規作成が出来ない事になっています。
  変更する場合にはboot領域のイメージ(boot.img)を作って書き換える必要があります。

 recovery領域

  リカバリー起動時に使用されるファイルが納められた領域です。
  ファイル構成はboot領域とほぼ同じ内容で、
  やはりAndroidファイルシステムのルートディレクトリ上に展開されます。
  boot領域と同様にファイルの書き換え等は出来ません。

 system領域

  boot領域内のプログラムが実行される事により、
  Androidファイルシステム上の/system上にマウントされます。
  一定の手順を踏むことによりファイルの変更、追加、削除をすることが出来ます。
  設定から「工場出荷時に戻す」機能がありますが、
  この領域に加えた変更は元に戻りません。

 userdata領域

  Androidの個人設定や追加でインストしたアプリ等が保存される領域です。
  Androidファイルシステム上では/dataにマウントされます。
  「工場出荷時に戻す」はこの領域を消去することを指します。

 cache領域

  アプリのダウンロード時に一時保存キャッシュとして使用される領域です。
  Androidファイルシステム上では/cacheにマウントされます。

 radio領域

  スマートフォンの3G接続時に使用されるファームウェアが納められた領域です。
  Androidファイルシステム上からは見えない領域ですが
  新しいバージョンのradioに書き換える事により3Gの掴みが良くなったり、
  消費電力が抑えられたりする場合があります。
  但しradio領域とAndroidシステムには相性があるので、
  不用意に書き換えると不安定な状態に陥る場合があります。

 .android_secure領域

  アプリインスト時にSDカードにインストした場合の保存先です。
  当然本体の領域ではなく、/sdcard/.android_secureに存在します。
  この領域の中身は暗号化されていて通常は見ることが出来ません。
  このようにドットから始まる名称のディレクトリやファイルは
  隠しファイルを意味し特殊な用途に使用されます。

[Android]Androidのファイルシステム

2011-08-09 09:50:43 | Android
Androidのファイルシステムはこんな感じのツリー状になっています。
(あくまでも一例で全てのデバイスが同じ構成とは限りません)

/─┬ cache
 ├ data
 ├ dev
 ├ mnt
 ├ proc
 ├ root
 ├ sbin
 ├ sys
 └ system

この中でSDカードは/mnt/sdcardにあります。
windowsで2機のHDDが乗ったPCがあった場合にはCドライブ,Dドライブ等、別ドライブに分かれた状態になりますよね。
しかし、LinuxやAndroidには別ドライブと言う概念が存在しません。
全ての記憶デバイスが「/」(rootディレクトリと呼ぶ)から始まるツリー上に乗った形になります。

特定の記憶デバイスをツリー上で使えるようにする事を「マウントする」と言います。
実際に試して見ましょう。
「アストロファイルマネージャー」を使って/mnt/sdcardを見てみます。



バッチリSDカードの中身が見えていますね。
これは「SDカードがマウントされた状態」です。

次に[設定]→[SDカードと本体のメモリ]→[SDカードのマウント解除]を実行します。





SDカードの中身が見えなくなりました。



「SDカードがアンマウントされた状態」です。

この状態では/mnt/sdcardは単なる空のディレクトリですが、
OSとしてSDカードをマウントする場合にはこのディレクトリを使用する事に決まっています。
このような特殊な用途に使用するディレクトリの事を「マウントポイント」と呼びます。

ここで良く考えて見て下さい。上記の「SDカードがマウントされた状態」では
同一ディレクトリツリー上にありながら実際は中身のデバイスが違っていたりしますよね。
もしSDカードにファイルを保存し過ぎて一杯になってしまったらどんな状態になるんでしょうか?
答えは/mnt/sdcardには書き込めないが、その他の/cacheや/dataには書き込める状態となります。
何か変な感じですけど、これは実際に触ってみないと理解しにくいのではないかと思います。

更にAndroidではcache,data,systemは内臓ディスクでも別パーティーションに分かれた物がマウントされています。
状態によってcacheには書けるけどdataには書けない等の場合が発生するわけです。

[Android]そもそもrootって何なの?

2011-08-08 12:41:20 | Android
今日からAndroidの基礎についてつらつらと書いていきます。
AndroidはLinuxの一種ですので、Androidを理解する事はLinuxを理解するのと同義となります。
内容的にはうちの新人に「UNIXとは何ぞや?」を教えるのと似た様な感じになるので、必ずしも面白い話になるとは限りません。

さて、スマフォを触っていると良く「rootを取った」とか「rooted」という言葉が出てきます。
そもそもrootって何でしょうか?
端的に言ってしまえば「管理者権限を持つユーザの事」です。
Androidは常に抑制された状態で動作しています。
windowsで言う所のuser権限でログインしたのと同じで、勝手に人のファイルを見たり変更したり出来ない状態です。
では、実際にどんな状態か見てみましょう。

Androidマーケットから「アストロファイルマネージャー」をインストしました。
このアプリはwindowsのエクスプローラと同じようにAndroidファイルシステムを見ることが出来るアプリです。
アストロで/dataの中身を見ようとしたところ「ディレクトリは空です」と表示されました。



本当は/dataの中にはアプリの設定データ等が入っているのですが、
/dataディレクトリには勝手に中身を見ることが出来ない設定が成されています。
この中身を見たり書き換えたり出来る・出来ないの設定の事を「パーミッション」と呼びます。
Android上の全てのファイル、ディレクトリには、このパーミッションが設定されていて
/dataの中身を見れる人は/dataディレクトリの持ち主もしくはrootユーザと言う事になります。
慣例的に特定のファイルディレクトリを扱える権限が無い事を「パーミッションが無い」
権限がある事を「パーミッションがある」と言います。

次に「ConnectBot」というアプリを使って端末自身にコマンドラインでログインしました。



/dataに移動して(cd /data)
中身を見ようとしました(ls)
が「ls:can't open '.':Permission denied」と応答が帰って来ています。

ここでの'.'はカレントディレクトリ、すなわち/dataの事を指します。
要するに「カレントディレクトリが開けません。パーミッションが無いよ」と言っているのです。

その次で「su」と言うコマンドを発行しています。
これはSubstitute Userの略で語意のままユーザ変更をするコマンドですが、
引数無しの「su」は暗黙的にrootにユーザ変更をする事を意味します。
ここでコマンドプロンプトが変っている事にも注意してください。
これも決まり事で一般ユーザは「$」rootは「#」で見た目で分かるようになっています。

同じようにrootで/dataの中身を見たら見事に表示させる事が出来ました。


ここで最初の「rooted」の話に戻りますが「rooted」にしたからといって
Android全てのプロセスがroot権限で動作するようになるわけではなく
抑制された状態で動作している事には何の変りもありません。
正しく言うならば「root権限で作業をする事が可能になる」と言う事です。
Root Explorerというroot権限で動作するエクスプローラを使えば/dataの中身を見る事が出来ますが
このアプリはアプリ自身がroot権限で動作するような細工がしてあります。
当然、買ったばかりで素の状態の端末ではRoot Explorerは動作しません。

要するに「rooted」にすると、普通では触れないファイル等の編集や入れ替えが可能になります。
正しく作業すればより便利な機能が使える様になったりする反面、システムを壊す原因にもなります。
そこで壊した時にどうするのか?と言う保険が必要になってきます。
それは又の機会に書きますが、とてつもなく変な事をしない限りまず文鎮にはなりません。