0% found this document useful (0 votes)
53 views46 pages

Android Tips and Tricks 2010 10

good tips

Uploaded by

s_t_a_l_i_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)
53 views46 pages

Android Tips and Tricks 2010 10

good tips

Uploaded by

s_t_a_l_i_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/ 46

Android Systems Programming

Tips and Tricks


Tim Bird
Sony Network Entertainment, Inc.
<tim.bird (at) am.sony.com>

Copyright 2010 Sony Corporation

Overview

Intro to Android

Working with Source

Interacting with the Target

Debug and Trace tools

Performance tools

Random thoughts on Android

Resources

Copyright 2010 Sony Corporation

Intro to Android

It's showing up everywhere


Obligatory architecture diagram:

Android device proliferation

Copyright 2010 Sony Corporation

Working With Source

Working with Source

Git
Repo
Building fast
Making a new program in the build
system

Repo

Export REPO_TRACE=1 is handy to see


what git commands are happening
Repo tricks

Repo forall -c 'git diff <remote_branch>'


Repo forall -c 'echo $REPO_PATH;git
remote -v'

In AOSP to build a script to set AOSP


upstream remotes from which to compare
and merge with.

Repo manifest -r -o my-tag-file.xml

Make a repository snapshot

Build system

Lots of interesting stuff in


build/envsetup.sh

Help
choosecombo/lunch
jgrep/cgrep
godir

Interesting 'make' targets:

Showcommands psuedo-target to show


