Android4.2 Usb Debug启动流程

最近自己搞的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中

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. public UsbService(Context context) {  
  2.         mContext = context;  
  3.     
  4.         final PackageManager pm = mContext.getPackageManger();  
  5.          ....  
  6.          if (new File("/sys/class/android_usb").exists())  
  7.          {  
  8.               mDeviceManager = new UsbDeviceManager();  
  9.          }  
  10.          ...  
  11. }  

中的new UsbDeviceManager()就是关键代码。我的项目中由于/sys/class目录下没有android_usb所以UsbDeviceManager初始化函数没有执行,所以会无法启动ADB。刚才/sys/class/android_usb应该是一个和驱动有关的目录,这里不做详细介绍。 为什么UsbDeviceManager能够启动ADB呢?额。。。那是因为他监听了settings的数据库,然后做了响应动作。我们来看下UsbDeviceManager.java中做了神马事情。

[java]  view plain  copy
  在CODE上查看代码片 派生到我的代码片
  1. private class AdbSettingsObserver extends ContentObserver {  
  2. ...  
  3.       @Override  
  4.        boolean enable = (Settings.Global.getInt(mContextResolver, Settings.Global.ADB_ENABLED, 0) > 0)  
  5.         mHandler.sendMessage(MSG_ENABLE_ADB, enable);  
  6. }  
而后续代码中注册了数据库的监听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...^_^

二 最上层usb应用

首先查看packages/apps/Settings/src/com/android/settings/DevelopmentSettings.java

在updateAllOptions()方法中,有关于【USB调试】的逻辑处理。

[java]  view plain copy
  1. /// M: CR ALPS00244115. Lock and unlock screen, the "USB debugging" is unchecked.  
  2.       boolean isChecked = (mAdbDialog != null && mAdbDialog.isShowing()) ? true :  
  3.                   (Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0) != 0);  
  4.       updateSwitchPreference(mEnableAdb, isChecked);  
  5.       /// M: update usb preference again  
  6.       mExt.customUSBPreference(mEnableAdb);  

 

[java]  view plain copy
  1. void updateSwitchPreference(SwitchPreference switchPreference, boolean value) {  
  2.     switchPreference.setChecked(value);  
  3.     mHaveDebugSettings |= value;  
  4. }  


其中mEnableAdb即【USB调试】开关控件。一开始我直接强制的把isChecked变量设置为true,如下代码所示

[java]  view plain copy
  1. /// M: CR ALPS00244115. Lock and unlock screen, the "USB debugging" is unchecked.  
  2.          boolean isChecked = (mAdbDialog != null && mAdbDialog.isShowing()) ? true :  
  3.                      (Settings.Global.getInt(cr, Settings.Global.ADB_ENABLED, 0) != 0);  
  4. -        //added by ouyang 2015-11-10  set mEnableAdb=true if model is J5  
  5. -        if (android.os.SystemProperties.isJ5Version()) {  
  6. -               isChecked=true;  
  7. -        }  
  8. -        //added by ouyang 2015-11-10 end  
  9.          updateSwitchPreference(mEnableAdb, isChecked);  
  10.          /// M: update usb preference again  
  11.          mExt.customUSBPreference(mEnableAdb);  

但是这样的话,直接刷机后开机的话还是不能直接连接USB调试,还要重新关闭该开关再打开该开关才能进行USB调试,因此该方案被放弃。

因为是否真正打开【USB调试】功能,是看Settings.Global.ADB_ENABLED这个属性的值是0还是1。因此真正的方法是在一个接受开机广播的广播接收者中将Settings.Global.ADB_ENABLED设置为1。

在下面和【未知来源】一起修改,在第4步骤中解决。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值