Android OS Porting: Introduction

jollen 12,175 views 66 slides Jun 24, 2009
Slide 1
Slide 1 of 66
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27
Slide 28
28
Slide 29
29
Slide 30
30
Slide 31
31
Slide 32
32
Slide 33
33
Slide 34
34
Slide 35
35
Slide 36
36
Slide 37
37
Slide 38
38
Slide 39
39
Slide 40
40
Slide 41
41
Slide 42
42
Slide 43
43
Slide 44
44
Slide 45
45
Slide 46
46
Slide 47
47
Slide 48
48
Slide 49
49
Slide 50
50
Slide 51
51
Slide 52
52
Slide 53
53
Slide 54
54
Slide 55
55
Slide 56
56
Slide 57
57
Slide 58
58
Slide 59
59
Slide 60
60
Slide 61
61
Slide 62
62
Slide 63
63
Slide 64
64
Slide 65
65
Slide 66
66

About This Presentation

Introduction to Android OS Porting and the highlights.


Slide Content

Android Porting
E??~+?
by Jollen Chen€Ó²ƒ
email: [email protected]
blog: jollen.org/blog
plurk: www.plurk.com/jollenchen
z®Ãj(}« 6D•Ð~4B(9¯vE),lî
zÛœj??Ú g_ƒÛ
Text
Text
www.jollen.tw
ôlj

• Section 1. E”+eêVeAndroid Kernel
www.jolle.tw

Android porting, ? Android ?Q+Y hardware
E?g4&
‣m product ±ÕejÞHI
‣V?LYE?
‣???
Android Porting

Application (API)
Product
Framework / Library
Android kernelAndroid Porting ??4&

