OpenWorld Forum 2012      Android System                                                              Free Electrons      ...
Maxime Ripard                   Embedded Linux engineer and trainer at Free Electrons since                   2011        ...
Why Modify Android ?                   Because we have a custom set of functions on a given device                   that ...
The Android StackFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://...
Devices in the Source Tree                   The build system is using a configuration mechanism based on                  ...
Product, devices and boardsFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and suppor...
Defining new products                   Devices are well supported by the Android build system. It                   allows...
Our New Product                   AndroidProducts.mk                   PRODUCT_MAKEFILES +=                            $(L...
Add a New Component                   The integration of new components into the build system are                   done t...
Add a New Library                   Create a new subfolder under the                   device/company/product/lib folder  ...
Steps to add the libusb                   The first step is obviously to untar the source code in the                   dev...
Library Makefile          LOCAL_PATH:= $(call my-dir)          include $(CLEAR_VARS)          LOCAL_SRC_FILES :=           ...
Next steps                   The libusb uses the device files under the folder                   /dev/bus/usb, that are onl...
Modify the permissions of the device files                   Permissions on the files are the enforced thanks to two        ...
Integrate a binary that uses the libusb          LOCAL_PATH := $(call my-dir)          include $(CLEAR_VARS)          LOCA...
JNI Bindings                   A Java framework to call and be called by native applications                   written in ...
Libusb bindings                   Create a new subfolder under                   device/company/device/framework/USBFramew...
Libusb bindings          static struct libusb_device_handle *devh;          JNIEXPORT void JNICALL Java_com_fe_USB_init(JN...
Android.mk for the bindings          LOCAL_PATH := $(call my-dir)          include $(CLEAR_VARS)          LOCAL_SRC_FILES:...
Java Framework          package com.fe;          class USB {              private native void init();                    p...
Android.mk for the framework          LOCAL_PATH := $(call my-dir)          include $(CLEAR_VARS)          LOCAL_SRC_FILES...
Permissions file          <?xml version="1.0" encoding="utf-8"?>          <permissions>              <library name="com.fe....
Applications using that code                   Any applications can now use the part of the framework we                  ...
Android Manifest          <?xml version="1.0" encoding="utf-8"?>          <manifest                xmlns:android="http://s...
Questions?                                                 Maxime Ripard                                maxime.ripard@free...
Upcoming SlideShare
Loading in …5
×

OWF12/PAUG Conf Days Android system development, maxime ripard, free electrons

4,447 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
4,447
On SlideShare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
22
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

OWF12/PAUG Conf Days Android system development, maxime ripard, free electrons

  1. 1. OpenWorld Forum 2012 Android System Free Electrons Development Embedded Linux Developers Maxime Ripard Free Electrons maxime.ripard@free- electrons.comFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 1/25
  2. 2. Maxime Ripard Embedded Linux engineer and trainer at Free Electrons since 2011 Embedded Linux development: kernel and driver development, system integration, boot time and power consumption optimization, consulting, etc. Embedded Linux training, Linux driver development training and Android system development training, with materials freely available under a Creative Commons license. http://www.free-electrons.com Contributor to various open-source projects: Barebox, Linux, Buildroot Living in Toulouse, south west of FranceFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 2/25
  3. 3. Why Modify Android ? Because we have a custom set of functions on a given device that isn’t handled by the vanilla Android Because we want to add a different UI/set of features than AOSP Because since we have access to the source code, we can!Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 3/25
  4. 4. The Android StackFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 4/25
  5. 5. Devices in the Source Tree The build system is using a configuration mechanism based on various layer of hardware design The upper layer, the product is typically the one we want to build a system for The build system has no other configuration mechanism: no Kconfig, text file, or any other mecanism that can be easily modifiedFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 5/25
  6. 6. Product, devices and boardsFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 6/25
  7. 7. Defining new products Devices are well supported by the Android build system. It allows to build multiple devices with the same source tree, to have a per-device configuration, etc. All the product definitions should be put in device/<company>/<device> The entry point is the AndroidProducts.mk file, which should define the PRODUCT_MAKEFILES variable This variable defines where the actual product definitions are located. It follows such an architecture because you can have several products using the same device If you want your product to appear in the lunch menu, you need to create a vendorsetup.sh file in the device directory, with the right calls to add_lunch_comboFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 7/25
  8. 8. Our New Product AndroidProducts.mk PRODUCT_MAKEFILES += $(LOCAL_DIR)/full_product.mk full_product.mk $(call inherit-product, build/target/product/generic.mk) PRODUCT_NAME := full_MyDevice PRODUCT_DEVICE := MyDevice PRODUCT_MODEL := Full flavor of My Brand New Device vendorsetup.sh add_lunch_combo full_product-engFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 8/25
  9. 9. Add a New Component The integration of new components into the build system are done through Android.mk files These files just contains where the source code is and what the expected result should be: an executable, a shared library, a jar file, etc. All the build magic is abstracted by the build systemFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 9/25
  10. 10. Add a New Library Create a new subfolder under the device/company/product/lib folder This folder will contain the source code in itself, plus the headers and the Android.mk file To include a new package into a given build, you need to add the package name to the content of the PRODUCT_PACKAGES variable Let’s use the libusb as an exampleFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 10/25
  11. 11. Steps to add the libusb The first step is obviously to untar the source code in the device/company/product/lib/libusb folder Since the Android build system doesn’t rely at all on external build tools, we have some bits that are missing The first one is that the source code is missing the config.h header file, that is usually generated with the autoconf tool, through the ./configure command When we try to compile, it lacks two things: the TIMESPEC_TO_TIMEVAL macro and the timerfd.h header The first one should be declared by the c library, let’s add the macro declaration where the source code is using it The timerfd.h file is one of the header exposed by the Linux Kernel. It is not in the headers found in the toolchain used by Android though, so we will need to disable the use of such feature through the command ./configure --disable-timerfdFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 11/25
  12. 12. Library Makefile LOCAL_PATH:= $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := core.c descriptor.c io.c sync.c os/linux_usbfs.c LOCAL_C_INCLUDES += $(LOCAL_PATH)/os LOCAL_MODULE:= libusb LOCAL_MODULE_TAGS:= optional LOCAL_PRELINK_MODULE:= false include $(BUILD_SHARED_LIBRARY)Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 12/25
  13. 13. Next steps The libusb uses the device files under the folder /dev/bus/usb, that are only readable by the root user and the usb group. The device files creations are handled by the init application, so that when a new device appears on the system, its associated device files will be created as well The specific part of init that handles these files is called ueventd It uses a set of rules to create device files with the correct permissions at runtime If we want to use a binary running as user and that has access to the USB devices, we’ll have to modify these permissionsFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 13/25
  14. 14. Modify the permissions of the device files Permissions on the files are the enforced thanks to two components: Permissions on files on the system are defined in a C header: android_filesystem_config.h Permissions for device files are handled by ueventd that uses a file called ueventd.rc We can modify the permissions on the device files by adding or modifying a ueventd.rc file /dev/bus/usb/* 0666 root usbFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 14/25
  15. 15. Integrate a binary that uses the libusb LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= usb_bin.c LOCAL_C_INCLUDES += $(JNI_H_INCLUDE) device/company/device/lib/libusb LOCAL_SHARED_LIBRARIES := libusb LOCAL_MODULE := usbbin LOCAL_MODULE_TAGS := optional LOCAL_PRELINK_MODULE := false include $(BUILD_EXECUTABLE)Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 15/25
  16. 16. JNI Bindings A Java framework to call and be called by native applications written in other languages Mostly used for: Writing Java bindings to C/C++ libraries Accessing platform-specific features Writing high-performance sections It is used extensively across the Android userspace to interface between the Java Framework and the native daemons Since Gingerbread, you can develop apps in a purely native way, possibly calling Java methods through JNIFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 16/25
  17. 17. Libusb bindings Create a new subfolder under device/company/device/framework/USBFramework/jni Write the JNI bindings so that the Java can call functions from the libusbFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 17/25
  18. 18. Libusb bindings static struct libusb_device_handle *devh; JNIEXPORT void JNICALL Java_com_fe_USB_init(JNIEnv *env, jobject obj) { ret = libusb_init(NULL); if (ret < 0) return ret; devh = libusb_open_device_with_vid_pid(NULL, 0xdead, 0xbeef); if (!devh) { libusb_exit(NULL); return -EINVAL; } return 0; }Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 18/25
  19. 19. Android.mk for the bindings LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES:= usb_jni.c LOCAL_C_INCLUDES += $(JNI_H_INCLUDE) device/company/device/lib/libusb LOCAL_SHARED_LIBRARIES := libusb LOCAL_MODULE := libusb_jni LOCAL_MODULE_TAGS := optional LOCAL_PRELINK_MODULE := false include $(BUILD_SHARED_LIBRARY)Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 19/25
  20. 20. Java Framework package com.fe; class USB { private native void init(); public USB() { init(); } static { System.loadLibrary("usb_jni"); } }Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 20/25
  21. 21. Android.mk for the framework LOCAL_PATH := $(call my-dir) include $(CLEAR_VARS) LOCAL_SRC_FILES := $(call all-subdir-java-files) LOCAL_MODULE_TAGS := optional LOCAL_MODULE:= com.fe.usb include $(BUILD_JAVA_LIBRARY)Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 21/25
  22. 22. Permissions file <?xml version="1.0" encoding="utf-8"?> <permissions> <library name="com.fe.usb" file="/system/framework/com.fe.usb.jar"/> </permissions>Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 22/25
  23. 23. Applications using that code Any applications can now use the part of the framework we just added, using a regular Java call However, by default, the jar file generated won’t be loaded by dalvik, resulting in a error at runtime. You need to add extra bits to the manifest file so that both the Play Store and Dalvik knows that you need the given jar file to work properly You need to add the <uses-library> XML tagFree Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 23/25
  24. 24. Android Manifest <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.fe.usb"> <application android:icon="@drawable/icon" android:label="@string/app_name"> ... <uses-library android:name="com.fe.usb" android:required="true" /> </application> </manifest>Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 24/25
  25. 25. Questions? Maxime Ripard maxime.ripard@free-electrons.com Slides under CC-BY-SA 3.0.Free Electrons. Kernel, drivers and embedded Linux development, consulting, training and support. http://free-electrons.com 25/25

×