2012年02月08日
Androidのadbのメモ(10) adbdの起動のトリガー
Androidデバイスの中でadbdは常に起動されているわけではありません。adbdの起動のトリガーとなるものを調べました。
Android 2.3の場合
init.rcでadbdのserviceに関するところは以下のようになっています。
# adbd is controlled by the persist.service.adb.enable system property service adbd /sbin/adbd disabled # adbd on at boot in emulator on property:ro.kernel.qemu=1 start adbd on property:persist.service.adb.enable=1 start adbd on property:persist.service.adb.enable=0 stop adbd
emulatorの場合は常にadbdをstart。
システムプロパティ"persist.service.adb.enable"に"1"をセットすればadbdをstart, "0"ならばstop。このプロパティの値を書き換えるとinitがそれを行ってくれます。
"persist."で始まるプロパティは再起動しても値が保持されます。
"persist.service."で始まるプロパティはuid==AID_SYSTEMのプロセス以外は値を書くことができないようになっています。
実際に"persist.service.adb.enable"に値を書くところは
frameworks/base/service/java/com/andorid/server/SystemServer.java
の AdbSettingObserverです。
Settingsのアプリで"USB Debug"を有効にしたときにここにくるようです。
Andorid 4.0の場合
Android 4.0ではAndroid Open AccessoryがサポートされたためにUSBまわりが複雑になりました。
init.rc
# Used to disable USB when switching states on property:sys.usb.config=none stop adbd write /sys/class/android_usb/android0/enable 0 write /sys/class/android_usb/android0/bDeviceClass 0 setprop sys.usb.state $sys.usb.config # adb only USB configuration # This should only be used during device bringup # and as a fallback if the USB manager fails to set a standard configuration on property:sys.usb.config=adb write /sys/class/android_usb/android0/enable 0 write /sys/class/android_usb/android0/idVendor 18d1 write /sys/class/android_usb/android0/idProduct D002 write /sys/class/android_usb/android0/functions $sys.usb.config write /sys/class/android_usb/android0/enable 1 start adbd setprop sys.usb.state $sys.usb.config # USB accessory configuration on property:sys.usb.config=accessory write /sys/class/android_usb/android0/enable 0 write /sys/class/android_usb/android0/idVendor 18d1 write /sys/class/android_usb/android0/idProduct 2d00 write /sys/class/android_usb/android0/functions $sys.usb.config write /sys/class/android_usb/android0/enable 1 setprop sys.usb.state $sys.usb.config # USB accessory configuration, with adb on property:sys.usb.config=accessory,adb write /sys/class/android_usb/android0/enable 0 write /sys/class/android_usb/android0/idVendor 18d1 write /sys/class/android_usb/android0/idProduct 2d01 write /sys/class/android_usb/android0/functions $sys.usb.config write /sys/class/android_usb/android0/enable 1 start adbd setprop sys.usb.state $sys.usb.config # Used to set USB configuration at boot and to switch the configuration # when changing the default configuration on property:persist.sys.usb.config=* setprop sys.usb.config $persist.sys.usb.config
# adbd is controlled via property triggers in init.<platform>.usb.rc service adbd /sbin/adbd class core disabled # adbd on at boot in emulator on property:ro.kernel.qemu=1 start adbd
"persist.service.adb.enable"は使われなくなりました。代わりに、sys.usb.config"が保存される値で、"sys.usb.config"が現在の値です。これが"none", "adb", "accessory", "accessory,adb" でadbdのstart/stopが行われます。USBのプロダクトIDも変わるようです。
"persist.sys.usb.config", "sys.usb.config"の値をセットしているところは
frameworks/base/services/java/com/android/server/usb/UsbDeviceManager.java
関連するページ
Inter-process communication of Android
Android Builders SummitでADBの話をしました
Androidのadbのメモ(1) adb serverの観察
Androidのadbのメモ(5) adb shell lsを実行したときのログ
Androidのemulator consoleに簡単にコマンドを送る方法
Androidのadbのメモ(6) 直接adb serverと通信するrubyスクリプト
Androidのadbのメモ(7) Androidデバイス側でadbを動かす
Androidのadbのメモ(8) Android以外でadbを使う実験
Androidのadbのメモ(9) Android端末同士をadbでつなぐ
Androidのadbのメモ(10) adbdの起動のトリガー
Androidのadbのメモ(11) adbdのsecureモード