Ruta del código: frameworks/basse/services/usb/java/com/android/server/usb/UsbHostManager.java
- 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;
}
- 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;
}
- 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));
}
}
- 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>