最近自己搞的Android4.2项目,发现系统设置中的Usb Debug无法启动了,于是研究了下源码,试图找出原因。代码在package目录下的settings中的development.java这个文件。经过一番努力搜索,发现系统调用了Settings.Global.SetInt(getContentResolver(), Settings.Global.ADB_ENABLE, 1);来开启USB Debug,这里需要说明的是,网上有很多写的是SECURE_ENABLED_ADB这个字段,以及在SystemServer文件中监听,这个是4.0之前采用的方式,现在已经不再使用了,希望不要被误导。
现在在4.2上,统一采用UsbService去管理,代码在/framework/base/service/com/android/server/usb/UsbService.java里去初始化一个叫UsbDeviceManager的类,相关文件也在同一个目录。
在UsbService.java中
public UsbService(Context context) { mContext = context; final PackageManager pm = mContext.getPackageManger(); .... if (new File("/sys/class/android_usb").exists()) { mDeviceManager = new UsbDeviceManager(); } ... }
private class AdbSettingsObserver extends ContentObserver { ... @Override boolean enable = (Settings.Global.getInt(mContextResolver, Settings.Global.ADB_ENABLED, 0) > 0) mHandler.sendMessage(MSG_ENABLE_ADB, enable); }而后续代码中注册了数据库的监听mContentResolver.registerContentResolver(Settings.Global.getUriFor(Settings.Global.ADB_ENABLED), false, new AdbSettingsObserver);
来监听最上面提到的Settings.Global_ADB_ENABLED这个数据库字段的改变来产生相应动作。
具体动作就是对android properties属性进行设置,关键字段是persist.sys.usb.config,如果启动ADB,则通过SystemProperties.get("persisit.sys.usb.config", "adb");来启动ADB。
你可以手动通过setprop在终端中设置相应的值先试试看看。前提是你必须有root权限。
End...^_^