UsbHostManager

Ruta del código: frameworks/basse/services/usb/java/com/android/server/usb/UsbHostManager.java

  1. Regitsro de un dispositivo USB nuevo
    /* Invocado desde JNI en monitorUsbHostBus() para notificar dispositivos USB nuevos.
       Devuelve true si el proceso es exitoso, es decir, los descriptores de dispositivo
       de audio USB se analizan correctamente y el dispositivo único se agrega a la lista
       de dispositivos de audio.
     */
    @SuppressWarnings("unused")
    private boolean usbDeviceAdded(String deviceAddress, int deviceClass, int deviceSubclass,
            byte[] descriptors) {
        if (DEBUG) {
            Slog.d(TAG, "usbDeviceAdded(" + deviceAddress + ") - inicio");
        }

        if (isAddressDenyListed(deviceAddress)) {
            if (DEBUG) {
                Slog.d(TAG, "dirección del dispositivo en lista de exclusión");
            }
            return false;
        }

        if (isClassDenyListed(deviceClass, deviceSubclass)) {
            if (DEBUG) {
                Slog.d(TAG, "clase del dispositivo en lista de exclusión");
            }
            return false;
        }

        UsbDescriptorParser descriptorParser = new UsbDescriptorParser(deviceAddress, descriptors);
        if (deviceClass == UsbConstants.USB_CLASS_PER_INTERFACE
                && !checkInterfacesDenyListed(descriptorParser)) {
            return false;
        }

        // Puede bloquear si lee datos del dispositivo USB.
        registerDeviceLog(descriptorParser);

        synchronized (mLock) {
            if (mDevices.containsKey(deviceAddress)) {
                Slog.w(TAG, "dispositivo ya existente en la lista: " + deviceAddress);
                //TODO Si es el mismo periférico que se está conectando, reemplazarlo.
                return false;
            }

            UsbDevice.Builder builder = descriptorParser.toAndroidUsbDeviceBuilder();
            if (builder == null) {
                Slog.e(TAG, "Error al crear el objeto UsbDevice.");
                addConnectionRecord(deviceAddress, ConnectionRecord.CONNECT_BADDEVICE,
                        descriptorParser.getRawDescriptors());
            } else {
                UsbSerialReader reader = new UsbSerialReader(mContext,
                        mPermissionManager, builder.serialNumber);
                UsbDevice device = builder.build(reader);
                reader.setDevice(device);

                mDevices.put(deviceAddress, device);
                Slog.d(TAG, "Dispositivo añadido: " + device);

                ComponentName handler = getUsbDeviceConnectionHandler();
                if (handler == null) {
                    getCurrentUserSettings().deviceAttached(device);
                } else {
                    getCurrentUserSettings().deviceAttachedForFixedHandler(device, handler);
                }

                mUsbAlsaManager.usbDeviceAdded(deviceAddress, device, descriptorParser);

                addConnectionRecord(deviceAddress, ConnectionRecord.CONNECT,
                        descriptorParser.getRawDescriptors());

                FrameworkStatsLog.write(FrameworkStatsLog.USB_DEVICE_ATTACHED,
                        device.getVendorId(), device.getProductId(),
                        descriptorParser.hasAudioInterface(), descriptorParser.hasHIDInterface(),
                        descriptorParser.hasStorageInterface(),
                        FrameworkStatsLog.USB_DEVICE_ATTACHED__STATE__STATE_CONNECTED, 0);
            }
        }

        if (DEBUG) {
            Slog.d(TAG, "usbDeviceAdded(" + deviceAddress + ") - fin");
        }

        return true;
    }

  1. Verificación de dispositivos en lista de exclusión
    private boolean isAddressDenyListed(String address) {
        for (String blocked : mHostDenyList) {
            if (address.startsWith(blocked)) {
                return true;
            }
        }
        return false;
    }

    /* Devuelve true si el dispositivo USB no debe ser accesible para las aplicaciones */
    private boolean isClassDenyListed(int clazz, int subClass) {
        if (clazz == UsbConstants.USB_CLASS_HUB) {
            return true;
        }
        return clazz == UsbConstants.USB_CLASS_HID
                && subClass == UsbConstants.USB_INTERFACE_SUBCLASS_BOOT;
    }

  1. Constructor de la clace
    public UsbHostManager(Context context, UsbAlsaManager alsaManager,
            UsbPermissionManager permissionManager) {
        mContext = context;
        mHostDenyList = context.getResources().getStringArray(
                com.android.internal.R.array.config_usbHostDenylist);
        mUsbAlsaManager = alsaManager;
        mPermissionManager = permissionManager;

        String handlerComponent = context.getResources().getString(
                com.android.internal.R.string.config_UsbDeviceConnectionHandling_component);
        if (!TextUtils.isEmpty(handlerComponent)) {
            setUsbDeviceConnectionHandler(
                    ComponentName.unflattenFromString(handlerComponent));
        }
    }

  1. Definición de lista de exclusión en config.xml
    <!-- Rutas de buses USB host a excluir del soporte. Por ejemplo, si el primer
         bus USB del dispositivo se usa para comunicación con el módem u otro hardware
         restringido, añadir "/dev/bus/usb/001/" a esta lista. Si está vacía,
         no se excluirá ninguna parte del bus USB host.
    -->
    <string-array name="config_usbHostDenylist" translatable="false">
    </string-array>

Etiquetas: Android USB USB Host java Android Framework

Publicado el 6-12 18:36