Your SlideShare is downloading. ×
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Extending Android with New Devices
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×
Saving this for later? Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime – even offline.
Text the download link to your phone
Standard text messaging rates apply

Extending Android with New Devices

7,314

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.

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
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
7,314
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
118
Comments
0
Likes
4
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. Extending Android with New Devices Android outside the mobile context Shree Kumar Nitheesh K L InnoMinds Software PES Institute of Technology
  • 2. Speaker Intro Shree Kumar InnoMinds Software Nitheesh K L PES Institute of Technology
  • 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. Joystick : Step 6 (contd) User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node Kernel Device
  • 19. Joystick : Overall User App (Java) Service Wrapper (optional) Privileged Service (Java) JNI Interface ueventd Device Node Kernel Device
  • 20. Example 2 • Barcode Scanner – Opticon MDI 2300 • 2D scanner – Available as a module for developmentExtending Android with New Devices | DroidCon India 2011
  • 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. 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. 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. 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. 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. 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. 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. 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. Questions ? Shree Nitheeshshree.shree@gmail.com nitheeshkl@gmail.com

×