その他



   

次なるステップへ向けて

Linux コマンド

BusyBox 導入 の項で触れたが Android は Linux コマンドで命令を実行する
標準搭載されている コマンドの数は少なく Android の機能を 100% 活かすことは難しいであろう
そこで BusyBox 導入 が出てくる訳だがこれらコマンドはどこに保存されているのだろう
 

●各コマンドの保存場所

標準搭載 されているコマンド

  • /system/bin/

BusyBox 等ユーザーが新たに追加 したコマンド

  • /system/xbin/

 

●各保存場所の実際

01) /system/bin/

02) /system/bin/ のプロパティ

03) /system/xbin/

04) /system/xbin/ のプロパティ

 

●cal コマンド

ここで /system/xbin/ にのみ存在する cal コマンドに注目する
これは カレンダーを表示する コマンドである

01) Android Terminal Emulator から cal を入力後実行する

  • 現在の月の カレンダーが表示される

 

●結果
  • /system/xbin/ の方が 圧倒的にコマンド数が多く /system/bin/ にはないコマンドもある
  • BusyBox を導入することで cal コマンドを例に 実際にコマンド ( 機能 ) が拡張された
  • 重複するコマンドが存在する
    • 重複するコマンドがある場合 Android は どちらのコマンドを使用する のだろうか
    • 重複するコマンドがある場合 どのように使い分ければよいのか
    • 攻撃は最大の防御なり サイト参照のこと

 

●Linuxコマンド一覧

その他コマンドの使用方法は下記サイト参照のこと

 

●番外:Linux コマンドと adb の関係

adb を使うことでパソコンから 上記と 同じ結果を得ることができる

01) EVO と パソコンを USB で接続する

02) コマンドプロンプトを立ち上げる

03) adb shell cal を入力後実行する

 

●まとめ

パソコン から Linux コマンドを実行するには下記の通り Linux コマンド の先頭に adb shell を付けて実行する

  • adb shell Linux コマンド


    • adb は パソコンから EVO へ 接続する ことができる
    • またパソコンと EVO にて ファイルの送受信が可能になる 特に Recovery 起動時にその力を発揮する

adb

Android はデバッグ向けに adb という機能を提供している
これまでに少し触れ合う場面があったがこの機能を覚えるだけで
もしものときスマートに 作業したい場合に大いに役立つ
 

●もしものとき...

ファイルの変更・削除を誤ってしまい 再起動が繰り返される 場合や ブート画面で止まる 場合
adb で接続し バックアップファイルとの差し替え修正 を行うことで回避できる場合がある

 

●スマートに...
  • adb shell
  • cd /system/bin/
  • chmod 6755 su

3 つのコマンドを実行しているが下記コマンドにて 1 つにまとめることができる
 

  • adb shell chmod 6755 /system/bin/su

 

●解説サイト

幸いにも adb の扱いを 大変分り易く解説している ブログを発見したので一度訪れることをお勧めする

adb 以外にも Android SDK の導入から root ユーザー向けの情報まで 幅広く分かり易く 述べられている
今さら誰にも聞くことができない基礎の解説や 何となくあやふやな認識で通り過ごしそうな部分の解説 もある

更なる知識向上へ向けて次なるステップへの手助けになることであろう
なお adb は Android SDK に組み込まれているので忘れず導入すること

mount

下記コマンドを見たことはないだろうか

  • mount -o remount,rw /dev/block/stl9 /system

このコマンドは /system を 操作する場合に使用する
内容は /system を 読み書きできる状態にする コマンドである

Android はセキュリティ強化のため /system を 読み取り専用 としてマウントする
そのため上記のコマンドで 自由に操作できるようにする

今回は /dev/block/stl9 に注目する
これは 機種毎に決められたデバイス名 である
もちろん上記は適当な数値を入れたので実行すると そのデバイスは無い と返ってくる
機種毎に決められたデバイス名を導き出すには mount コマンドを使用する

通常起動時と ClockworkMod Recovery 起動時の 結果の違いにも注目する必要がある
 

●検証1:通常起動時

01) mount を実行

  • systemro ( 読み取り専用 ) でマウントされている
  • data,cacherw ( 自由に操作できる状態 ) でマウントされている

 

●検証2:ClockworkMod Recovery 起動時

01) mount を実行

  • cache のみ rw でマウントされている

02) ClockworkMod Recovery 操作から sdcard の mount を実行

  • /sdcardrw でマウントされた

03) ClockworkMod Recovery 操作から system の mount を実行

  • /systemrw でマウントされた

