workshop su android kernel hacking

34
Andrea Righi <[email protected]> Kernel Hacking on Android A quick look into the Android kernel...

Upload: develer-srl

Post on 11-May-2015

3.346 views

Category:

Technology


5 download

DESCRIPTION

Android è un argomento di grande interesse nel mondo dell'informatica ma lavorare sulla piattaforma non è semplice. Questo intervento avrà un taglio pratico e spiegherà come procurarsi gli strumenti per compilare un modulo kernel su android, come sviluppare un semplice modulo e come caricarlo sul dispositivo. Infine, si presenterà come creare un modulo più complesso usando delle API specifiche del kernel di Android. I sorgenti del workshop sono reperibili qui: https://github.com/arighi/mysuspend

TRANSCRIPT

Page 1: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Kernel Hacking on Android

A quick look into the Android kernel...

Page 2: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Agenda

● Overview● Android Programming● Android Power Management● Q/A

Page 3: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Overview

Page 4: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Introduction

● Android is a software stack for mobile devices, such as smartphones and tablet computers

● It is developed by the Open Handset Alliance led by Google

● Android was listed as the best-selling smartphone platform worldwide in Q4 2010 by Canalys

Page 5: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Android OS

● Android consists of a:● kernel (Linux, modified by Google)● userspace libraries and APIs written in C● an application framework (Dalvik Java Virtual

Machine)● application software running inside the application

framework

Page 6: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Page 7: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Android: kernel modifications

● binder: IPC (i.e., communication between window manager and client)

● ashmem: shared memory (process cache)

● pmem: physically contiguous memory allocator

● logger: custom system logging facility

● wakelock: power management (hold machine awake on a per-event basis until wakelock is released)

● early suspend: suspend/resume hooks to be called when user-visible sleep state change

● lowmemorykiller (aka Viking Killer): custom OOM killer tunable from userspace (memory thresholds and oom_adjust thresholds)

● alarm timers: RTC-based wakeup

● timed gpio: driver that allows userspace programs to access and manipulate gpio pins and restore their state automatically after a specified timeout

● ram console: store kernel log to a persistent RAM area, so that after a kernel panic it can be viewed via /proc/last_kmsg

● USB gadget driver (ADB)

● ...

Page 8: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Native libraries

● Bionic libc● Custom libc implementation, optimized for

embedded use (optimized for size)● Don't support certain POSIX features● Not compatible with GNU Libc (glibc)● Native code must linked against bionc libc (or

statically linked)

Page 9: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Android Programming

Page 10: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Programming model

● Android applications are written in Java● Class libraries are similar to Java SE but not equal● Dalvik VM is a register-based architecture that

dynamically translates from Java byte code into native architecture instructions

● However● It's still Linux, so we can build and run native Linux

applications● Use the JNI bridge to bind C functions into the Java

code

Page 11: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Android applications

● Applications are distributed as Android packages (.apk)

● Everything is needed to run an application is bundled inside the .apk

● Basically an “enhanced” ZIP file

Page 12: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Typical directory tree in Android

● / (initrd – ro)● /system (ro)

– /system/bin– /system/etc– /system/lib– /system/usr

● /data (applications data – rw)● /cache (applications cache – rw)● /mnt/sdcard (removable storage – rw)

Page 13: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Toolchain

● From http://developer.android.com● Android SDK

http://developer.android.com/sdk/index.html● Android NDK

http://developer.android.com/sdk/ndk/index.html

● From http://www.codesourcery.com● ARM toolchain to recompile the Linux kernel

(get the one targeted at “EABI”)https://sourcery.mentor.com/sgpp/lite/arm/portal/subscription3053

● ARM toolchain for native userspace applications(get the one targeted at "GNU/Linux")https://sourcery.mentor.com/sgpp/lite/arm/portal/subscription3057

Page 14: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Android emulator: goldfish

● The Android emulator runs a virtual CPU that Google calls Goldfish.

● Goldfish executes ARM926T instructions and has hooks for input and output -- such as reading key presses from or displaying video output in the emulator

● These interfaces are implemented in files specific tothe Goldfish emulator and will not be compiled into a kernel that runs on real devices.

Page 15: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Create an Android application# create a new projectandroid create project --package com.develer.hello --activity HelloAndroid \

--target 2 --path ./helloandroid

# build in release modeant release

# sign a apkjarsigner -verbose -keystore ~/certs/android.keystore \

./bin/HelloAndroid-unsigned.apk arighi

# align the apkzipalign -v 4 ./bin/HelloAndroid-unsigned.apk ./bin/HelloAndroid.apk

# installadb install ./bin/HelloAndroid.apk

