Javaな日々

NO JAVA, NO LIFE.

Android をカスタマイズする上での知識

Android をカスタマイズする際は Android SDK をインストールしないと何も始まりません.
Windows の場合は Android の接続モードによって認識させるドライバーが違ったりしてるようなので,そのあたりのセットアップは各自で調べて行うといいと思います.

また,ブートローダーのアンロックや root 化を実施すると,メーカーのサポート対象外となるのでこれらは自己責任で行なってください.

ADB (Android Debug Bridge)

Android アプリケーションの開発の際のデバッグで使われるコマンドラインツール.
Android SDK をインストールすると,$sdk-path$/platform-tools/ の中に adb がインストールされている.この adb コマンドを用いてターミナル (コマンドプロンプト) から操作する.

主に *.apk (アプリケーション) のインストールや,端末内と PC でのファイルのやり取り,内部状態の表示などの機能を持っている.詳しくは Android公式サイト へ.

ブートローダ

Android は次のようなフローで起動し,操作可能となる.

  1. 電源 ON
  2. ブートローダー起動
  3. Android 起動
  4. システムアプリ起動
  5. 操作可能状態

通常の Android 端末ではこれらが自動的に行われ,操作可能状態となる.ブートローダーをアンロックすると,2 の状態でユーザーが起動するシステムを選択することが可能になる.すなわち,通常の Android システムを起動するか,各自で用意したリカバリーのようなシステムを起動するかが選択できるということである.

また,ブートローダーが起動している状態では fastboot コマンドを利用することができる.これもブートローダーをアンロックする利点の一つとして挙げられる.

Fastboot

USB ケーブルを介して PC から Android 端末のファイルシステムを操作するためのプロトコル.Android SDK をインストールし,Google USB Driver をインストールすると,$sdk-path$/platform-tools/ の中に fastboot コマンドがインストールされている.この fastboot コマンドを用いてターミナル (コマンドプロンプト) から利用する.

fastboot コマンドでは,各自用意したシステムやブートローダー,リカバリーのイメージデータを端末に書き込んだり (flash),一時的に起動 (boot) させたりすることができる.その他には以下の様な操作が可能.

usage: fastboot [ <option> ] <command>

commands:
  update <filename>                        reflash device from update.zip
  flashall                                 flash boot + recovery + system
  flash <partition> [ <filename> ]         write a file to a flash partition
  erase <partition>                        erase a flash partition
  format <partition>                       format a flash partition 
  getvar <variable>                        display a bootloader variable
  boot <kernel> [ <ramdisk> ]              download and boot kernel
  flash:raw boot <kernel> [ <ramdisk> ]    create bootimage and flash it
  devices                                  list all connected devices
  continue                                 continue with autoboot
  reboot                                   reboot device normally
  reboot-bootloader                        reboot device into bootloader
  help                                     show this help message

options:
  -w                                       erase userdata and cache (and format if supported by partition type)
  -u                                       do not first erase partition before formatting
  -s <specific device>                     specify device serial number or path to device port
  -l                                       with "devices", lists device paths
  -p <product>                             specify product name
  -c <cmdline>                             override kernel commandline
  -i <vendor id>                           specify a custom USB vendor id
  -b <base_addr>                           specify a custom kernel base address
  -n <page size>                           specify the nand page size. default: 2048
  -S <size>[K|M|G]                         automatically sparse files greater than size.  0 to disable

リカバリー

fastboot コマンドで行う操作をブラックボックス化することで,システムの修復やカスタマイズに必要な様々な操作を簡単に行うことができるシステム.メインシステムが起動しなくなった場合などに利用するサブ OS 的な位置付け.

端末によってはメーカーが作成したリカバリーがインストールされていることがあるが,ほとんどの場合大した機能を持っていない.そのため Android をシステムレベルでカスタマイズする場合,有志が作成したカスタムリカバリーをインストールして利用することが多い.カスタムリカバリーでは,システムイメージの書き込みやバックアップ/リストア,ディレクトリのマウント/アンマウントなどができるものが多い.ClockworkMod などが有名.

カスタム ROM

Androidオープンソースで開発されているため,ソースコードを取得することで誰にでもカスタマイズが可能.
Nexus シリーズの端末には Google 純正の Android (= Factory Image) が,メーカー製の Android 端末にはメーカーカスタマイズが施された Android がインストールされている.このどちらでもない,第三者がカスタマイズし作成した Android を カスタム ROM と呼んでいる.

カスタム ROM では,通常の Android では変更できない箇所がカスタマイズ可能になっていたり,メーカーの最適化では行き届いていない部分の最適化が行われていたりする.XDA Developer などの各コミュニティで制作が活発だったりする.

カスタム ROM は,先の Fastboot やリカバリーシステムを用いて端末に書き込むことができる.

root 化

通常の Android は,制限付きユーザーでのみ操作が可能である.例えば,/sdcard ディレクトリの読み書きは許可されているが,システムファイルの書き換えなどの操作には制限がかかる.root 化を実施し,su コマンドを叩くことでスーパーユーザー権限 (Windows で言う管理者権限) での操作が可能になる.

Android を root 化する場合,一般的に以下の操作が行われている.

以下は Nexus 4 を root 化する際のスクリプト./system ディレクトリを読み書き可 (RW) でマウントし,su コマンド,busybox コマンド,スーパーユーザー権限管理アプリをそれぞれの場所に書き込み,パーミッションを設定,シンボリックリンクを作成するなどしてコマンドのインストールを行なっている.

ui_print("=====================================================");
ui_print("===Root for Nexus Devices on Android 4.2 by HQRaja===");
ui_print("=Includes SuperSU 0.97, busybox and latest SU binary=");
show_progress(0.500000, 0);

ui_print("=================Mounting system...==================");
run_program("/sbin/busybox", "mount", "/system");
run_program("/sbin/busybox", "mount", "-o", "rw,remount", "/system", "/system");
run_program("/sbin/busybox", "mount", "-o", "rw,remount", "/", "/");

ui_print("===========Deleting old files if present...==========");
delete("/system/bin/su");
delete("/system/xbin/su");
delete("/system/app/Superuser.apk");
delete("/system/app/SuperUser.apk");

ui_print("=================Copying new files...================");
package_extract_dir("system", "/system");

ui_print("================Setting permissions...===============");
set_perm(0, 0, 06755, "/system/bin/su");
set_perm(0, 0, 0644, "/system/app/Superuser.apk");
set_perm(0, 0, 04755, "/system/xbin/busybox");

ui_print("==================Adding symlink...==================");
symlink("/system/bin/su", "/system/xbin/su");

ui_print("==================Installing busybox=================");
run_program("/system/xbin/busybox", "--install", "-s", "/system/xbin");

ui_print("=================Unmounting system...================");
run_program("/sbin/busybox", "umount", "/system");

ui_print("==========Finished. Reboot your device now.==========");
ui_print("=====================================================");
show_progress(1.000000, 0);

スーパーユーザー権限管理アプリでは,プログラムに必要以上の権限を与えないように,また不正なプログラムにスーパーユーザー権限を与えないように,適切に権限を管理する必要がある.