0% found this document useful (0 votes)
16 views50 pages

Android System Services

Uploaded by

Thuấn Nguyễn
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
16 views50 pages

Android System Services

Uploaded by

Thuấn Nguyễn
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 50

Accessing Hardware on Android

FTF2014
04/08/2014

Gary Bisson
Embedded Software Engineer
SESSION OVERVIEW

1. Introduction

2. Native Development

3. Direct Access

4. Android HAL Layer

5. Custom System Service

6. Demonstrations

7. Conclusion
ABOUT THE PRESENTER

• Embedded Software Engineer at Adeneo Embedded


(Bellevue, WA)
I Linux / Android

♦ BSP Adaptation

♦ Driver Development
♦ System Integration
I Partners with Freescale
Introduction
Accessing HW on Android Introduction

ACCESSING THE HARDWARE

• How different from a GNU/Linux system?


I No difference for native dev

I What about Java applications?


• Android Architecture
I Android API

I SDK/NDK

5
Accessing HW on Android Introduction

ANDROID ARCHITECTURE

6
Accessing HW on Android Introduction

ACCESSING THE HARDWARE

Different ways of accessing devices from Android applications:


• Direct access from the application
I Either in the Java or JNI layer

• Using the available Android hardware API


I HAL adaptation

• Adding a custom System Service


I API modification

7
Native Development
Accessing HW on Android Native Development

WHAT IS IT?

• Different from JNI/NDK


I The word “native” in the NDK can be misleading as it

still involves all the limitations of Java applications


I NDK gives you access only to a very limited subset of
the Android API
• Native application/daemon/library: can be run directly on
the system without the full Java stack

9
Accessing HW on Android Native Development

NATIVE APPLICATION

• Can be built statically


I Avoids libc issues

I Not preferred solution though


• Can be built against Bionic
I Every binary/library in Android

I Some adaptation may be required

10
Accessing HW on Android Native Development

BIONIC VS. GLIBC

• C++
I No exception handling!
I No STL! (Standard Template Library)
• Libpthread
I Mutexes, condvars, etc. use Linux futexes

I No semaphores
I No pthread_cancel
• Misc
I No wchar_t and no LOCALE support

I No crypt()

11
Accessing HW on Android Native Development

BUILD A NATIVE APPLICATION

• Such applications can be found in AOSP:


I system/core/

I frameworks/base/cmds/
I external/
• Same as a Java application, an Android.mk must be
created:
1 LOCAL_PATH:= $(call my-dir)
2 include $(CLEAR_VARS)
3 LOCAL_MODULE := hello-world
4 LOCAL_MODULE_TAGS := optional
5 LOCAL_SRC_FILES := hello-world.cpp
6 LOCAL_SHARED_LIBRARIES := liblog
7 include $(BUILD_EXECUTABLE)

12
Accessing HW on Android Native Development

ADD A NATIVE APPLICATION

• If LOCAL_MODULE_TAGS is set as optional, the package


name must be registered in the device.mk
• Once built, the binary is copied to
<out_folder>/system/bin
• Modify init.rc to start the application at startup:
1 service myapp /system/bin/myapp
2 oneshot

13
Direct Access
Accessing HW on Android Direct Access

ACCESSING THE HARDWARE

• Using the user-space interface (devfs, sysfs...)


I Can be done either in Java or in Native C code

I Simple Open / Read / Write / Close to a “file”


I Every application that uses a specific hardware must
have code to handle it
• The correct permissions must be set
I The device node shall be opened by all users (not

allowed by default) or by the UID/GID of the relevant


application(s)
I init.rc or eventd.rc must be modified

15
Accessing HW on Android Direct Access

JAVA SAMPLE CODE

1 private void turnOnLed () throws IOException {


2 FileInputStream fileInputStream;
3 FileOutputStream fileOutputStream;
4 File file = new File("/sys/class/leds/led_usr1/brightness");
5 if (file.canRead()) {
6 fileInputStream = new FileInputStream(file);
7 if (fileInputStream.read() != '0') {
8 System.out.println("LED usr1 already on\n");
9 return;
10 }
11 }
12 if (file.canWrite()) {
13 fileOutputStream = new FileOutputStream(file);
14 fileOutputStream.write('1');
15 }
16 }

16
Android HAL Layer
Accessing HW on Android Android HAL Layer

HARDWARE API

• Android Hardware API is accessed through the


android.hardware class.
• This class only provides support for a limited number of
devices such as:
I Camera: used to set image capture settings, start/stop

preview, snap pictures, and retrieve frames for


encoding for video
I Sensors: accelerometer, gyroscope, magnetometers,
proximity, temperature...
• OEMs may provide their own HAL implementation to
connect to the android hardware API (see hardware/imx)

18
Accessing HW on Android Android HAL Layer

HARDWARE API

• USB Host and Accessory: android.hardware.usb:


I Provides support to communicate with USB hardware

peripherals that are connected to Android-powered


