usb debug上层相关知识
2015-07-29 17:28
239 查看
在package目录下的settings中的developmentsettings.java,系统调用了Settings.Global.SetInt(getContentResolver(), Settings.Global.ADB_ENABLE, 1);来开启USB Debug,(网上有很多写的是SECURE_ENABLED_ADB这个字段,以及在SystemServer文件中监听,这是4.0之前采用的方式)。
在4.2到目前的5.1版本上,统一采用UsbService去管理,代码在/framework/base/service/com/android/server/usb/UsbService.java里去初始化一个叫UsbDeviceManager的类,相关文件也在同一个目录。
在UsbService.java中
[java] view
plaincopy
public UsbService(Context context) {
mContext = context;
final PackageManager pm = mContext.getPackageManger();
....
if (new File("/sys/class/android_usb").exists())
{
mDeviceManager = new UsbDeviceManager();
}
...
}
中的new UsbDeviceManager()就是关键代码。如果/sys/class目录下没有android_usb所以UsbDeviceManager初始化函数没有执行,就无法启动ADB。为什么UsbDeviceManager能够启动ADB呢?那是因为他监听了settings的数据库,然后做了响应动作。我们来看下UsbDeviceManager.java中做了神马事情。
[java] view
plaincopy
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。
在由root权限的情况下,可以手动通过setprop在终端中设置相应的值
在adb下面执行
setprop persisit.sys.usb.config 1
stop
start
在4.2到目前的5.1版本上,统一采用UsbService去管理,代码在/framework/base/service/com/android/server/usb/UsbService.java里去初始化一个叫UsbDeviceManager的类,相关文件也在同一个目录。
在UsbService.java中
[java] view
plaincopy
public UsbService(Context context) {
mContext = context;
final PackageManager pm = mContext.getPackageManger();
....
if (new File("/sys/class/android_usb").exists())
{
mDeviceManager = new UsbDeviceManager();
}
...
}
中的new UsbDeviceManager()就是关键代码。如果/sys/class目录下没有android_usb所以UsbDeviceManager初始化函数没有执行,就无法启动ADB。为什么UsbDeviceManager能够启动ADB呢?那是因为他监听了settings的数据库,然后做了响应动作。我们来看下UsbDeviceManager.java中做了神马事情。
[java] view
plaincopy
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。
在由root权限的情况下,可以手动通过setprop在终端中设置相应的值
在adb下面执行
setprop persisit.sys.usb.config 1
stop
start
相关文章推荐
- hdu1863
- Christine Daaé
- 这是一道BFS入门题
- 元组(tuple)、列表[list]的区别
- JAVA自学路线图
- VC7(VS2002)调试时 std::string 超过15字符乱码问题
- “/”应用程序中的服务器错误
- Xutils框架-HTTP使用详解
- HDU 5318 The Goddess Of The Moon(矩阵快速幂)
- hd1856 More is better
- Oracle 查看收集统计信息
- javascript理解参数
- hadoop
- 【CSS学习】CSS Id 和 Class
- asp.net出现的异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值" 的解决方法
- [html5]离线存储
- Java 划分排序
- Core Animaiton - 7
- UnicodeEncodeError: 'gbk' codec can't encode character ...
- 问题解决:Ubuntu 12.04在vmware10下无法进入Unity模式