xref: /aosp_15_r20/external/libusb/android/README (revision 86b64dcb59b3a0b37502ecd56e119234366a6f7e)
1*86b64dcbSAndroid Build Coastguard Workerlibusb for Android
2*86b64dcbSAndroid Build Coastguard Worker==================
3*86b64dcbSAndroid Build Coastguard Worker
4*86b64dcbSAndroid Build Coastguard WorkerBuilding:
5*86b64dcbSAndroid Build Coastguard Worker---------
6*86b64dcbSAndroid Build Coastguard Worker
7*86b64dcbSAndroid Build Coastguard WorkerTo build libusb for Android do the following:
8*86b64dcbSAndroid Build Coastguard Worker
9*86b64dcbSAndroid Build Coastguard Worker 1. Download the latest NDK from:
10*86b64dcbSAndroid Build Coastguard Worker    http://developer.android.com/tools/sdk/ndk/index.html
11*86b64dcbSAndroid Build Coastguard Worker
12*86b64dcbSAndroid Build Coastguard Worker 2. Extract the NDK.
13*86b64dcbSAndroid Build Coastguard Worker
14*86b64dcbSAndroid Build Coastguard Worker 3. Open a shell and make sure there exist an NDK global variable
15*86b64dcbSAndroid Build Coastguard Worker    set to the directory where you extracted the NDK.
16*86b64dcbSAndroid Build Coastguard Worker
17*86b64dcbSAndroid Build Coastguard Worker 4. Change directory to libusb's "android/jni"
18*86b64dcbSAndroid Build Coastguard Worker
19*86b64dcbSAndroid Build Coastguard Worker 5. Run "$NDK/ndk-build".
20*86b64dcbSAndroid Build Coastguard Worker
21*86b64dcbSAndroid Build Coastguard WorkerThe libusb library, examples and tests can then be found in:
22*86b64dcbSAndroid Build Coastguard Worker    "android/libs/$ARCH"
23*86b64dcbSAndroid Build Coastguard Worker
24*86b64dcbSAndroid Build Coastguard WorkerWhere $ARCH is one of:
25*86b64dcbSAndroid Build Coastguard Worker    armeabi
26*86b64dcbSAndroid Build Coastguard Worker    armeabi-v7a
27*86b64dcbSAndroid Build Coastguard Worker    mips
28*86b64dcbSAndroid Build Coastguard Worker    mips64
29*86b64dcbSAndroid Build Coastguard Worker    x86
30*86b64dcbSAndroid Build Coastguard Worker    x86_64
31*86b64dcbSAndroid Build Coastguard Worker
32*86b64dcbSAndroid Build Coastguard WorkerInstalling:
33*86b64dcbSAndroid Build Coastguard Worker-----------
34*86b64dcbSAndroid Build Coastguard Worker
35*86b64dcbSAndroid Build Coastguard WorkerIf you wish to use libusb from native code in own Android application
36*86b64dcbSAndroid Build Coastguard Workerthen you should add the following line to your Android.mk file:
37*86b64dcbSAndroid Build Coastguard Worker
38*86b64dcbSAndroid Build Coastguard Worker  include $(PATH_TO_LIBUSB_SRC)/android/jni/libusb.mk
39*86b64dcbSAndroid Build Coastguard Worker
40*86b64dcbSAndroid Build Coastguard WorkerYou will then need to add the following lines to the build
41*86b64dcbSAndroid Build Coastguard Workerconfiguration for each native binary which uses libusb:
42*86b64dcbSAndroid Build Coastguard Worker
43*86b64dcbSAndroid Build Coastguard Worker  LOCAL_C_INCLUDES += $(LIBUSB_ROOT_ABS)
44*86b64dcbSAndroid Build Coastguard Worker  LOCAL_SHARED_LIBRARIES += libusb1.0
45*86b64dcbSAndroid Build Coastguard Worker
46*86b64dcbSAndroid Build Coastguard WorkerThe Android build system will then correctly include libusb in the
47*86b64dcbSAndroid Build Coastguard Workerapplication package (APK) file, provided ndk-build is invoked before
48*86b64dcbSAndroid Build Coastguard Workerthe package is built.
49*86b64dcbSAndroid Build Coastguard Worker
50*86b64dcbSAndroid Build Coastguard Worker
51*86b64dcbSAndroid Build Coastguard WorkerRuntime Permissions:
52*86b64dcbSAndroid Build Coastguard Worker--------------------
53*86b64dcbSAndroid Build Coastguard Worker
54*86b64dcbSAndroid Build Coastguard WorkerThe Runtime Permissions on Android can be transferred from Java to Native
55*86b64dcbSAndroid Build Coastguard Workerover the following approach:
56*86b64dcbSAndroid Build Coastguard Worker
57*86b64dcbSAndroid Build Coastguard Worker  JAVA:
58*86b64dcbSAndroid Build Coastguard Worker
59*86b64dcbSAndroid Build Coastguard Worker   --> Obtain USB permissions over the android.hardware.usb.UsbManager class
60*86b64dcbSAndroid Build Coastguard Worker
61*86b64dcbSAndroid Build Coastguard Worker      usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
62*86b64dcbSAndroid Build Coastguard Worker      HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
63*86b64dcbSAndroid Build Coastguard Worker      for (UsbDevice usbDevice : deviceList.values()) {
64*86b64dcbSAndroid Build Coastguard Worker          usbManager.requestPermission(usbDevice, mPermissionIntent);
65*86b64dcbSAndroid Build Coastguard Worker      }
66*86b64dcbSAndroid Build Coastguard Worker
67*86b64dcbSAndroid Build Coastguard Worker   --> Get the native FileDescriptor of the UsbDevice and transfer it to
68*86b64dcbSAndroid Build Coastguard Worker       Native over JNI or JNA
69*86b64dcbSAndroid Build Coastguard Worker
70*86b64dcbSAndroid Build Coastguard Worker      UsbDeviceConnection usbDeviceConnection = usbManager.openDevice(camDevice);
71*86b64dcbSAndroid Build Coastguard Worker      int fileDescriptor = usbDeviceConnection.getFileDescriptor();
72*86b64dcbSAndroid Build Coastguard Worker
73*86b64dcbSAndroid Build Coastguard Worker   --> JNA sample method:
74*86b64dcbSAndroid Build Coastguard Worker
75*86b64dcbSAndroid Build Coastguard Worker      JNA.INSTANCE.set_the_native_Descriptor(fileDescriptor);
76*86b64dcbSAndroid Build Coastguard Worker
77*86b64dcbSAndroid Build Coastguard Worker  NATIVE:
78*86b64dcbSAndroid Build Coastguard Worker
79*86b64dcbSAndroid Build Coastguard Worker   --> Initialize libusb on Android
80*86b64dcbSAndroid Build Coastguard Worker
81*86b64dcbSAndroid Build Coastguard Worker      set_the_native_Descriptor(int fileDescriptor) {
82*86b64dcbSAndroid Build Coastguard Worker          libusb_context *ctx;
83*86b64dcbSAndroid Build Coastguard Worker          libusb_device_handle *devh;
84*86b64dcbSAndroid Build Coastguard Worker          libusb_set_option(&ctx, LIBUSB_OPTION_NO_DEVICE_DISCOVERY, NULL);
85*86b64dcbSAndroid Build Coastguard Worker          libusb_init(&ctx);
86*86b64dcbSAndroid Build Coastguard Worker          libusb_wrap_sys_device(NULL, (intptr_t)fileDescriptor, &devh);
87*86b64dcbSAndroid Build Coastguard Worker      }
88*86b64dcbSAndroid Build Coastguard Worker      /* From this point you can regularly use all libusb functions as usual */
89*86b64dcbSAndroid Build Coastguard Worker
90*86b64dcbSAndroid Build Coastguard Worker   About LIBUSB_OPTION_NO_DEVICE_DISCOVERY:
91*86b64dcbSAndroid Build Coastguard Worker
92*86b64dcbSAndroid Build Coastguard Worker    The method libusb_set_option(&ctx, LIBUSB_OPTION_NO_DEVICE_DISCOVERY, NULL)
93*86b64dcbSAndroid Build Coastguard Worker    does not affect the ctx.
94*86b64dcbSAndroid Build Coastguard Worker    It allows initializing libusb on unrooted Android devices by skipping
95*86b64dcbSAndroid Build Coastguard Worker    the device enumeration.
96*86b64dcbSAndroid Build Coastguard Worker
97*86b64dcbSAndroid Build Coastguard WorkerRooted Devices:
98*86b64dcbSAndroid Build Coastguard Worker---------------
99*86b64dcbSAndroid Build Coastguard Worker
100*86b64dcbSAndroid Build Coastguard Worker    For rooted devices the code using libusb could be executed as root
101*86b64dcbSAndroid Build Coastguard Worker    using the "su" command. An alternative would be to use the "su" command
102*86b64dcbSAndroid Build Coastguard Worker    to change the permissions on the appropriate /dev/bus/usb/ files.
103*86b64dcbSAndroid Build Coastguard Worker
104*86b64dcbSAndroid Build Coastguard Worker    Users have reported success in using android.hardware.usb.UsbManager
105*86b64dcbSAndroid Build Coastguard Worker    to request permission to use the UsbDevice and then opening the
106*86b64dcbSAndroid Build Coastguard Worker    device. The difficulties in this method is that there is no guarantee
107*86b64dcbSAndroid Build Coastguard Worker    that it will continue to work in the future Android versions, it
108*86b64dcbSAndroid Build Coastguard Worker    requires invoking Java APIs and running code to match each
109*86b64dcbSAndroid Build Coastguard Worker    android.hardware.usb.UsbDevice to a libusb_device.
110*86b64dcbSAndroid Build Coastguard Worker
111*86b64dcbSAndroid Build Coastguard Worker    For a rooted device it is possible to install libusb into the system
112*86b64dcbSAndroid Build Coastguard Worker    image of a running device:
113*86b64dcbSAndroid Build Coastguard Worker
114*86b64dcbSAndroid Build Coastguard Worker     1. Enable ADB on the device.
115*86b64dcbSAndroid Build Coastguard Worker
116*86b64dcbSAndroid Build Coastguard Worker     2. Connect the device to a machine running ADB.
117*86b64dcbSAndroid Build Coastguard Worker
118*86b64dcbSAndroid Build Coastguard Worker     3. Execute the following commands on the machine
119*86b64dcbSAndroid Build Coastguard Worker        running ADB:
120*86b64dcbSAndroid Build Coastguard Worker
121*86b64dcbSAndroid Build Coastguard Worker        # Make the system partition writable
122*86b64dcbSAndroid Build Coastguard Worker        adb shell su -c "mount -o remount,rw /system"
123*86b64dcbSAndroid Build Coastguard Worker
124*86b64dcbSAndroid Build Coastguard Worker        # Install libusb
125*86b64dcbSAndroid Build Coastguard Worker        adb push obj/local/armeabi/libusb1.0.so /sdcard/
126*86b64dcbSAndroid Build Coastguard Worker        adb shell su -c "cat > /system/lib/libusb1.0.so < /sdcard/libusb1.0.so"
127*86b64dcbSAndroid Build Coastguard Worker        adb shell rm /sdcard/libusb1.0.so
128*86b64dcbSAndroid Build Coastguard Worker
129*86b64dcbSAndroid Build Coastguard Worker        # Install the samples and tests
130*86b64dcbSAndroid Build Coastguard Worker        for B in listdevs fxload xusb sam3u_benchmark hotplugtest stress
131*86b64dcbSAndroid Build Coastguard Worker        do
132*86b64dcbSAndroid Build Coastguard Worker          adb push "obj/local/armeabi/$B" /sdcard/
133*86b64dcbSAndroid Build Coastguard Worker          adb shell su -c "cat > /system/bin/$B < /sdcard/$B"
134*86b64dcbSAndroid Build Coastguard Worker          adb shell su -c "chmod 0755 /system/bin/$B"
135*86b64dcbSAndroid Build Coastguard Worker          adb shell rm "/sdcard/$B"
136*86b64dcbSAndroid Build Coastguard Worker        done
137*86b64dcbSAndroid Build Coastguard Worker
138*86b64dcbSAndroid Build Coastguard Worker        # Make the system partition read only again
139*86b64dcbSAndroid Build Coastguard Worker        adb shell su -c "mount -o remount,ro /system"
140*86b64dcbSAndroid Build Coastguard Worker
141*86b64dcbSAndroid Build Coastguard Worker        # Run listdevs to
142*86b64dcbSAndroid Build Coastguard Worker        adb shell su -c "listdevs"
143*86b64dcbSAndroid Build Coastguard Worker
144*86b64dcbSAndroid Build Coastguard Worker     4. If your device only has a single OTG port then ADB can generally
145*86b64dcbSAndroid Build Coastguard Worker        be switched to using Wifi with the following commands when connected
146*86b64dcbSAndroid Build Coastguard Worker        via USB:
147*86b64dcbSAndroid Build Coastguard Worker
148*86b64dcbSAndroid Build Coastguard Worker        adb shell netcfg
149*86b64dcbSAndroid Build Coastguard Worker        # Note the wifi IP address of the phone
150*86b64dcbSAndroid Build Coastguard Worker        adb tcpip 5555
151*86b64dcbSAndroid Build Coastguard Worker        # Use the IP address from netcfg
152*86b64dcbSAndroid Build Coastguard Worker        adb connect 192.168.1.123:5555
153