devices
• Input: android.hardware.input
I Provides information about input devices and

available key layouts


I New in API Level 16 (Jelly Bean)
• Other APIs:
I For instance the android.app.Notification can be

used to toggle a LED (if properly registered) with the


FLAG_SHOW_LIGHTS parameter

19
Accessing HW on Android Android HAL Layer

HARDWARE ABSTRACTION LAYER (HAL)

20
Accessing HW on Android Android HAL Layer

LIGHTS LIBRARY

• Interface defined in
hardware/libhardware/include/hardware/lights.h
• Library must be named lights.<product_name>.so
• Will get loaded from /system/lib/hw at runtime
• See example in hardware/imx/lights/
• Mandatory to have backlight managed by the OS.

21
Accessing HW on Android Android HAL Layer

CAMERA LIBRARY

• Interface defined in
hardware/libhardware/include/hardware/camera.h
• Library must be named camera.<product_name>.so
• Will get loaded from /system/lib/hw at runtime
• See example in hardware/imx/mx6/libcamera/

22
Accessing HW on Android Android HAL Layer

GPS LIBRARY

• Interface defined in
hardware/libhardware/include/hardware/gps.h
• Library must be named gps.<product_name>.so
• Will get loaded from /system/lib/hw at runtime
• See example in hardware/imx/libgps/

23
Accessing HW on Android Android HAL Layer

SENSORS LIBRARY

• Interface defined in
hardware/libhardware/include/hardware/sensors.h
• Library must be named sensors.<product_name>.so
• Will get loaded from /system/lib/hw at runtime
• See example in hardware/imx/libsensors/

24
Accessing HW on Android Android HAL Layer

EXAMPLE: ADDING A SENSOR

1. Kernel driver must be working and loaded


2. Change directory to hardware/imx/libsensors
3. Add Sensor definition into sSensorList structure in
sensors.cpp
I Applications will now be aware of a new sensor

I This structure define the following parameters


♦ Name

♦ Vendor
♦ Version
♦ Type (Proximity, Temperature etc…)
♦ ...

25
Accessing HW on Android Android HAL Layer

EXAMPLE: ADDING A SENSOR

4. Create object of new sensor


I Set file descriptor and event type

5. Update sensors_poll_context_t structure


6. Add new sensor case to handleToDriver function
7. Implement your class:
1 class AccelSensor : public SensorBase {
2 int mEnabled;
3 int setInitialState();
4 public:
5 AccelSensor();
6 virtual ~AccelSensor();
7 virtual int readEvents(sensors_event_t* data, int cnt);
8 virtual bool hasPendingEvents() const;
9 virtual int enable(int32_t handle, int enabled);
10 };

26
Accessing HW on Android Android HAL Layer

EXAMPLE: TESTING A SENSOR

• Use existing tool:


hardware/libhardware/tests/nusensors
I This binary tool will list every sensor and try to pull

data from it
• Use existing java application: AndroSensor
I www.appsapk.com/androsensor

• Create your own application


I Using SensorManager

I www.vogella.com/tutorials/AndroidSensor/article.html

27
Accessing HW on Android Android HAL Layer

EXAMPLE: SENSOR MANAGER


1 public class SensorActivity extends Activity, implements
SensorEventListener {
2 private final SensorManager mSensorManager;
3 private final Sensor mAccelerometer;
4 public SensorActivity() {
5 mSensorManager = (SensorManager)getSystemService(
SENSOR_SERVICE);
6 mAccelerometer = mSensorManager.getDefaultSensor(Sensor.
TYPE_ACCELEROMETER);
7 }
8 protected void onResume() {
9 super.onResume();
10 mSensorManager.registerListener(this, mAccelerometer,
SensorManager.SENSOR_DELAY_NORMAL);
11 }
12 [...]
13 public void onAccuracyChanged(Sensor sensor, int accuracy) {}
14 public void onSensorChanged(SensorEvent event) {}
15 }
28
Custom System Service
Accessing HW on Android Custom System Service

ANDROID SYSTEM SERVICES

• Service: component that performs long-running


operations in the background and does not provide a user
interface
• System Services vs. Local Service
I System Services accessible for all

I Access through getSystemService() method


I Permissions required

30
Accessing HW on Android Custom System Service

ANDROID SYSTEM SERVICES

31
Accessing HW on Android Custom System Service

MAIN SYSTEM SERVICES

• System Server
I All components contained in one process:

system_server
I Mostly made up of Java-coded services with few
written in C/C++
• Media Server
I All components contained in one process:

media-server
I These services are all coded in C/C++
• Appear to operate independently to anyone connecting to
them through Binder

32
Accessing HW on Android Custom System Service

ANDROID SYSTEM SERVICES

33
Accessing HW on Android Custom System Service

SERVICE MANAGER

• Service Manager = YellowPages book of all services


• Need to register every System Service to be usable
• Can list all services available: service list
• Application asks the Service Manager for a handle to the
Service and then invokes that service's methods

