1. 程式人生 > >usb debugging的實現機制

usb debugging的實現機制

在settings中,有一個控制是否允許遠端除錯的選項usb debugging,當這個開關為off的時候,無法使用adb,也不能把**當作ms-storage來使用。 java中能訪問的設定儲存在/data/data/com.android.providers.settings/databases/settings.db裡面。
欄位名字叫做 adb_enabled。使用者操作settings來修改設定時,實際上就是改變這個欄位。

android程序system server中起了一個執行緒在一直監視db的這個欄位。
根據這個欄位的值來修改system propertity,其實也就是修改linux的環境變數
persist.service.adb.enable


程式碼如下

  • class ServerThread extends Thread {
  •     private static final String TAG = "SystemServer";
  •     private final static boolean INCLUDE_DEMO = false;
  •     private static final int LOG_BOOT_PROGRESS_SYSTEM_RUN = 3010;
  •     private ContentResolver mContentResolver;
  •     private class AdbSettingsObserver extends ContentObserver {
  •         public AdbSettingsObserver() {
  •             super(null);
  •         }
  •         @Override
  •         public void onChange(boolean selfChange) {
  •             boolean enableAdb = (Settings.Secure.getInt(mContentResolver,
  •                 Settings.Secure.ADB_ENABLED, 0) > 0);
  •             // setting this secure property will start or stop adbd
  •            SystemProperties.set("persist.service.adb.enable", enableAdb ? "1" : "0");
  •         }
  •     }


    在linux的啟動配置檔案init.rc中有這樣的配置
  • # 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

    從這裡我們可以看出來其實設定adb_enabled與否其實就是在控制是否啟動adbd這個daemon。