# uninstalladb uninstall HelloAndroid

Page 16: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Create a native ARM application#include <stdio.h>

int main(int argc, char **argv){

printf(“Hello, world!\n”);return 0;

}

Build & run:

$ arm-none-linux-gnueabi-gcc -static -o hello hello.c

$ adb push hello /data/local/tmp/hello

$ adb shell chmod 777 /data/local/tmp/hello

$ adb shell /data/local/tmp/hello

Page 17: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Run a custom kernel(Android emulator)

$ git clone https://android.googlesource.com/kernel/goldfish

$ git checkout android-goldfish-2.6.29

$ export PATH=/opt/toolchain/arm-eabi-2011.03-42/bin:$PATH

$ make ARCH=arm CROSS_COMPILE=arm-none-eabi- goldfish_defconfig

$ make ARCH=arm CROSS_COMPILE=arm-none-eabi-

$ emulator -kernel arch/arm/boot/zImage -avd <AVD_NAME>

Page 18: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Android Power Management

Page 19: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Battery life

● The three most important considerations for mobile applications are:● battery life● battery life● and battery life

● After all, if the battery is dead, no one can use your application...

Page 20: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Typical use case

● Most of the time the device is in you pocket, completely in idle (suspend)

● You pull it ouf of your pocket maybe once, twice in a hour● Check the email, facebook, twitter, etc. for short

“bursts” of time

Page 21: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Android Power Management

● Android will opportunistically enter a full system suspend state

● This forcibly stops processes from running● Your battery last longer and your phone doesn't

melt in your pocket

Page 22: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Battery consumption

Page 23: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

CPU states

● Running● Idle● Deep sleep● Suspend● Powered off

Page 24: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Background activity

● Example, an application that periodically checks emails:● The device wakes up● Pulls up the radio stack● Does a DNS request● Does a network connection● Pulling down some data● Parsing data on the fly (cpu)● Takes a few seconds to the device to settle down and

fall to sleep mode again

Page 25: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Battery cost example

● Cost during a given hour● Full idle:

– 5mAh● Network stack + CPU:

– 350 mAh● Background app (i.e., network update)

– 6 times / h x 8 sec x 350 mAh => 4.67mAh

● Even a simple innocent background app can drain the battery life quickly

Page 26: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Wake locks

● Used by applications to prevent the system from entering suspend or low-power state

● Driver API● struct wake_lock name● wake_lock_init()/wake_lock()/wake_unlock()

● Userspace API● Write lockname (and optionally lockname timeout)

to /sys/power/wake_lock● Write lockname to /sys/power/wake_unlock

Page 27: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Wake locks

● Custom solution not integrated with the Linux Power Management (PM) subsystem

● Components make requests to keep the power on through “wake locks” (use wake locks carefully!!!)

● Support different types of wake locks:● FULL_WAKE_LOCK: cpu on, keyboard on, screen at full

brightness● PARTIAL_WAKE_LOCK: cpu on● SCREEN_DIM_WAKE_LOCK: screen on (but may be

dimmed), keyboard backlights allowed to go off● ...

Page 28: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Wake lock: Java interfacePowerManager pm = (PowerManager)mContext.getSystemService(

Context.POWER_SERVICE);PowerManager.WakeLock wl = pm.newWakeLock( PowerManager.SCREEN_DIM_WAKE_LOCK | PowerManager.ON_AFTER_RELEASE, TAG);wl.acquire(); // ...wl.release();

Page 29: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Early suspend

● Suspend / resume kernel hooks called when user-visible sleep states change

● User-space framework writes the state to /sys/power/request_state

Page 30: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Early suspend

static struct early_suspend _powersave_early_suspend = { .suspend = powersave_early_suspend, .resume = powersave_late_resume,};

register_early_suspend(&_powersave_early_suspend);

unregister_early_suspend(&_powersave_early_suspend);

Page 31: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Android alarm

● Tell the kernel when it should wake-up● hrtimer: when the system is running● RTC: when the system is suspended

Page 32: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Android alarm

static struct alarm my_alarm;

alarm_init(&my_alarm, ANDROID_ALARM_RTC_WAKEUP, my_alarm_handler);

alarm_start_range(&my_alarm, expire_start, expire_end);

alarm_cancel(&my_alarm);

Page 33: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

References

● Official Android developers website:● http://developer.android.com/

● Embedded Linux wiki (Android Portal):● http://elinux.org/Android_Portal

● The xda-developers forum:● http://www.xda-developers.com/

● mysuspend source code available at github.com:● https://github.com/arighi/mysuspend

Page 34: Workshop su Android Kernel Hacking

Andrea Righi <[email protected]>

Q/A

● You're very welcome!