04) ClockworkMod Recovery 操作から data の mount を実行

  • /datarw でマウントされた

05) ClockworkMod Recovery 操作から 全てのデバイスの unmount を実行

  • 全てのデバイスがアンマウントされた

 

●結果
  • 通常起動時 /system は ro ( 読み取り専用 ) でマウントされている
  • ClockworkMod Recovery 起動時は cache のみ rw でマウントされている
  • ClockworkMod Recovery の mount は rw ( 自由に操作できる状態 ) でマウントされる

 

●EVO の各デバイス名

/system

  • /dev/block/mtdblock4
/cache
  • /dev/block/mtdblock5
/data
  • /dev/block/mtdblock6
/sdcard
  • /dev/block/mmcblk0p1
    • 検証時の SD カードのパーティションが一つ のため 1 デバイスしか検出されていない
    • 環境により複数のパーティションがある場合は mmcblk0p2...mmcblk0p3 と増えていく
    • SWAP や Apps2SD にてアプリが 正しいデバイス名を指定しているか 確認する必要がある

id

現在ログインしているユーザーは どの権限 を持っているのか
ターミナルで徐に $一般ユーザー#管理者 ( root ) と判断している
もちろん 正しい判断である がもう少し掘り下げてみる
# と表示されているが 本当に root と同等の権限 をもったユーザーなのだろうか
それを調べるコマンドが id である

ターミナルにて id と入力する
見慣れない英数字の羅列が表示されるがちゃんと意味はある
注目すべきは uid = ユーザーIDgid = グループID数値 である
簡単に述べえると数値が低いほど権限が高い

またフォントを入れ替えようと下記コマンドを実行する

  • adb push DroidSansJapanese.ttf /system/fonts/
  • adb shell chmod 644 /system/fonts/DroidSansJapanese.ttf

ある人はコマンドを 実行できる
ある人はコマンドを 実行できない
その違いはどこにあるのだろうか
 

●検証1:通常起動時

01) adb 接続 から id を実行

  • uid gid 共に 2000 = shell ユーザーである

02) adb 接続 から EVO にログイン

  • 一般ユーザー でログインされた

03) EVO から id を実行

  • uid gid 共に 2000 = shell ユーザーである

04) su を実行し id を実行

  • uid gid 共に 0 = root ユーザーになった

 

●検証2:ClockworkMod Recovery 起動時

01) adb 接続 から id を実行

  • uid gid 共に 0 = root ユーザーである

02) adb 接続 から EVO にログイン

  • root でログインされた

03) EVO から id を実行

  • uid gid 共に 0 = root ユーザーである

 

●結果
  • 通常起動時 は adb 接続に root 権限がない
  • ClockworkMod Recovery 起動時は adb 接続に root 権限がある

/system への adb コマンドの実行は ClockworkMod Recovery 起動時に行う

無限再起動から抜け出すには

システム内部の設定を変更すると稀に 無限再起動Android au の画面から動かない 状態に陥ることがある
まずは 電源 + ボリュームボタン 下 の同時押しRecovery に移行できるか確認 することが第一である
それでも 移行できない場合 下記の方法を試みること
 

●準備
  • ADB コマンドをパソコンから実行できる環境の構築 ( Android SDK )
  • パソコンと EVO を USB で接続する

 

●Recovery へ移行

コマンドプロンプトから下記コマンドを実行する

  • adb reboot recovery


    • ClockworkMod Recovery へ移行することがきる
    • なお 通常起動時操作不能 ( フリーズ ) に陥っても上記コマンドで Recovery へ移行できる場合がある

 

●復旧作業

無事 Recovery へ移行することができたら リストア するなり adb 等で 原因箇所の修正 へと進むことができる

  • リストアする場合:
  • adb を使う場合:
    • 現在の状況を見る ことができる logcat を使用することにより 早期解決 に繋がる可能性がある

 

●logcat

頭文字の各重要度

  • V : 冗長     ( 低い )
  • D : デバッグ
  • I : 情報
  • W : 警告
  • E : エラー
  • F : 致命的   ( 高い )

 

●使用法
ログは 膨大な量が出力される のでフィルターを掛けて 目的の重要度のみ表示させる
また出力されたログをテキスト形式で保存して 原因の特定 を行う

  • adb logcat *:W > log.txt
    • 警告 以上の重要度をすべて表示する
    • log.txt を作成してログ情報を保存する
    • またログ出力を止める場合は Ctrl + C を押す

 

●実演:無限再起動に陥った

無限再起動に陥る原因の一つに local.prop に記載された 命令 が原因であることが多い

