feng3327 发表于 2016-4-27 09:38:10

RK3288 & FirePrime 5.1 安卓系统 USB google原生BUG修复

本帖最后由 feng3327 于 2016-6-24 16:51 编辑

安卓系统下,系统接入多个USB设备时,系统挂载的第一个USB设备是成功的,之后挂载的USB,能发现设备,但是usb设备的interface为空值,安卓系统可以通过如下代码进行打印,挂载的device设备信息:
UsbManager manager = (UsbManager) getSystemService(Context.USB_SERVICE);
      HashMap<String, UsbDevice> deviceList = manager.getDeviceList();
      Iterator<UsbDevice> deviceIterator = deviceList.values().iterator();
      while(deviceIterator.hasNext()) {
            UsbDevice device = deviceIterator.next();
            Log.d("xxx","device=" + device.toString());
      }

在firefly 的RK3288和fire prime上面复现,而且如果3G上网卡插拔,也许会出现第二次、第三次无法识别设备等问题,暂时没有进行测试。
此BUG在google AOSP的5.1.1都存在,https://code.google.com/p/android/issues/detail?id=159529
7楼已详细说明代码的bug产生的原因,修复方式如下:
One solution:
Clear mNewConfiguration andmNewInterface in endUsbDeviceAdded()
--- a/services/usb/java/com/android/server/usb/UsbHostManager.java
+++ b/services/usb/java/com/android/server/usb/UsbHostManager.java
@@ -669,6 +669,8 @@ public class UsbHostManager {
             mNewConfigurations = null;
             mNewInterfaces = null;
             mNewEndpoints = null;
+            mNewConfiguration = null;
+            mNewInterface = nul;

编辑frameworks/base/core/java/android/hardware/usb/UsbDevice.java---Parcelable[] configurations = in.readParcelableArray(UsbInterface.class.getClassLoader());
+++Parcelable[] configurations = in.readParcelableArray(UsbConfiguration.class.getClassLoader());

在AOSP的最新6.0_r9已修复,google 修复代码见https://android.googlesource.com ... /usb/UsbDevice.java

feng3327 发表于 2016-4-27 09:38:49

望Firefly工作人员对该BUG进行修复,并上传到git中,谢谢!!

dhhtmqh 发表于 2018-6-6 14:36:19

有没有人出现过带USB设备断电重启无法识别,但热插拔一下又正常的情况啊?
页: [1]
查看完整版本: RK3288 & FirePrime 5.1 安卓系统 USB google原生BUG修复