m new producteÜG Android
‣cupcake ?jYV? armv4/armv5/x86
API Level
‣! Android HI
Vanilla Kernel Configs
‣Android framework ???
Non-Vanilla Kernel
‣Merge Android framework ???
Android Porting: ”\`Y,

]?????
‣L? Android frameworke] library
?? Android framework ???
‣ASHMEMewakelock
] shared library
‣L? Android framework
V?YE?
‣case study: FreeRunner
Android Porting: ??

2007.11.5: Android /$
2007.11.12: Adnroid SDK €early look versionšóh1
2008.1.3: Adnroid Developer Challenge ????
2008.2.13: Android SDK m5-rc15 Q
2008.5.12: Top 50 Android Application ?1System Image API Level Release
Android 1.5 3 2009.4.27
Android 1.1 2 2009.2.10
Android 1.0 1 2008.9.23
API Level

Phone
Netbook
Devices
ARMv4/v5
x86
misc...

MMSp?
WebView šÕj Touch events
WebView ?j SquirrelFish (JavaScript engine)
]Y IME
Basic x86 support
SIM Application Toolkit 1.0
...
Cupcake Y- 

android-porting ?

android.git.kernel.org
1. Cupcake M?] x86 ports
2. ?./.repo/manifest.xml ]
eee_701 platform _{?? x86 ports
Android Source Code

git.koolu.org
?Y armv4 E?_ Koolu _{
?j s3c2410 / s3c244x
??? Neo FreeRunner
Android / armv4 YE?

h1 Android / armv4 E”$ mkdir koolu-android
$ cd koolu-android
$ repo init -u git://git.koolu.org/freerunner/platform/manifest.git -b koolu-1.0
$ repo sync

Media Framework
Surface Manager
Shared Libraries
Applications
Application Framework
Dalvik VM
System
Image
change
Linux Kernel Application Developers

Product Branch MaintainerMedia Framework
Surface Manager
Shared Libraries
Applications
Application Framework
Dalvik VM
Linux Kernel
rebuild

Hardware DevelopingMedia Framework
Surface Manager
Shared Libraries
Applications
Application Framework
Dalvik VM
Linux Kernel
change
change

Architecture PortingMedia Framework
Surface Manager
Shared Libraries
Applications
Application Framework
Dalvik VM
Linux Kernel
porting

android-toolchain-20081019
‣http://android.git.kernel.org/pub/
gcc 4.2.1 / binutils 2.17 / gdb 6.6
ARMV5te+
ABI: EABI, AAPCS
--with-float=soft --with=fpu-vfp
--enable-threads (single)
Android Toolchain

Binder
Ashmem (Android shared memory)
PMEM (Processor memory allocator)
logcat (Android Logger)
wakelock (Android Power Management)
Alarm
Android Kernel

Key Features 2.6.23 2.6.25 2.6.27 2.6.29
1Alarm Driver O O O O
2Android Logger O O O O
3Low Memory Killer O O O O
4Power Management O O O O
5USB Gadget O O O O
6ASHMEM X O O O
7PMEM X X O O
8x86 Support X X O O
9./drivers/staging/Android/ X X X O

Android Y IPC
/proc/binder
‣state
‣stats
‣transactions
‣transation_log
‣failed_transation_log
binder

kernel/mm/ashmem.c
/dev/ashmem
Ashmem

drivers/misc/pmem.c
? ????d? userspace driver
PMEM

?G???$ arm-eabi-gcc -o hello hello.c -Wl,-rpath-link=./cupcake/out/
target/product/generic/obj/lib -L./cupcake/out/target/product/
generic/obj/lib -nostdlib ./cupcake/out/target/product/generic/
obj/lib/crtbegin_dynamic.o -lc
?G Android OS Y native program

?*j?~ ?
m Android ?G?
h1 Android source code (Cupcake)
Toolchain Y4\
_{ EeePC YE?

Hardware
Kernel
glibc & shared libs
native C programs
S!"#$%!&'(( ´÷Æ¥jLinux |?

Hardware
Kernel
Application
Android Framework
S!"#$%!&'((
JNI
bionic & shared libs ´÷Æ¥jAndroid |?

S!"#$%!&'((
JNI
onCreate()
Activity
onCreate()
myActivity
MediaPlayer
OpenCore
bionic Android ?????*

• Section 2. Build Androideµ4e¼*
www.jolle.tw

Build system (toolchain).
Dalvik::JNI
Dalvik::Interpreter
Bionic
System call
Android ?4??

Makefile
macros<android>/build/core/combo
darwin-x86.mk
javac.mk
linux-arm.mk
linux-x86.mk
select.mk
target_linux-x86.mk
windows-x86.mk

$(combo_target)GLOBAL_CFLAGS += \
-march=armv5te -mtune=xscale \
-msoft-float -fpic \
-mthumb-interwork \
-ffunction-sections \
-funwind-tables \
-fstack-protector \
-fno-short-enums \
-D__ARM_ARCH_5__ -D__ARM_ARCH_5T__ \
-D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ \
-include $(call select-android-config-h,linux-arm) GLOBAL CFLAGS

$(combo_target)GLOBAL_CFLAGS += \
-march=armv4t -mcpu=arm920t -mtune=xscale \
-msoft-float -fpic \
-mthumb-interwork \
-ffunction-sections \
-funwind-tables \
-fstack-protector \
-fno-short-enums \
-D__ARM_ARCH_4__ -D__ARM_ARCH_4T__ \
-D__ARM_ARCH_5E__ -D__ARM_ARCH_5TE__ \
-include $(call select-android-config-h,linux-arm) GLOBAL CFLAGS for ARMv4

JNI Porting<android>/dalvik/vm/arch
generic/
arm/
x86
CallEABI.S
CallOldABI.S
Call386ABI.S

r0-r3 hold first 4 args to a method
r9 is given special treatment in some situations, but not for us
r10 (sl) seems to be generally available
r11 (fp) is used by gcc (unless -fomit-frame-pointer is set)
r12 (ip) is scratch -- not preserved across method calls
r13 (sp) should be managed carefully in case a signal arrives
r14 (lr) must be preserved
r15 (pc) can be tinkered with directly ARM EABI

r0 JNIEnv (can be left alone)
r1 clazz (NULL for virtual method calls, non-NULL for static)
r2 arg info *
r3 argc (number of 32-bit values in argv)
[sp] argv
[sp,#4] short signature
[sp,#8] func
[sp,#12] pReturn JNI Entry

.Lcopy_done:
@ call the method
ldr ip, [r4, #8] @ func
#ifndef __ARM_ARCH_4__
blx ip
#else
mov lr, pc
bx ip
#endif Assembly Code #1: armv4/armv5

#ifndef __ARM_ARCH_4__
ldmdb r4, {r4, r5, r6, r7, r8, r9, sp, pc}
#else
ldmdb r4, {r4, r5, r6, r7, r8, r9, sp, lr}
bx lr
#endif Assembly Code #2: armv4/armv5

Dalvik
Interpreter<android>/dalvik/vm/mterp
common/
armv4/
armv5te/
x86/

Small and custom C library for the Android platform.
A mainly port of BSD C library.
Its own small implementation of pthreads based on Linux
futexes.
Support for x86, ARM and ARM thumb.
Bionic

Bionic<android>/bionic
libc/
libdl/
libm/
libstdc++/
libthread_db/
linker/

Bionic::libc<android>/bionic/libc
arch-arm/
arch-x86/
kernel/
arch-arm/asm/
arch-x86/asm/

bionic/libc/kernel/ (?z_Y kernel header files
Android Y kernel header J;\?H_ Linux kernel header ?
*[Y
fYJ%­ 54\QYlpeØô~6«
userspace 4\
Android Generated Kernel Header

Android Ԯ\Y library€shared library
?, library Y¼*¯ $›;}jø- ¼*eÖ ´Ð
7? opencore Y?C?S7External Library~/google-android/external/opencore$ find ./ -name "*.s" -print
./codecs_v2/audio/mp3/dec/src/asm/pvmp3_polyphase_filter_window_gcc.s
./codecs_v2/audio/mp3/dec/src/asm/pvmp3_mdct_18.s
./codecs_v2/audio/mp3/dec/src/asm/pvmp3_dct_9.s
./codecs_v2/audio/mp3/dec/src/asm/pvmp3_dct_9_gcc.s
./codecs_v2/audio/mp3/dec/src/asm/pvmp3_mdct_18_gcc.s
./codecs_v2/audio/mp3/dec/src/asm/pvmp3_polyphase_filter_window.s
./codecs_v2/audio/mp3/dec/src/asm/pvmp3_dct_16_gcc.s

sonivox & OpenSSL./sonivox/arm-hybrid-22k/lib_src/ARM-E_filter_gnu.s
./sonivox/arm-hybrid-22k/lib_src/ARM-E_mastergain_gnu.s
./sonivox/arm-hybrid-22k/lib_src/ARM-E_voice_gain_gnu.s
./sonivox/arm-hybrid-22k/lib_src/ARM-E_interpolate_noloop_gnu.s
./sonivox/arm-hybrid-22k/lib_src/ARM-E_interpolate_loop_gnu.s
./sonivox/arm-wt-22k/lib_src/ARM-E_filter_gnu.s
./sonivox/arm-wt-22k/lib_src/ARM-E_mastergain_gnu.s
./sonivox/arm-wt-22k/lib_src/ARM-E_voice_gain_gnu.s
./sonivox/arm-wt-22k/lib_src/ARM-E_interpolate_loop_gnu.s
./openssl/crypto/bn/asm/pa-risc2W.s
./openssl/crypto/bn/asm/pa-risc2.s
./openssl/crypto/bn/asm/mips3.s
./openssl/crypto/0.9.9-dev/aes/aes-armv4.s
./openssl/crypto/0.9.9-dev/bn/armv4-mont.s
./openssl/crypto/0.9.9-dev/sha/sha256-armv4.s
./openssl/crypto/0.9.9-dev/sha/sha512-armv4.s
./openssl/crypto/0.9.9-dev/sha/sha1-armv4-large.s

SurfaceHolder Y type ? SURFACE_TYPE_GPU Ûe²ýŽGPU
€Graphics Processing UnitYÕj
SurfaceHolder Y type ? SURFACE_TYPE_HARDWARE Ûe²ý
Ž DMA ~??Y?j
fYJ%­ 54\QYlpeØô~6«
userspace 4\
Android & Kernel Yýްf

Surface Manager ~ Media Framework
SurfaceHolder Y type ? SURFACE_TYPE_GPU Ûe²ýŽGPU
€Graphics Processing UnitYÕj
SurfaceHolder Y type ? SURFACE_TYPE_HARDWARE Ûe²ý
Ž DMA ~??Y?j
MediaPlayer 4\ OpenCore ???
Android ?&?jY??

Surface Manager private SurfaceView mPreview;
private SurfaceHolder holder;
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.mediaplayer_2);
mPreview = (SurfaceView) findViewById(R.id.surface);
holder = mPreview.getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
Surface Manager ?????4?

Media Framework private MediaPlayer mMediaPlayer;
public void surfaceCreated(SurfaceHolder holder) {
mMediaPlayer = new MediaPlayer();
mMediaPlayer.setDataSource(path);
mMediaPlayer.setDisplay(holder);
mMediaPlayer.prepare();
mMediaPlayer.setOnBufferingUpdateListener(this);
mMediaPlayer.setOnCompletionListener(this);
mMediaPlayer.setOnPreparedListener(this);
mMediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
}
Media Framework ?? OpenCore YE??*

New Product File Tree <company_name>
<board_name>
+ Android.mk
+ product_config.mk
+ system.prop
products
+ AndroidProducts.mk
+ <first_product_name>.mk
+ <second_product_name>.mk

1. Get Google Android
$ repo init -u git://android.git.kernel.org/platform/manifest.git -b cupcake
$ repo sync
2. Manifest file.
<manifest>
...
<project name="platform/vendor/asus/eee_701" path="vendor/asus/eee_701"/>
...
</manifest>
3. Get EeePC platform.
$ repo sync
4. Build Android image.
$ TARGET_ARCH=x86 TARGET_PRODUCT=eee_701
DISABLE_DEXPREOPT=true make -j2 installer_img
5. Create USB boot stick.
Use make-live script. https://review.source.android.com/Gerrit#change,6475
Android x86 port (target product = EeePC 701)

$(call inherit-product, $(SRC_TARGET_DIR)/product/generic.mk)
PRODUCT_NAME := eee_701
PRODUCT_DEVICE := eee_701
PRODUCT_POLICY := android.policy_mid
PRODUCT_PROPERTY_OVERRIDES += \
ro.com.android.dataroaming=true
Build EeePC 701 Product Tips # Google API issue
Cupcake Z Google APIs ?Q add-ons

external/e2fsprogs/Android.mk:
--- a/Android.mk
+++ b/Android.mk
@@ -1,3 +1,3 @@
ifneq ($(TARGET_SIMULATOR),true)
-# include $(call all-subdir-makefiles)
+ include $(call all-subdir-makefiles)
endif
Build EeePC 701 Product Tips # e2fsprogs issue

boot.img
installer.img
ramdisk.img
system.img
userdata.img
Android Image Files

m Android ????$ make-live

4\ VirtualBox
AMD PCnet32 PCI support
VESA VGA graphics support
VGA 8x8 font
VGA 8x16 font

7l installer.img ? VDI ??$ VBoxManage convertromraw -format VDI ./installer.img ./android.vdi

Android Kernerl Configs
"OESPJE

$0/'*(@"/%30*%@("%(&5JTOPUTFU
$0/'*(@"/%30*%@3".@$0/40-&JTOPUTFU
$0/'*(@"/%30*%@108&3Z
$0/'*(@"/%30*%@108&3@45"5Z
$0/'*(@"/%30*%@-0((&3Z
$0/'*(@"/%30*%@5*.&%@(1*0JTOPUTFU
$0/'*(@"/%30*%@#*/%&3@*1$Z
$0/'*(@"/%30*%@"4).&.Z

Android Init Process
device/system/init
device/system/init/init.c
/etc/init.rc
mount file system (?? /etc/fstab)

Running Applications
/system/bin/logd
/sbin/adbd
/system/bin/usbd
/system/bin/debuggerd
/system/bin/rild
/system/bin/app_process
/system/bin/runtime
/system/bin/dbus-daemon
system_server

Zygote Process Startup[ZHPUF\
FYFDTZTUFNCJOBQQ@QSPDFTT
BSHT\
9[ZHPUF
TZTUFNCJO
[ZHPUF
^
BVUPTUBSU
^
SVOUJNF\
FYFDTZTUFNCJOSVOUJNF
BVUPTUBSU
^

?j s3c2410 / s3c244x
??? Neo FreeRunner
CZ?j Mokofly (coming...)
Android FreeRunner

Text
Text
??? Jollen Chen <[email protected]>
Embedded Linux¥*~zªd¯Embedded Linux??Linux
?û??&?.,Y?i??pªOpenmoko?}?6YV
~ª?d?@Z?dm?Openmoko º9d?š???;}
Yº~ª?”rqbffÃÆJY!õAndroid OSµ4Y¦”¼úd
??d6AndroidY??
JollenY??? - www.jollen.org/blog
JollenY - www.plurk.com/jollenchen
FAQ
android-way.com
www.jollen.tw