Extending Android with New Devices         Android outside the mobile context    Shree Kumar                   Nitheesh K ...
Speaker Intro   Shree Kumar   InnoMinds Software                        Nitheesh K L                 PES Institute of Tech...
Background    • Android expected to proliferate           – Not just on smart-phones & tablets    • Android built with MID...
Overview    • Device support in Linux    • Layered approach for Android    • Two examples           – Joystick           –...
Linux Device Support                                                                              User App                ...
Our Android Approach                                User App (Java)                                                       ...
Example 1    • Supporting a USB Joystick    • Why this device ?           – Simplicity           – Map concepts to details...
Joystick : Step 1                                                            User App (Java)                              ...
Joystick : Step 2                                                        User App (Java)                                  ...
Joystick : Step 2 (contd)                                                      User App (Java)                            ...
Joystick : Step 3                                                        User App (Java)                                  ...
Joystick : Step 4                                                   User App (Java)                                       ...
Joystick : Step 4 (contd)                                                                 User App (Java)                 ...
Joystick : Step 4 (contd)                                                                    User App (Java)              ...
Joystick : Step 5                                                                       User App (Java)                   ...
Joystick : Step 6                                                                    User App (Java)                      ...
Joystick : Step 6 (contd)                                                                 User App (Java)                 ...
Joystick : Step 6 (contd)                                  User App (Java)                            Service Wrapper (opt...
Joystick : Overall                           User App (Java)                     Service Wrapper (optional)               ...
Example 2    • Barcode Scanner           – Opticon MDI 2300                   • 2D scanner           – Available as a modu...
Example 2    • Why use a dedicated device ?           – Supports tons of symbologies           – Purpose made             ...
Barcode Scanner : Step 1                                                                                                  ...
Barcode Scanner : Step 2                                                                     User App (Java)              ...
Barcode Scanner : Step 3                                                                                  User App (Java) ...
Barcode Scanner : Step 4                                                                                     User App (Jav...
Barcode Scanner : Step 5                                                                                     User App (Jav...
Barcode Scanner : Step 6                                                                 User App (Java)                  ...
Summary    • HOWTO-support-devices-on-android.txt           – Important steps           – Examples                   • Kep...
Questions ?      Shree                Nitheeshshree.shree@gmail.com   nitheeshkl@gmail.com
Upcoming SlideShare
Loading in …5
×

Extending Android with New Devices

8,697 views

Published on

Shows how a device maker can extend Android to support new devices, while preserving Android compatibility. We demonstrate a joystick & an industrial barcode scanner.

Published in: Technology, Education
0 Comments
5 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total views
8,697
On SlideShare
0
From Embeds
0
Number of Embeds
540
Actions
Shares
0
Downloads
131
Comments
0
Likes
5
Embeds 0
No embeds

No notes for slide

Extending Android with New Devices

  1. 1. Extending Android with New Devices Android outside the mobile context Shree Kumar Nitheesh K L InnoMinds Software PES Institute of Technology
  2. 2. Speaker Intro Shree Kumar InnoMinds Software Nitheesh K L PES Institute of Technology
  3. 3. Background • Android expected to proliferate – Not just on smart-phones & tablets • Android built with MID devices in mind – Newer use cases => other devices – Changing the API is not permitted • New devices, Additional APIs !Extending Android with New Devices | DroidCon India 2011
  4. 4. Overview • Device support in Linux • Layered approach for Android • Two examples – Joystick – Industrial Barcode Scanner • Device Maker’s Perspective – Standardized interfaces may not happen due to schedules – Market compatibility providedExtending Android with New Devices | DroidCon India 2011
  5. 5. Linux Device Support User App Device API setuid() Privileged Daemon setgid() Device udev Node Kernel SUBSYSTEMS="usb",ATTRS(idVendor)=="0bb4",MODE="0666",OWNER="shree" SUBSYSTEMS="usb",ATTRS(idVendor)=="8086",MODE="0666",OWNER="shree" Device Linux devs : Remember adding these lines to /etc/udev/rules.d/51-android.rules?Extending Android with New Devices | DroidCon India 2011
  6. 6. Our Android Approach User App (Java) uses-permission=USE_DEVICE Service Wrapper (optional) uses-library=sample_device Privileged Service (Java) Platform Library Preserves Android sharedUserId=android.uid.system JNI Interface Compatibility ueventd Device Node Kernel chown USER:GROUP /dev/XYZ mknod /dev/XYZ chmod 0ppp /dev/XYZ DeviceExtending Android with New Devices | DroidCon India 2011
  7. 7. Example 1 • Supporting a USB Joystick • Why this device ? – Simplicity – Map concepts to details • You need – Android device with USB host/OTGExtending Android with New Devices | DroidCon India 2011
  8. 8. Joystick : Step 1 User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node • Kernel drivers Kernel Device – Defaults to HID raw driver present – Boot & Check • Device node – /dev/input/eventX $ cat /proc/bus/input/devices | grep ^[NH] | grep –A 1 Gamepad > | grep event N: Logitech Precision Gamepad H: Handlers=event15
  9. 9. Joystick : Step 2 User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node Kernel Device• Interface to the device node fd = open(“/dev/input/event15”, O_RDONLY); – Read /dev/input/eventX • Get single key code per event – ev.code : scan code – ev.value : key down/up struct input_event ev; rd = read (fd, &ev, sizeof(struct input_event);
  10. 10. Joystick : Step 2 (contd) User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface• Wrap native code using JNI ueventd Device Node Kernel Devicestatic const JNINativeMethod gMethods[] = { {“open”, “()Z”, (void *)Java_Joystick_open}, {“getKey”, “()I”, (void *)Java_Joystick_getKey}, {“close”, “()V”, (void *)Java_Joystick_close},};Jint JNI_OnLoad(JavaVM* vm, void* reserved) { //register your methods ...}• Android.mk – generate lib LOCAL_MODULE := libsample_joystick
  11. 11. Joystick : Step 3 User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node• Permission for device node Kernel Device – <Android-src>/system/core/init/devices.cStatic struct perms_devperms[] = { ...{“/dev/input”, 0666, AID_SYSTEM, AID_INPUT, 1}, ...}$ls –l /dev/inputcrw-rw---- system input 13, 79 2011-11-18 14:05 event15crw-rw---- system input 13, 79 2011-11-18 14:05 event11crw-rw---- system input 13, 79 2011-11-18 14:05 event4 ... – Ueventd.rc
  12. 12. Joystick : Step 4 User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node• Service Wrapper around JNI Kernel Device | +---com | ---sample | +---hardware | | ---joystick | | JoystickAPI.aidl | | JoystickCallback.aidl | | Joystick.java | | Joystick.class | | | ---service | JoystickService.java | +---jni | Android.mk | Joystick.h | Joystick.cpp | Jsfunctions.h | Jsfunctions.cpp
  13. 13. Joystick : Step 4 (contd) User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node• Signed APK provides privileged access Kernel Device # we ask for restricted permissions for our service, # so the apk has to be signed LOCAL_CERTIFICATE := platform• Define permission in AndroidManifest.xml <permission android:name = “com.sample.USE_JOYSTICK” />
  14. 14. Joystick : Step 4 (contd) User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node Kernel• IPC service exposes API to applications Device – …/ JoystickAPI.aidl interface JoystickAPI { boolean setCallback(in JoystickCallback cb); boolean clearCallback(); } – … / JoystickService.java Private JoystickAPI.Stub api = new JoystickAPI.Stub(){ public boolean setCallback(JoystickCallback cb){ // enable setting callback } public boolean clearCallback(){ // enable clearing callback } }
  15. 15. Joystick : Step 5 User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node Kernel • Platform Library Device • Declare your library to the framework – /system/etc/permissions – com.sample.hardware.joystick.xml <?xml version="1.0" encoding="utf-8"?> <permissions> <library name="com.sample.hardware.joystick" file="/system/framework/com.sample.hardware.joystick.jar"/> </permissions> • Output product is raw .jar file, NOT a .apkadb push out/target/product/generic_x86/system/framework/com.sample.hardware.joystick.jar /system/framework
  16. 16. Joystick : Step 6 User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node• Application interacts with device Kernel Device – Binds to ServiceIntent intent = new Intent(“com.sample.android.service.JoystickService”);bindService(intent, serviceConnection, Service.BIND_AUTO_CREATE); – Uses API provided by ServiceServiceConnection sc = new ServiceConnection(){ private void onServiceConnected(ComponentName n, Ibinder service){ api = Ijoystick.stub.asInterface(service); try{ api.setCallback(jsCallback); }catch (RemoteException e){ } }}
  17. 17. Joystick : Step 6 (contd) User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node• Run on UI Thread Kernel Device JoystickCallback jsCallback = new JoystickCallback.Stub() { private void onKeyPress(int arg0) throws RemoteException { final int key = arg0; runOnUiThread(new Runnable(){ public void run(){ updateUI(key); } }); } };
  18. 18. Joystick : Step 6 (contd) User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node Kernel Device
  19. 19. Joystick : Overall User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node Kernel Device
  20. 20. Example 2 • Barcode Scanner – Opticon MDI 2300 • 2D scanner – Available as a module for developmentExtending Android with New Devices | DroidCon India 2011
  21. 21. Example 2 • Why use a dedicated device ? – Supports tons of symbologies – Purpose made • Fast • Long cables, Laser illumination – Would you drop your smart- phone ? Opticon symbology support, “Menubook” excerptExtending Android with New Devices | DroidCon India 2011 ZXing symbology support
  22. 22. Barcode Scanner : Step 1 User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node • Setup the device Kernel Device – We’ll use USB VCP (Virtual COM Port) mode – Scan barcodes! Barcodes vary by device.Excerpts from Sec 2-5 of Xenon 1900 User Guide USB VCP configuration for MDI 2300 | Screenshot from opticonfigure.opticon.comExtending Android with New Devices | DroidCon India 2011
  23. 23. Barcode Scanner : Step 2 User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node • Change the kernel Kernel Device – Specific steps depend on Android/kernel version – Include support for CDC ACM devices • Ensure support for protocol=“None” in cdc-acm.c /* control interfaces without any protocol set */ { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM, USB_CDC_PROTO_NONE) }, • Boot with the new kernel & checkExtending Android with New Devices | DroidCon India 2011
  24. 24. Barcode Scanner : Step 3 User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node • Interface to the driver Kernel Device – Read /dev/ttyACM0 – Get single barcode per line • Test… at every step • Wrap native code using JNI – Can an app use the wrapper ? # ls –l /dev/input* crw-r----- 1 system input 13, 64 2011-11-02 14:51 event0 crw-r----- 1 system input 13, 64 2011-11-02 14:51 event1Extending Android with New Devices | DroidCon India 2011
  25. 25. Barcode Scanner : Step 4 User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node • ueventd : fix /dev/ttyACM0 access Kernel Device – owner “system” (android.uid.system) /dev/ttyACM0 0660 system root Add this line to : system/core/rootdir/ueventd.rc – Another method: owner “com.sample.uid.acm” • Passes Android Compatibility ! mSettings.addSharedUserLP("android.uid.system", Process.SYSTEM_UID, ApplicationInfo.FLAG_SYSTEM); … mSettings.addSharedUserLP("com.sample.uid.acm", 1018, ApplicationInfo.FLAG_SYSTEM); frameworks/base/services/java/com/android/server/PackageManagerService.javaExtending Android with New Devices | DroidCon India 2011
  26. 26. Barcode Scanner : Step 5 User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node • Service Wrapper around JNI Kernel Device – AIDL based IPC service exposes API to applications interface IBarcodeScanner { boolean setCallback(in BarcodeScannerCallback callback); boolean scanBarcode(int timeout); boolean clearCallback(); }; Interface BarcodeScannerCallback { void handlerBarcode(boolean timedout, String barcode); } – Signed APK provides privileged access android:sharedUsedId=“android.uid.system”Extending Android with New Devices | DroidCon India 2011
  27. 27. Barcode Scanner : Step 6 User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node • Application interacts with device Kernel Device – Binds to Service – Uses API provided by Service • Could be beautified… – Unbinds when done!Extending Android with New Devices | DroidCon India 2011
  28. 28. Summary • HOWTO-support-devices-on-android.txt – Important steps – Examples • Kept simple on purpose – Skipped • Power Management • Deeper system integration – You may want to rethink the interfaces !Extending Android with New Devices | DroidCon India 2011
  29. 29. Questions ? Shree Nitheeshshree.shree@gmail.com nitheeshkl@gmail.com

×