例:/data/local.propro.kernel.qemu=1 の1行があること
 

●logcat の状況

E/System  ( 4395): Failure starting core service
E/System  ( 4395): java.lang.SecurityException
E/System  ( 4395):      at android.os.BinderProxy.transact(Native Method)
E/System  ( 4395):      at android.os.ServiceManagerProxy.addService(ServiceManagerNative.java:146)
E/System  ( 4395):      at android.os.ServiceManager.addService(ServiceManager.java:72)
E/System  ( 4395):      at com.android.server.ServerThread.run(SystemServer.java:300)
E/AndroidRuntime( 4395): *** FATAL EXCEPTION IN SYSTEM PROCESS: ConnectivityThread 
W/RecognitionManagerService( 4395): no available voice recognition services found

W/Zygote  ( 4571): Class not found for preloading: android.widget.TextView$SelectionModifierCursorController$1
E/Zygote  ( 4571): setreuid() failed. errno: 17
E/libEGL  ( 4592): eglSetSwapRectangleANDROID:1833 error 3008 (EGL_BAD_DISPLAY) 
W/zipro   ( 4607): Unable to open zip '/system/etc/customer/bootanimation.zip': No such file or directory
W/PackageManager( 4592): Unknown permission com.htc.android.mail.permission.WRITE_MAIL in package com.htc.calendar
W/PackageManager( 4592): Unknown permission com.htc.permission.SOCIAL_NETWORK in package com.htc.album

 

●解決方法
01) 無限再起動中に adb reboot recovery を入力後実行する

02) ClockworkMod Recovery が立ち上がる

03) mount and storage を選択後決定する

04) mount /data を選択後決定する

05) adb pull /data/local.prop でパソコンに local.prop を送信する

06) local.prop を修正する

           ↓

07) adb push local.prop /data で EVO に local.prop を送信する

08) adb shell cat /data/local.prop で念のために ファイルの中を確認 する

09) adb reboot で EVO を再起動する

10) 無限再起動が直る
 

●注意

  • ClockworkMod Recovery 起動時は cache のみ rw でマウントされているため必要に応じ 該当箇所をマウントする必要がある
  • local.prop に ro.kernel.qemu=1 を追記することで EVO が 無限再起動に陥る

参考

WEB サイト

こちらで紹介した手順・情報は上記サイトを参考にまとめたにすぎず 各管理人への責任等一切無いものとする
あくまでも 自己責任において 決行すること

Android ファイル構成図


2ch コメント

18 :名無しさん@お腹いっぱい。 [↓] :2011/05/26(木) 19:58:58.87 ID:q1E65LJa
Z4テンポラリtitaniumで
プリアプリをアンインストールしたんだけど
電源落として再起動したら
復活してた。
これはテンポラリだからってことでおけ?

19+1 :名無しさん@お腹いっぱい。 [↓] :2011/05/26(木) 20:59:24.88 ID:3uxGIaRG (1/2)
アンインストじゃなくて、アプリの項目長押しでポップアップでるから一番下の強制削除。 
直後にリブート二回する。
379+2 :名無しさん:2011/04/20(水) 02:18:02.07 ID:MP3mEahn (1/3)
フォント変更できたやついる?
z4rootでroot取って変更しようとしても上手くいかん。

380+2 :名無しさん:2011/04/20(水) 02:22:50.45 ID:fDM2b+P4 (1/4)
>>379
root取ったら、system/fontsのファイル差し替えて
パーミッション弄るだけじゃないの?

382+1 :名無しさん:2011/04/20(水) 02:43:08.95 ID:zUJl3Z6g
>>379-380
S-OFFしないと無理。permanent root取れないことには。
668 :名無しさん@お腹いっぱい。 [↓] :2011/04/24(日) 01:50:52.25 ID:9Zmi2lBf
Z4root使ってみたけどroot一時的に取れるだけなんだね
SOCも使えなかったし当分root化見送ることにする
フォント変えたかったよちくしょう
413 :名無しさん@お腹いっぱい。 [] :2011/04/27(水) 02:40:02.44 ID:zywU8Uau
一時的なroot取得で、取りあえず以下のソフト動作ok
ad free
titanium backup 
market enabler

コメント Q&A

  • まとめてくれてる方、まじありがとう。 - 始皇帝 (2011年10月13日 20時25分45秒)
  • ありがとうございます!やりませんけど - 名無しさん (2011年10月15日 22時21分06秒)
  • このページすごすぎるwメチャメチャ充実してるやん - 名無しさん (2011年10月18日 19時58分10秒)
お名前: コメント: