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モード