34
Accessing HW on Android Custom System Service

ADDING A SYSTEM SERVICE

1. Creation of the API layer for the System Service (aidl)


I Defines only exposed methods

I API added to SDK/add-on


2. Creation of a wrapper class for the Service interface
3. Creation of an implementation of that class
4. Creation of a JNI layer if needed

35
Accessing HW on Android Custom System Service

ADDING A SYSTEM SERVICE

1st approach:
• System Service inside the System Server
• Advantages:
I Part of the inner system

I First to be started
I System permissions
• Drawbacks:
I SDK creation required

36
Accessing HW on Android Custom System Service

ADDING A SYSTEM SERVICE

2nd approach:
• System Service outside of the System Server
• Advantages:
I No framework/ modification

I Located in one folder


I Easier to port from one version to another
I System permissions
I SDK add-on
• Drawbacks:
I Considered as a usual App

♦ System might remove it in case it runs out of RAM

37
Accessing HW on Android Custom System Service

ADDING A SYSTEM SERVICE

• Example:
I https://github.com/gibsson/BasicService

I https://github.com/gibsson/BasicClient
• Although SDK generation is possible, SDK add-on is
preferred:
I https://github.com/gibsson/basic_sdk_addon

38
Accessing HW on Android Custom System Service

BASIC SERVICE EXAMPLE

BasicService/
AndroidManifest.xml
Android.mk
src/com/gibsson/basic/service/
app/
BasicServiceApp.java
IBasicServiceImpl.java
lib/
BasicManager.java
com.gibsson.basic.service.lib.xml
IBasicService.aidl

39
Accessing HW on Android Custom System Service

AIDL EXAMPLE

1 /**
2 * System-private API for talking to the BasicService.
3 *
4 * {@hide}
5 */
6 interface IBasicService {
7 int getValue();
8 int setValue(int val);
9 }

40
Accessing HW on Android Custom System Service

WRAPPER CLASS EXAMPLE


1 public class BasicManager {
2 private static final String REMOTE_SERVICE_NAME = IBasicService
.class.getName();
3 private final IBasicService service;
4
5 public static BasicManager getInstance() {
6 return new BasicManager();
7 }
8
9 private BasicManager() {
10 this.service = IBasicService.Stub.asInterface(ServiceManager.
getService(REMOTE_SERVICE_NAME));
11 if (this.service == null) {
12 throw new IllegalStateException("Failed to find
IBasicService by name [" + REMOTE_SERVICE_NAME + "]");
13 }
14 }
15 [...]
16 }
41
Accessing HW on Android Custom System Service

IMPLEMENTATION EXAMPLE

1 class IBasicServiceImpl extends IBasicService.Stub {


2 private final Context context;
3 private int value;
4
5 IBasicServiceImpl(Context context) {
6 this.context = context;
7 }
8 protected void finalize() throws Throwable {
9 super.finalize();
10 }
11 public int getValue() {
12 return value;
13 }
14 public int setValue(int val) {
15 value = val + 4;
16 return 0;
17 }
18 }

42
Accessing HW on Android Custom System Service

IMPLEMENTATION APP EXAMPLE

1 public class BasicServiceApp extends Application {


2 private static final String REMOTE_SERVICE_NAME = IBasicService
.class.getName();
3 private IBasicServiceImpl serviceImpl;
4
5 public void onCreate() {
6 super.onCreate();
7 this.serviceImpl = new IBasicServiceImpl(this);
8 ServiceManager.addService(REMOTE_SERVICE_NAME, this.
serviceImpl);
9 }
10
11 public void onTerminate() {
12 super.onTerminate();
13 }
14 }

43
Demonstrations
Accessing HW on Android Demonstrations

HARDWARE SELECTION

• i.MX6Q SabreLite
• Android 4.3 Jelly Bean
• 10" LVDS display
• Could be any other device

45
Accessing HW on Android Demonstrations

DEMONSTRATIONS

• Demonstration #1
I Native app access

• Demonstration #2
I Direct JNI access

• Demonstration #3
I Using Sensor API

• Demonstration #4
I Custom System Service

46
Conclusion
Accessing HW on Android Conclusion

CONCLUSION

• Direct access from application


I Permission issue

• HAL modification
I Only few hardware targeted

• Adding a System Service


I Most complex but elegant way

• Solution depends on constraints

48
Accessing HW on Android Conclusion

QUESTIONS?

49
Accessing HW on Android Conclusion

REFERENCES

• Karim Yaghmour: Embedded Android


http://shop.oreilly.com/product/0636920021094.do
• Karim Yaghmour: Extending Android HAL
http://www.opersys.com/blog/extending-android-hal
• Marko Gargenta: Remixing Android
https://thenewcircle.com/s/post/1044/remixing_android
• Lars Vogel: Android Sensors
http://www.vogella.com/tutorials/AndroidSensor/article.html

50

You might also like