Difference between revisions of "Android Notes"
(add Android category) |
(re-organize content, and add thread info) |
||
| Line 3: | Line 3: | ||
Here are some miscellaneous notes on Android. See [[Android_on_OMAP|Android on OMAP]], too. | Here are some miscellaneous notes on Android. See [[Android_on_OMAP|Android on OMAP]], too. | ||
| − | == oom killer info == | + | == Technical Info about system components == |
| + | === oom killer info === | ||
Google (Android) developer Arve Hjonevag added a lowmemorykiller feature to the staging area of the | Google (Android) developer Arve Hjonevag added a lowmemorykiller feature to the staging area of the | ||
| Line 54: | Line 55: | ||
frameworks/base/core/jni/android_util_Process.cpp:android_os_Process_setOomAdj() | frameworks/base/core/jni/android_util_Process.cpp:android_os_Process_setOomAdj() | ||
| − | = | + | === init sequence === |
| − | + | ||
| − | + | ||
| − | == init sequence == | + | |
See this blog entry for an overview of the sequence of operations performed by the 'init' program: http://blog.csdn.net/loughsky/archive/2008/11/13/3293922.aspx | See this blog entry for an overview of the sequence of operations performed by the 'init' program: http://blog.csdn.net/loughsky/archive/2008/11/13/3293922.aspx | ||
| + | |||
| + | === C Library (bionic) info === | ||
| + | ==== threads ==== | ||
| + | The bionic C library has it's own thread API, not the same as either original LinuxThreads or | ||
| + | NPTL. | ||
| + | |||
| + | From: http://www.mail-archive.com/uclibc@uclibc.org/msg02787.html | ||
| + | |||
| + | android thread library (from bionic libc) is minimalist : | ||
| + | - use most of the linux kernel thread features (futex, CLONE_THREAD) | ||
| + | unlike old linuxpthread. | ||
| + | - it doesn't support thread cancellation (see CAVEATS file) | ||
| + | - it misses some pthread functions : for example no barrier, missing | ||
| + | *timedwait variant, ... | ||
| + | - very basic gdb support that only work through gdbserver | ||
| + | - some theoric race | ||
| + | |||
| + | == Development Tips == | ||
| + | === debugging tips === | ||
| + | Quick stack dump - "kill -3 <pid>" will put a stack trace in the log file. (Use logcat to view) | ||
=== Getting a bootchart from Android === | === Getting a bootchart from Android === | ||
Revision as of 19:09, 11 May 2009
Here are some miscellaneous notes on Android. See Android on OMAP, too.
Contents |
Technical Info about system components
oom killer info
Google (Android) developer Arve Hjonevag added a lowmemorykiller feature to the staging area of the Linux kernel in January of 2009. This feature tries to reclaim memory before the system runs out (acting as a kind of cache manager, according to Arve). In Linus' 2.6.28-rc tree this appears in
Application lifecycle (and activity states) can be found here: http://code.google.com/android/intro/lifecycle.html
Applications in different stages of their lifecycle receive a different oom_adj value, which affects the probability of their being reaped.
Initial lowmemorykiller thresholds are set by /etc/init.rc (with the following lines):
# Define the oom_adj values for the classes of processes that can be # killed by the kernel. These are used in ActivityManagerService. setprop ro.FOREGROUND_APP_ADJ 0 setprop ro.VISIBLE_APP_ADJ 1 setprop ro.SECONDARY_SERVER_ADJ 2 setprop ro.HIDDEN_APP_MIN_ADJ 7 setprop ro.CONTENT_PROVIDER_ADJ 14 setprop ro.EMPTY_APP_ADJ 15 # Define the memory thresholds at which the above process classes will # be killed. These numbers are in pages (4k). setprop ro.FOREGROUND_APP_MEM 1536 setprop ro.VISIBLE_APP_MEM 2048 setprop ro.SECONDARY_SERVER_MEM 4096 setprop ro.HIDDEN_APP_MEM 5120 setprop ro.CONTENT_PROVIDER_MEM 5632 setprop ro.EMPTY_APP_MEM 6144 # Write value must be consistent with the above properties. write /sys/module/lowmemorykiller/parameters/adj 0,1,2,7,14,15 write /proc/sys/vm/overcommit_memory 1 write /sys/module/lowmemorykiller/parameters/minfree 1536,2048,4096,5120,5632,6144 class_start default # Set init its forked children's oom_adj. write /proc/1/oom_adj -16
Routines to actually calculate the oom_adj value, based on application state are in the ActivityManager. See frameworks/base/services/java/com/android/server/am/ActivityManagerService.java:UpdateOomAdjLocked(...)
and frameworks/base/core/java/android/os/Process.java:setOomAdj() => frameworks/base/core/jni/android_util_Process.cpp:android_os_Process_setOomAdj()
init sequence
See this blog entry for an overview of the sequence of operations performed by the 'init' program: http://blog.csdn.net/loughsky/archive/2008/11/13/3293922.aspx
C Library (bionic) info
threads
The bionic C library has it's own thread API, not the same as either original LinuxThreads or NPTL.
From: http://www.mail-archive.com/uclibc@uclibc.org/msg02787.html
android thread library (from bionic libc) is minimalist : - use most of the linux kernel thread features (futex, CLONE_THREAD) unlike old linuxpthread. - it doesn't support thread cancellation (see CAVEATS file) - it misses some pthread functions : for example no barrier, missing *timedwait variant, ... - very basic gdb support that only work through gdbserver - some theoric race
Development Tips
debugging tips
Quick stack dump - "kill -3 <pid>" will put a stack trace in the log file. (Use logcat to view)
Getting a bootchart from Android
The 'init' program in Android has built-in capability to gather the data needed to produce a bootchart image. See README.BOOTCHART in the directory system/core/init directory of the Android source repository for details.
Building
Building the kernel from scratch
See http://honeypod.blogspot.com/2007/12/compile-android-kernel-from-source.html
Organizations
- http://www.rethink-wireless.com/?article_id=1264 - Japan Consortium with 25 members - Open Embedded Software Foundation (OESF)- started in March to promote non-phone Android devices in Japan.