output of commands (like kernel's 'make
V=1'
Sdk can build the SDK from scratch

Fast building

Parallel make threads

'make -j6'

Compiled output cache

ccache is in /prebuilt area

Use 2 more than your number of CPUs


(include hyperthreaded CPUs)

'export USE_CCACHE=1'
Great for rebuilds

Make only a specific module

mm build only the module(s) in the


current directory (and below)

I usually combine with a custom


install script, which copies from
out/target/product/<board>... to the
target

Adding a program to the build

Make a directory under 'external'

Create your C/cpp files.


Create Android.mk as clone of
external/ping/Android.mk

e.g. ANDROID/external/myprogram

Change the names ping.c and ping to


match your C/cpp files and program name

Add the directory name in


ANDROID/build/core/main.mk after
external/zlib as external/myprogram
Make from the root of the source tree

Interacting with the Target

Interacting with the Target

Android has some very nice integration


engineering
Tools discussed

Fastboot
ADB

Development configurations

Fastboot

fastboot a both tool and a bootloader


protocol
Required by Google for certified devices
Would be really nice to adopt as an
industry standard

e.g. maybe support fastboot in U-Boot

Fastboot operations

Install kernel
Install new image
Boot directly from host

Is good with NFS-mounted root filesystem

ADB

Android Debug Bridge


Tool for all kinds of target interactions
(install, logging, remote shell, file copy)

shell [<command>]
push/pull
Logcat
Install/uninstall

Print this and keep it under your pillow...

http://developer.android.com/guide/develo
ping/tools/adb.html

ADB (cont.)

Can work over network, instead of USB


Useful if you run build inside virtual
machine on host

It's simple:

e.g. I build on Ubuntu 8.04 on Fedora 12


(64-bit) host
export ADBHOST=192.168.2.1

For some reason, I have to kill the


server after rebooting target
adb kill-server

Development configurations
Host
Target
USB
Network
Serial

Functionality testing
Host

Power control
Network

Kernel

Target

TFTP
NFS

Root filesystem
Host

Integration and
Performance testing

Target
USB
Network

kernel

root
fs

data

flash

Trace and Debug Tools

Trace and Debug tools


Logging

Kernel log (dmesg)


Logcat
Stdio redirection

Strace
Bootchart
Dumpsys
Ddms
Gdb

Kernel log

It's there, use dmesg to access after boot


Turn on PRINTK_TIMES for timestamps
Increase buffer size:
CONFIG_LOG_BUF_SHIFT
Can emit messages into log by writing
to /dev/kmsg

Very handy to synchronize with kernel


messages

Logcat

Logging system in kernel

Increase logging levels

Integrated throughout Android system (C+


+ and Java access)
Flags to control logging level in code
(DEBUG emits more??)

Different logs (main, event, etc.)

Event is funky, is coded for size

See jamboree presentation on log


info
http://blog.kmckk.com/archives/2936958.ht
(Presentation by Tetsuyuki
Kobayashi)

Logcat

Use from host to redirect to a file


To get main log info, use:
e.g. adb logcat v time d *:V >test.log

To get info from 'events' log, use -b:


e.g. adb logcat b events v time d | grep boot

Filter using <tag>:<loglevel>


Can use ANDROID_LOG_TAGS env. var.

I wrote my own logdelta tool, to see time


between events
See http://elinux.org/Improving_Android_Boot_Time#logdelta

Logcat results (main)


ADP1:
preloaded 1514 classes in 11530ms
Time to scan packages: 10.064 seconds

N1:
preloaded 1942 classes in 5360ms
Time to scan packages: 8.975 seconds

EVM:
preloaded 1942 classes in 13619ms
Time to scan packages: 19.731 seconds

Copyright 2010 Sony Corporation

Logging system overview


diagram

Shameless ripoff from Tetsuyuki Kobayashi

Logcat results (events)


I/boot_progress_start( 754): 12559
I/boot_progress_preload_start( 754): 17879
I/boot_progress_preload_end( 754): 28546
I/boot_progress_system_run( 768): 29230
I/boot_progress_pms_start( 768): 29697
I/boot_progress_pms_system_scan_start( 768): 30117
I/boot_progress_pms_data_scan_start( 768): 44171
I/boot_progress_pms_scan_end( 768): 50006
I/boot_progress_pms_ready( 768): 50505
I/boot_progress_ams_ready( 768): 53166
I/boot_progress_enable_screen( 768): 56793

Stdio redirection

Strace
Shows system calls for a process (or set of
processes)
Is part of AOSP since Eclair
Can add to init.rc to trace initialization.
For example, to trace zygote startup, in /init.rc
change:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server

to
service zygote /system/xbin/strace -tt -o/data/boot.strace /system/bin/app_process -Xzygote
/system/bin --zygote --start-system-server

Bootchart
'init' gathers data on startup
Must re-compile 'init' with support for bootchart
data collection

A tool on the host produces a nice graphic


See http://elinux.org/Bootchart and
http://elinux.org/Using_Bootchart_on_Android

Bootchart output

Copyright 2010 Sony Corporation

Debug tools

Ddms
Gdb

DDMS

Dalvik Debug Monitor Service


http://developer.android.com/guide/developin
Lots of features, controllable via eclipse

GDB

How to invoke via network


Files are stripped in output dir

Unstripped files are at:

Performance Tools

Smem
Traceview
Dalvik JIT profiler??
Perf??

Smem

Tools for analyzing system-wide memory


usage

Can slice, dice, and visualize memory info


snapshot

Run smemcap on target, grab data with


adb, then analyze on host

See http://elinux.org/Using_smem_on_Android

Traceview

Generate method trace

Dalvik JIT profiler

Perf

Standard kernel tool for performance analysis


Now that Android is up to 2.6.35 kernel, should
be a breeze to use
Have to admit I haven't done it yet

Miscellaneous tools

procrank
setprop/getprop
sqlite (command line)
start/stop

Can stop/start whole system

Procrank

Shows a quick summary of processes,


sorted by VSS, RSS, PSS or USS

See http://elinux.org/Android_Memory_Usage

Output:
# procrank
PID
Vss
1217
36848K
1276
32200K
1189
26920K
1321
20328K
1356
20360K
1303
20184K
1271
19888K
1332
19560K
1187
5068K
1384
436K
1
212K
753
572K
748
340K
751
388K
1215
148K
757
352K
760
404K
759
312K
749
288K
752
244K

Rss
35648K
32200K
26920K
20328K
20360K
20184K
19888K
19560K
5068K
436K
212K
572K
340K
388K
148K
352K
404K
312K
288K
244K

Pss
17983K
14048K
9293K
4743K
4621K
4381K
4297K
3993K
2119K
248K
200K
171K
163K
156K
136K
117K
104K
102K
96K
71K

Uss
13956K
10116K
5500K
2344K
2148K
1724K
1764K
1620K
1476K
236K
200K
136K
152K
140K
136K
92K
80K
88K
84K
60K

cmdline
system_server
android.process.acore
zygote
android.process.media
com.android.email
com.android.settings
com.android.inputmethod.latin
com.android.alarmclock
/system/bin/mediaserver
procrank
/init
/system/bin/rild
/system/bin/sh
/system/bin/vold
/sbin/adbd
/system/bin/dbus-daemon
/system/bin/keystore
/system/bin/installd
/system/bin/servicemanager
/system/bin/debuggerd

setprop/getprop

Many services have debug elements


controlled by properties
Many properties are set in /init.rc
You can also query and set properties on
the command line
Use 'getprop' (with no args) to see list of
properties
Have to examine source for properties
with special effects (or see some tip on a
mailing list)
Example: setting the DNS server
address manually:
setprop net.nds1 xx.yy.zz.aa

Sqlite

You can inspect and modify sqlite data


directly from the command line (or over
adb)

Here's an example of setting the


http_proxy for a development board
# cd /data/data/com.android.providers.settings/databases
# sqlite3 settings.db
SQLite version 3.5.9
Enter ".help" for instructions
sqlite> insert into system values(99,'http_proxy','192.168.1.1:80');
sqlite>.exit
#

Most databases are under a directory


called 'databases', and end in '.db'

Wrapup

Random thoughts on Android

Throws POSIX out the window


Hurray!... Darn...
Lots of talk about Android fragmentation
Fragmentation doesn't matter for custom
programming work

If Android works for you, then use it

Soon, vendors will have to ensure


compatibility, rather than app makers
Seems destined to be a major embedded
Linux platform
Only drawback(?) is non-native apps
But even this has pros and cons

Resources
eLinux wiki Android portal:
http://elinux.org/Android_Portal
Use android-porting, android-platform, and
android-kernel mailing lists, depending on
where your issue is
See
http://elinux.org/Android_Web_Resources#Mailing_Lists

My e-mail: tim.bird (at) am.sony.com

Thanks for your time


Questions and Answers

Git

Android open source project uses 'git'


You need to learn to use git well, really

Need to know how to do a 'git rebase'


especially for kernel patches
git rebase -i

Kernel patch rebase needed for moving


kernel versions, porting work, etc.
Lots of online resources

Recommended online book:


http://progit.org/book/

You might also like