Difference between revisions of "Android Notes"

From eLinux.org
Jump to: navigation, search
(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()
  
== debugging tips ==
+
=== init sequence ===
Quick stack dump - "kill -3 <pid>" will put a stack trace in the log file.  (Use logcat to view)
+
 
+
== 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.

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