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



トラックバックURL

コメントする

名前
 
  絵文字
 
 
記事検索
最新コメント
アクセスカウンター
  • 今日:
  • 昨日:
  • 累計:

QRコード
QRコード