SlideShare a Scribd company logo
1
Android Platform
Debugging and
Development
Embedded Linux Conference
Europe 2013
Karim Yaghmour
@karimyaghmour
karim.yaghmour@opersys.com
2
These slides are made available to you under a Creative Commons Share-
Alike 3.0 license. The full terms of this license are here:
https://creativecommons.org/licenses/by-sa/3.0/
Attribution requirements and misc., PLEASE READ:
● This slide must remain as-is in this specific location (slide #2), everything
else you are free to change; including the logo :-)
● Use of figures in other documents must feature the below “Originals at”
URL immediately under that figure and the below copyright notice where
appropriate.
● You are free to fill in the “Delivered and/or customized by” space on the
right as you see fit.
● You are FORBIDEN from using the default “About” slide as-is or any of its
contents.
●
You are FORBIDEN from using any content provided by 3rd
parties without
the EXPLICIT consent from those parties.
(C) Copyright 2013, Opersys inc.
These slides created by: Karim Yaghmour
Originals at: www.opersys.com/community/docs
Delivered and/or customized by
3
About
● Author of:
● Introduced Linux Trace Toolkit in 1999
● Originated Adeos and relayfs (kernel/relay.c)
● Training, Custom Dev, Consulting, ...
4
Agenda
1. Architecture Basics
2. Development environment
3. Observing and monitoring
4. Interfacing with the framework
5. Working with the AOSP sources
6. Symbolic debugging
7. Detailed dynamic data collection
8. Benchmarking
9. Summing up
5
1. Architecture Basics
● Hardware used to run Android
● AOSP
● Binder
● System Services
● HAL
6
7
8
9
10
11
/frameworks/base/services/java/...
/frameworks/base/services/jni/
/hardware/libhardware/
/device/[MANUF.]/[DEVICE]
/sdk/emulator/
Kernel or module
/frameworks/base/core/...
AOSP-provided
ASL
Manuf.-provided
Manuf. license
Manuf.-provided
GPL-license
12
2. Development Environment
● Host / Target setup
● IDE / Editor
● Eclipse setup
13
2.1. Host / Target setup
14
15
2.2. IDE / Editor
Logos belong to their respective owners. This slide isn't CC-BY-SA.
16
What if ... ?
17
2.3. Eclipse Setup
● Preparation
● Project importing
● AOSP fixups
● Browsing the sources
18
2.3.1. Preparation
● AOSP Basics:
● Get AOSP ... from Google or otherwise
● Extract if needed
● Configure, build, etc.
● Eclipse / ADT:
● Get ADT bundle from developer.android.com
● Extract
● Start and update and if needed
19
●
Set up basic classpath file:
[aosp]$ cp development/ide/eclipse/.classpath .
●
Adjust eclipse.ini
● On my ADT bundle, it's:
– adt-bundle-linux-x86_64-20130917/eclipse/eclipse.ini
●
Change this:
-XX:MaxPermSize=256m
-Xms40m
-Xmx768m
●
To this:
-XX:MaxPermSize=256m
-Xms128m
-Xmx768m
20
2.3.2. Project importing
● Start Eclipse
● Create new "Java project"
● Project name = your AOSP name
● Deselect "Use default location"
● Location = path to your AOSP
● Click "Next"
● Wait a little bit ...
● Click "Finish"
● Wait for it to build your project
● ... it likely will fail ...
21
2.3.3. AOSP fixups
● Need to fix AOSP classpath file and sources
● Assuming 4.3 here
● Add this:
<classpathentry kind="src" path="frameworks/opt/timezonepicker/src"/>
<classpathentry kind="src" path="frameworks/opt/colorpicker/src"/>
<classpathentry kind="src" path="frameworks/opt/datetimepicker/src"/>
<classpathentry kind="src" 
path="frameworks/support/v8/renderscript/java/src"/>
● Remove this:
<classpathentry kind="src" 
path="frameworks/support/renderscript/v8/java/src"/>
22
● Comment out a couple of things:
<!­­ Redefines android.util.pools which confuses Eclipse
<classpathentry kind="src" path="packages/apps/Gallery2/src"/>
<classpathentry kind="src" path="packages/apps/Gallery2/src_pd"/>
<classpathentry kind="src" 
path="packages/apps/Gallery2/gallerycommon/src"/>
­­>
<!­­
<classpathentry kind="src" path="packages/apps/Nfc/src"/>
<classpathentry kind="src" path="packages/apps/Nfc/nci/src"/>
­­>
<!­­
<classpathentry kind="src" path="frameworks/ex/carousel/java"/>
­­>
23
● Manually build the following (cd to and "mm") --
or remove from .classpath:
packages/apps/Stk
packages/screensavers/WevView
development/samples/ApiDemos
development/samples/HelloActivity
development/samples/Home
development/samples/LunarLander
development/samples/NotePad
development/samples/RSSReader
development/samples/SkeletonApp
development/samples/Snake
24
● Edit
packages/apps/Launcher/src/com/android/launcher
2/DragLayer.java and modify:
    private boolean isLayoutRtl() {
● to
    public boolean isLayoutRtl() {
● Now: right-click on project and select "Refresh"
● It might still show "x" on some parts until it's done
rebuilding the project
25
2.3.4. Browsing the sources
● Mouse-over object type to be taken to declaration
● Browse classes through “Outline”
● Browse Call Hierarchy
● View recently viewed files (Ctrl-e)
● Many other shortcuts, see:
● http://source.android.com/source/using-eclipse.html
● Issues:
● Can't compile with Eclipse ... still need “make”
● For Java only
26
3. Observing and Monitoring
● Native
● Framework
● Overall
27
3.1. Native
● schedtop
● librank
● procmem
● procrank
● showmap
● latencytop
28
3.2. Framework
● dumpsys
● service
29
3.3 Overall
● logcat
● dumpstate / bugreport
● watchprop / getprop
30
31
4. Interfacing With the Framework
● start / stop
● service call
● am
● pm
● wm
● svc
● monkey
● setprop
32
5. Working with the AOSP Sources
● You really need to check build/envsetup.sh
● Some tricks:
● godir
● croot
● mm
● m
● jgrep
● cgrep
● resgrep
● It takes time to wrap your head around the tree
33
6. Symbolic Debugging - basics
34
6.1. DDMS / Eclipse integration
● Start DDMS:
● The one from the AOSP's command-line
● Not the one from Eclipse (“connection refuse”)
● It takes some time to load -- a few minutes
● Each process has a separate host-side socket
● Select the process you want to debug:
● It'll get port 8700
35
● Go to Eclipse:
● Run->Debug Configurations->Remote Java
Application
● Connection Type: "Standard (Socket Attach)"
● Host: localhost
● Port: 8700
36
6.2. Starting debug w/ Eclipse
● Order is finicky:
● Start your device or emulator
● Start command-line DDMS before Eclipse
otherwise you'll get this in logcat:
"I/jdwp ( 411): Ignoring second debugger -- accepting and
dropping"
● Start Eclipse
● Eclipse will complain that there's already a DDMS
running. Ignore that.
37
38
6.3. Debugging
● Select the process you want to debug in DDMS
● Go into Eclipse and click on the debug configuration you
created earlier
● Check that the little green bug is beside your process in
DDMS
● Again, things can look like they're freezing, this is "normal"
for Eclipse ...
● Wait for Eclipse to show your Dalvik process in the
"Debug" *window* in the "Debug" *view* -- all threads
should show
39
40
6.4. Debugging multiple processes
● In the debug *view* of eclipse, click on "Debug"
for every time you change the process in
DDMS
● Wait for that process' threads to load in the
debug view
● Once threads are loaded, you can actually start
debugging
41
6.5. gdbserver - target side
● First, you'll need to make sure your C code is
compiled appropriately. Add this to Android.mk:
LOCAL_CFLAGS += -ggdb
LOCAL_STRIP_MODULE = false
● Attaching to running process
# gdbserver ­­attach locahost:2345 30
● Start app for debugging with gdbserver prepended
# gdbserver localhost:2345 service list
● Forward the port on the host:
$ adb forward tcp:2345 tcp:2345
42
6.6. gdb - host side
● Load file **FIRST** and then attach on host side
$ prebuilts/gcc/linux­x86/arm/arm­eabi­4.7/bin/arm­eabi­gdb
GNU gdb (GDB) 7.3.1­gg2
Copyright (C) 2011 Free Software Foundation, Inc.
...
(gdb) file out/target/product/generic/system/bin/service
(gdb) target remote localhost:2345
(gdb) b main
Cannot access memory at address 0x0
Breakpoint 1 at 0x2a00146c: file frameworks/native/cmds/service/service.cpp, line 59.
(gdb) cont
Continuing.
warning: Could not load shared library symbols for 11 libraries, e.g. /system/bin/linker.
...
Breakpoint 1, main (argc=2, argv=0xbe882b74) at frameworks/native/cmds/service/service.cpp:59
59 {
(gdb) n
60     sp<IServiceManager> sm = defaultServiceManager();
(gdb) n
59 {
(gdb) n
60     sp<IServiceManager> sm = defaultServiceManager();
(gdb) n
61     fflush(stdout);
43
6.7. Multi-threaded = #FAIL
$ prebuilts/gcc/linux­x86/arm/arm­eabi­4.7/bin/arm­eabi­gdb
GNU gdb (GDB) 7.3.1­gg2
...
(gdb) add­symbol­file out/target/product/generic/system/lib/libandroid_servers.so 0x4AFFC8B8
add symbol table from file "out/target/product/generic/system/lib/libandroid_servers.so" at
.text_addr = 0x4affc8b8
(y or n) y
(gdb) add­symbol­file out/target/product/generic/system/lib/libc.so 0x400339B8
add symbol table from file "out/target/product/generic/system/lib/libc.so" at
.text_addr = 0x400339b8
(y or n) y
(gdb) target remote localhost:2345
Remote debugging using localhost:2345
__ioctl () at bionic/libc/arch­arm/syscalls/__ioctl.S:10
10     mov     r7, ip
(gdb) b com_android_server_power_PowerManagerService.cpp:162
Breakpoint 1 at 0x4b000a34: file 
frameworks/base/services/jni/com_android_server_power_PowerManagerService.cpp, line 162.
(gdb) cont
Continuing.
Program terminated with signal SIGTRAP, Trace/breakpoint trap.
The program no longer exists.
...
44
● Even if you try attaching to the specific thread in the system server running
the system service you're trying to instrument, you'll get the same issue.
● Probably requires rebuilding gdbserver with thread support:
● https://sourceware.org/ml/gdb/2009-01/msg00084.html
● http://code.google.com/p/android/issues/detail?id=9713
● Issues seems to be solved in NDK but not in gdbserver in AOSP:
● http://comments.gmane.org/gmane.comp.handhelds.android.ndk/12122
45
6.8. How to know what's the
address of the library
# cat /proc/[system_sever PID]/maps | grep android_servers
4aff5000­4b007000 r­xp 00000000 1f:00 519        /system/lib/libandroid_servers.so
4b007000­4b008000 r­­p 00011000 1f:00 519        /system/lib/libandroid_servers.so
4b008000­4b009000 rw­p 00012000 1f:00 519        /system/lib/libandroid_servers.so
# cat /proc/[system_sever PID]/maps | grep libc.so
40027000­4006c000 r­xp 00000000 1f:00 601        /system/lib/libc.so
4006d000­4006f000 r­­p 00045000 1f:00 601        /system/lib/libc.so
4006f000­40071000 rw­p 00047000 1f:00 601        /system/lib/libc.so
$ objdump ­h out/target/product/generic/system/lib/libandroid_servers.so | grep text
  7 .text         00006ae8  000078b8  000078b8  000078b8  2**3
$ objdump ­h out/target/product/generic/system/lib/libc.so | grep text
  7 .text         0002f080  0000c9b8  0000c9b8  0000c9b8  2**3
4aff5000 + 000078b8 = 0x4AFFC8B8
40027000 + 0000c9b8 = 0x400339B8
http://linux-mobile-hacker.blogspot.co.uk/2008/02/debug-shared-library-with-gdbserver.html
46
6.9. JTAG
● Requires hardware device
● Sometimes interfaces with gdb
● Not Android specific
● Some allow transparent kernel/user-space debug
● Don't know of any that go all the way up to Dalvik
47
7. Detailed Dynamic Data Collection
● Logging
● ftrace
● perf
48
7.1. Logging
● logcat is the most rapid/consistent way to
observe dynamic behavior.
● Trivial to add instrumentation points
● It just works ...
49
7.2. ftrace
● With 4.1, Google introduced systrace/atrace
● systrace is a Python script running on host side
● atrace is native Android binary
● systrace calls atrace via ADB
● atrace uses ftrace to capture kernel events
● Stack instrumented to feed events to ftrace
● Google's doc:
● https://developer.android.com/tools/help/systrace.html
● https://developer.android.com/tools/debugging/systrace.html
50
51
... trouble is ...
● I can't get it to work !*!@#$&!#*$!
● Default goldfish kernel doesn't have ftrace
● Able to build ftrace-enabled kernel for goldfish
● Can trace that system ... so long as I don't use
atrace/systrace ... WTF1
?
● Not all Android kernels have ftrace enabled
● Generates HTML file that can only be read by
Chrome ... it doesn't work in Firefox. NIH?
1: The AOSP sources define WTF as “What a Terrible Failure”. We
trust they've done their research.
52
... still ...
● Have a look at these files:
● /external/chromium-trace/systrace.py
● /frameworks/native/cmds/atrace
● /frameworks/base/core/java/android/os/Trace.java
● /erameworks/native/include/utils/Trace.h
● /system/core/include/cutils/trace.h
● /frameworks/native/libs/utils/Trace.cpp
● Look for:
● ATRACE* in c/cpp files
● Trace.traceBegin()/trace.traceEnd() in Java files
53
# atrace ­­help
usage: atrace [options] [categories...]
options include:
  ­a appname      enable app­level tracing for a comma separated list of 
cmdlines
  ­b N            use a trace buffer size of N KB
  ­c              trace into a circular buffer
  ­k fname,...    trace the listed kernel functions
  ­n              ignore signals
  ­s N            sleep for N seconds before tracing [default 0]
  ­t N            trace for N seconds [defualt 5]
  ­z              compress the trace dump
  ­­async_start   start circular trace and return immediatly
  ­­async_dump    dump the current contents of circular trace buffer
  ­­async_stop    stop tracing and dump the current contents of circular
                    trace buffer
  ­­list_categories
                  list the available tracing categories
54
# atrace ­­list_categories                      
         gfx ­ Graphics
       input ­ Input
        view ­ View System
     webview ­ WebView
          wm ­ Window Manager
          am ­ Activity Manager
       audio ­ Audio
       video ­ Video
      camera ­ Camera
         hal ­ Hardware Modules
         res ­ Resource Loading
      dalvik ­ Dalvik VM
55
7.3. perf on Android on ARM
56
8. Benchmarking
57
0xbench
AnTuTu
Passmark
Vellamo
Geekbench2
SunSpider
GLBenchmakr
Quadrant Standard Edition
Linpack
Neocore
3DMark
Epic Citadel
Androbench
CF-bench
SD Tools
RL Benchmark: SQL
Benchmark & Tunning
A1 SD Bench
Quick Benchmark Lite
3DRating benchmark
Smartbench 2011
NenaMark
Rightware Browsermark
An3DBenchXL
CaffeineMark
NBench
Methanol
AndEBench
SmartBench 2012
RealPi
58
●
Works relatively well:
● logcat
●
Eclipse / DDMS
● Framework tools
●
Works ok:
● gdb/gdbserver
● native tools
● ftrace
●
Doesn't work (for me):
●
systrace/atrace
● perf
9. Summing Up
59
10. Loose ends
● strace
● debuggerd
● tombstones
● anr traces
60
Thank you ...
karim.yaghmour@opersys.com

More Related Content

PDF
Android Platform Debugging and Development at ABS 2014
PDF
Android Platform Debugging and Development
PDF
Android Platform Debugging & Development
PDF
Inside Android's UI at AnDevCon VI
PPTX
Ultimate Survival - React-Native edition
PDF
Working with the AOSP - Linaro Connect Asia 2013
PDF
Master your java_applications_in_kubernetes
PDF
Magento 2 Capistrano Deploy
Android Platform Debugging and Development at ABS 2014
Android Platform Debugging and Development
Android Platform Debugging & Development
Inside Android's UI at AnDevCon VI
Ultimate Survival - React-Native edition
Working with the AOSP - Linaro Connect Asia 2013
Master your java_applications_in_kubernetes
Magento 2 Capistrano Deploy

What's hot (19)

PDF
Lecture 8 - Qooxdoo - Rap Course At The University Of Szeged
PDF
Gr8conf EU 2013 Speed up your development: GroovyServ and Grails Improx Plugin
PDF
LISA Qooxdoo Tutorial Handouts
PDF
Culerity and Headless Full Stack Integration Testing
PDF
Iniciando com Docker
PDF
Instrumentación de entrega continua con Gitlab
PDF
WPE WebKit for Android
PPTX
C++ for the Web
PDF
OpenShift Build Pipelines @ Lightweight Java User Group Meetup
PDF
Capistrano deploy Magento project in an efficient way
PDF
Introduction maven3 and gwt2.5 rc2 - Lesson 01
ZIP
Voiture tech talk
PPTX
Getting started with coding for Jolla Sailfish OS. 22 Feb 2014, Tampere, Finland
PDF
Os Ramani
PDF
Os Wilhelm
PDF
Nuxeo 5 Installation with Eclipse
PPTX
[Codelab 2017] Docker 기초 및 활용 방안
PDF
Drone CI/CD 自動化測試及部署
PDF
Structure your Play application with the cake pattern (and test it)
Lecture 8 - Qooxdoo - Rap Course At The University Of Szeged
Gr8conf EU 2013 Speed up your development: GroovyServ and Grails Improx Plugin
LISA Qooxdoo Tutorial Handouts
Culerity and Headless Full Stack Integration Testing
Iniciando com Docker
Instrumentación de entrega continua con Gitlab
WPE WebKit for Android
C++ for the Web
OpenShift Build Pipelines @ Lightweight Java User Group Meetup
Capistrano deploy Magento project in an efficient way
Introduction maven3 and gwt2.5 rc2 - Lesson 01
Voiture tech talk
Getting started with coding for Jolla Sailfish OS. 22 Feb 2014, Tampere, Finland
Os Ramani
Os Wilhelm
Nuxeo 5 Installation with Eclipse
[Codelab 2017] Docker 기초 및 활용 방안
Drone CI/CD 自動化測試及部署
Structure your Play application with the cake pattern (and test it)
Ad

Viewers also liked (6)

PDF
Embedded Android Workshop at Android Open 2011
PDF
BeagleBoard Workshop ESC Boston 2011
PDF
Android jumpstart at ESC Boston 2011
PDF
Leveraging Android's Linux Heritage at ELC-E 2011
PDF
Leveraging Android's Linux Heritage at Android Open 2011
PDF
Embedded Android Workshop
Embedded Android Workshop at Android Open 2011
BeagleBoard Workshop ESC Boston 2011
Android jumpstart at ESC Boston 2011
Leveraging Android's Linux Heritage at ELC-E 2011
Leveraging Android's Linux Heritage at Android Open 2011
Embedded Android Workshop
Ad

Similar to Android Platform Debugging and Development at ELCE 2013 (20)

PDF
Android Platform Debugging and Development
PDF
Android Platform Debugging and Development
PDF
Android Platform Debugging and Development
PDF
Android Platform Debugging and Development
PDF
Android Platform Debugging and Development
PDF
Android Platform Debugging and Development
PDF
Android Platform Debugging and Development
PDF
Android Platform Debugging and Development
PDF
Discover System Facilities inside Your Android Phone
PDF
Android Internals (This is not the droid you’re loking for...)
PDF
Deep Dive into the AOSP
PDF
Droidcon uk2012 androvm
PDF
Embedded Android in Real Life - Live Embedded Event 2021
PDF
An Introduction To Android
PDF
Leveraging Android's Linux Heritage at AnDevCon IV
PDF
Android memory analysis Debug slides.pdf
PDF
Developing Android Platform Tools
PPTX
OWF12/PAUG Conf Days Alternative to google's android emulator, daniel fages, ...
PDF
From Android NDK To AOSP
PPTX
Using the android ndk - DroidCon Paris 2014
Android Platform Debugging and Development
Android Platform Debugging and Development
Android Platform Debugging and Development
Android Platform Debugging and Development
Android Platform Debugging and Development
Android Platform Debugging and Development
Android Platform Debugging and Development
Android Platform Debugging and Development
Discover System Facilities inside Your Android Phone
Android Internals (This is not the droid you’re loking for...)
Deep Dive into the AOSP
Droidcon uk2012 androvm
Embedded Android in Real Life - Live Embedded Event 2021
An Introduction To Android
Leveraging Android's Linux Heritage at AnDevCon IV
Android memory analysis Debug slides.pdf
Developing Android Platform Tools
OWF12/PAUG Conf Days Alternative to google's android emulator, daniel fages, ...
From Android NDK To AOSP
Using the android ndk - DroidCon Paris 2014

More from Opersys inc. (20)

PDF
Android Automotive
PDF
Android 10 Internals Update
PDF
Android Security Internals
PDF
Embedded Android Workshop with Pie
PDF
Android's HIDL: Treble in the HAL
PDF
Android Treble: Blessing or Trouble?
PDF
Embedded Android Workshop with Oreo
PDF
Scheduling in Android
PDF
Android Things Internals
PDF
Embedded Android Workshop with Nougat
PDF
Embedded Android Workshop with Nougat
PDF
Android Things: Android for IoT
PDF
Android Things Internals
PDF
Scheduling in Android
PDF
Brillo / Weave Internals
PDF
Memory Management in Android
PDF
Embedded Android Workshop with Nougat
PDF
Brillo / Weave Internals
PDF
Project Ara
PDF
Memory Management in Android
Android Automotive
Android 10 Internals Update
Android Security Internals
Embedded Android Workshop with Pie
Android's HIDL: Treble in the HAL
Android Treble: Blessing or Trouble?
Embedded Android Workshop with Oreo
Scheduling in Android
Android Things Internals
Embedded Android Workshop with Nougat
Embedded Android Workshop with Nougat
Android Things: Android for IoT
Android Things Internals
Scheduling in Android
Brillo / Weave Internals
Memory Management in Android
Embedded Android Workshop with Nougat
Brillo / Weave Internals
Project Ara
Memory Management in Android

Recently uploaded (20)

PDF
CIFDAQ's Market Insight: SEC Turns Pro Crypto
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
A Presentation on Artificial Intelligence
PDF
Network Security Unit 5.pdf for BCA BBA.
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PDF
Modernizing your data center with Dell and AMD
PDF
Encapsulation theory and applications.pdf
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
PPTX
Big Data Technologies - Introduction.pptx
PDF
Machine learning based COVID-19 study performance prediction
PPTX
Understanding_Digital_Forensics_Presentation.pptx
PPTX
20250228 LYD VKU AI Blended-Learning.pptx
PDF
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
PDF
NewMind AI Monthly Chronicles - July 2025
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PPTX
Cloud computing and distributed systems.
CIFDAQ's Market Insight: SEC Turns Pro Crypto
Per capita expenditure prediction using model stacking based on satellite ima...
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Shreyas Phanse Resume: Experienced Backend Engineer | Java • Spring Boot • Ka...
Chapter 3 Spatial Domain Image Processing.pdf
Spectral efficient network and resource selection model in 5G networks
A Presentation on Artificial Intelligence
Network Security Unit 5.pdf for BCA BBA.
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Modernizing your data center with Dell and AMD
Encapsulation theory and applications.pdf
Dropbox Q2 2025 Financial Results & Investor Presentation
Big Data Technologies - Introduction.pptx
Machine learning based COVID-19 study performance prediction
Understanding_Digital_Forensics_Presentation.pptx
20250228 LYD VKU AI Blended-Learning.pptx
How UI/UX Design Impacts User Retention in Mobile Apps.pdf
NewMind AI Monthly Chronicles - July 2025
Reach Out and Touch Someone: Haptics and Empathic Computing
Cloud computing and distributed systems.

Android Platform Debugging and Development at ELCE 2013

  • 1. 1 Android Platform Debugging and Development Embedded Linux Conference Europe 2013 Karim Yaghmour @karimyaghmour karim.yaghmour@opersys.com
  • 2. 2 These slides are made available to you under a Creative Commons Share- Alike 3.0 license. The full terms of this license are here: https://creativecommons.org/licenses/by-sa/3.0/ Attribution requirements and misc., PLEASE READ: ● This slide must remain as-is in this specific location (slide #2), everything else you are free to change; including the logo :-) ● Use of figures in other documents must feature the below “Originals at” URL immediately under that figure and the below copyright notice where appropriate. ● You are free to fill in the “Delivered and/or customized by” space on the right as you see fit. ● You are FORBIDEN from using the default “About” slide as-is or any of its contents. ● You are FORBIDEN from using any content provided by 3rd parties without the EXPLICIT consent from those parties. (C) Copyright 2013, Opersys inc. These slides created by: Karim Yaghmour Originals at: www.opersys.com/community/docs Delivered and/or customized by
  • 3. 3 About ● Author of: ● Introduced Linux Trace Toolkit in 1999 ● Originated Adeos and relayfs (kernel/relay.c) ● Training, Custom Dev, Consulting, ...
  • 4. 4 Agenda 1. Architecture Basics 2. Development environment 3. Observing and monitoring 4. Interfacing with the framework 5. Working with the AOSP sources 6. Symbolic debugging 7. Detailed dynamic data collection 8. Benchmarking 9. Summing up
  • 5. 5 1. Architecture Basics ● Hardware used to run Android ● AOSP ● Binder ● System Services ● HAL
  • 6. 6
  • 7. 7
  • 8. 8
  • 9. 9
  • 10. 10
  • 12. 12 2. Development Environment ● Host / Target setup ● IDE / Editor ● Eclipse setup
  • 13. 13 2.1. Host / Target setup
  • 14. 14
  • 15. 15 2.2. IDE / Editor Logos belong to their respective owners. This slide isn't CC-BY-SA.
  • 17. 17 2.3. Eclipse Setup ● Preparation ● Project importing ● AOSP fixups ● Browsing the sources
  • 18. 18 2.3.1. Preparation ● AOSP Basics: ● Get AOSP ... from Google or otherwise ● Extract if needed ● Configure, build, etc. ● Eclipse / ADT: ● Get ADT bundle from developer.android.com ● Extract ● Start and update and if needed
  • 19. 19 ● Set up basic classpath file: [aosp]$ cp development/ide/eclipse/.classpath . ● Adjust eclipse.ini ● On my ADT bundle, it's: – adt-bundle-linux-x86_64-20130917/eclipse/eclipse.ini ● Change this: -XX:MaxPermSize=256m -Xms40m -Xmx768m ● To this: -XX:MaxPermSize=256m -Xms128m -Xmx768m
  • 20. 20 2.3.2. Project importing ● Start Eclipse ● Create new "Java project" ● Project name = your AOSP name ● Deselect "Use default location" ● Location = path to your AOSP ● Click "Next" ● Wait a little bit ... ● Click "Finish" ● Wait for it to build your project ● ... it likely will fail ...
  • 21. 21 2.3.3. AOSP fixups ● Need to fix AOSP classpath file and sources ● Assuming 4.3 here ● Add this: <classpathentry kind="src" path="frameworks/opt/timezonepicker/src"/> <classpathentry kind="src" path="frameworks/opt/colorpicker/src"/> <classpathentry kind="src" path="frameworks/opt/datetimepicker/src"/> <classpathentry kind="src"  path="frameworks/support/v8/renderscript/java/src"/> ● Remove this: <classpathentry kind="src"  path="frameworks/support/renderscript/v8/java/src"/>
  • 22. 22 ● Comment out a couple of things: <!­­ Redefines android.util.pools which confuses Eclipse <classpathentry kind="src" path="packages/apps/Gallery2/src"/> <classpathentry kind="src" path="packages/apps/Gallery2/src_pd"/> <classpathentry kind="src"  path="packages/apps/Gallery2/gallerycommon/src"/> ­­> <!­­ <classpathentry kind="src" path="packages/apps/Nfc/src"/> <classpathentry kind="src" path="packages/apps/Nfc/nci/src"/> ­­> <!­­ <classpathentry kind="src" path="frameworks/ex/carousel/java"/> ­­>
  • 23. 23 ● Manually build the following (cd to and "mm") -- or remove from .classpath: packages/apps/Stk packages/screensavers/WevView development/samples/ApiDemos development/samples/HelloActivity development/samples/Home development/samples/LunarLander development/samples/NotePad development/samples/RSSReader development/samples/SkeletonApp development/samples/Snake
  • 24. 24 ● Edit packages/apps/Launcher/src/com/android/launcher 2/DragLayer.java and modify:     private boolean isLayoutRtl() { ● to     public boolean isLayoutRtl() { ● Now: right-click on project and select "Refresh" ● It might still show "x" on some parts until it's done rebuilding the project
  • 25. 25 2.3.4. Browsing the sources ● Mouse-over object type to be taken to declaration ● Browse classes through “Outline” ● Browse Call Hierarchy ● View recently viewed files (Ctrl-e) ● Many other shortcuts, see: ● http://source.android.com/source/using-eclipse.html ● Issues: ● Can't compile with Eclipse ... still need “make” ● For Java only
  • 26. 26 3. Observing and Monitoring ● Native ● Framework ● Overall
  • 27. 27 3.1. Native ● schedtop ● librank ● procmem ● procrank ● showmap ● latencytop
  • 29. 29 3.3 Overall ● logcat ● dumpstate / bugreport ● watchprop / getprop
  • 30. 30
  • 31. 31 4. Interfacing With the Framework ● start / stop ● service call ● am ● pm ● wm ● svc ● monkey ● setprop
  • 32. 32 5. Working with the AOSP Sources ● You really need to check build/envsetup.sh ● Some tricks: ● godir ● croot ● mm ● m ● jgrep ● cgrep ● resgrep ● It takes time to wrap your head around the tree
  • 34. 34 6.1. DDMS / Eclipse integration ● Start DDMS: ● The one from the AOSP's command-line ● Not the one from Eclipse (“connection refuse”) ● It takes some time to load -- a few minutes ● Each process has a separate host-side socket ● Select the process you want to debug: ● It'll get port 8700
  • 35. 35 ● Go to Eclipse: ● Run->Debug Configurations->Remote Java Application ● Connection Type: "Standard (Socket Attach)" ● Host: localhost ● Port: 8700
  • 36. 36 6.2. Starting debug w/ Eclipse ● Order is finicky: ● Start your device or emulator ● Start command-line DDMS before Eclipse otherwise you'll get this in logcat: "I/jdwp ( 411): Ignoring second debugger -- accepting and dropping" ● Start Eclipse ● Eclipse will complain that there's already a DDMS running. Ignore that.
  • 37. 37
  • 38. 38 6.3. Debugging ● Select the process you want to debug in DDMS ● Go into Eclipse and click on the debug configuration you created earlier ● Check that the little green bug is beside your process in DDMS ● Again, things can look like they're freezing, this is "normal" for Eclipse ... ● Wait for Eclipse to show your Dalvik process in the "Debug" *window* in the "Debug" *view* -- all threads should show
  • 39. 39
  • 40. 40 6.4. Debugging multiple processes ● In the debug *view* of eclipse, click on "Debug" for every time you change the process in DDMS ● Wait for that process' threads to load in the debug view ● Once threads are loaded, you can actually start debugging
  • 41. 41 6.5. gdbserver - target side ● First, you'll need to make sure your C code is compiled appropriately. Add this to Android.mk: LOCAL_CFLAGS += -ggdb LOCAL_STRIP_MODULE = false ● Attaching to running process # gdbserver ­­attach locahost:2345 30 ● Start app for debugging with gdbserver prepended # gdbserver localhost:2345 service list ● Forward the port on the host: $ adb forward tcp:2345 tcp:2345
  • 42. 42 6.6. gdb - host side ● Load file **FIRST** and then attach on host side $ prebuilts/gcc/linux­x86/arm/arm­eabi­4.7/bin/arm­eabi­gdb GNU gdb (GDB) 7.3.1­gg2 Copyright (C) 2011 Free Software Foundation, Inc. ... (gdb) file out/target/product/generic/system/bin/service (gdb) target remote localhost:2345 (gdb) b main Cannot access memory at address 0x0 Breakpoint 1 at 0x2a00146c: file frameworks/native/cmds/service/service.cpp, line 59. (gdb) cont Continuing. warning: Could not load shared library symbols for 11 libraries, e.g. /system/bin/linker. ... Breakpoint 1, main (argc=2, argv=0xbe882b74) at frameworks/native/cmds/service/service.cpp:59 59 { (gdb) n 60     sp<IServiceManager> sm = defaultServiceManager(); (gdb) n 59 { (gdb) n 60     sp<IServiceManager> sm = defaultServiceManager(); (gdb) n 61     fflush(stdout);
  • 43. 43 6.7. Multi-threaded = #FAIL $ prebuilts/gcc/linux­x86/arm/arm­eabi­4.7/bin/arm­eabi­gdb GNU gdb (GDB) 7.3.1­gg2 ... (gdb) add­symbol­file out/target/product/generic/system/lib/libandroid_servers.so 0x4AFFC8B8 add symbol table from file "out/target/product/generic/system/lib/libandroid_servers.so" at .text_addr = 0x4affc8b8 (y or n) y (gdb) add­symbol­file out/target/product/generic/system/lib/libc.so 0x400339B8 add symbol table from file "out/target/product/generic/system/lib/libc.so" at .text_addr = 0x400339b8 (y or n) y (gdb) target remote localhost:2345 Remote debugging using localhost:2345 __ioctl () at bionic/libc/arch­arm/syscalls/__ioctl.S:10 10     mov     r7, ip (gdb) b com_android_server_power_PowerManagerService.cpp:162 Breakpoint 1 at 0x4b000a34: file  frameworks/base/services/jni/com_android_server_power_PowerManagerService.cpp, line 162. (gdb) cont Continuing. Program terminated with signal SIGTRAP, Trace/breakpoint trap. The program no longer exists. ...
  • 44. 44 ● Even if you try attaching to the specific thread in the system server running the system service you're trying to instrument, you'll get the same issue. ● Probably requires rebuilding gdbserver with thread support: ● https://sourceware.org/ml/gdb/2009-01/msg00084.html ● http://code.google.com/p/android/issues/detail?id=9713 ● Issues seems to be solved in NDK but not in gdbserver in AOSP: ● http://comments.gmane.org/gmane.comp.handhelds.android.ndk/12122
  • 45. 45 6.8. How to know what's the address of the library # cat /proc/[system_sever PID]/maps | grep android_servers 4aff5000­4b007000 r­xp 00000000 1f:00 519        /system/lib/libandroid_servers.so 4b007000­4b008000 r­­p 00011000 1f:00 519        /system/lib/libandroid_servers.so 4b008000­4b009000 rw­p 00012000 1f:00 519        /system/lib/libandroid_servers.so # cat /proc/[system_sever PID]/maps | grep libc.so 40027000­4006c000 r­xp 00000000 1f:00 601        /system/lib/libc.so 4006d000­4006f000 r­­p 00045000 1f:00 601        /system/lib/libc.so 4006f000­40071000 rw­p 00047000 1f:00 601        /system/lib/libc.so $ objdump ­h out/target/product/generic/system/lib/libandroid_servers.so | grep text   7 .text         00006ae8  000078b8  000078b8  000078b8  2**3 $ objdump ­h out/target/product/generic/system/lib/libc.so | grep text   7 .text         0002f080  0000c9b8  0000c9b8  0000c9b8  2**3 4aff5000 + 000078b8 = 0x4AFFC8B8 40027000 + 0000c9b8 = 0x400339B8 http://linux-mobile-hacker.blogspot.co.uk/2008/02/debug-shared-library-with-gdbserver.html
  • 46. 46 6.9. JTAG ● Requires hardware device ● Sometimes interfaces with gdb ● Not Android specific ● Some allow transparent kernel/user-space debug ● Don't know of any that go all the way up to Dalvik
  • 47. 47 7. Detailed Dynamic Data Collection ● Logging ● ftrace ● perf
  • 48. 48 7.1. Logging ● logcat is the most rapid/consistent way to observe dynamic behavior. ● Trivial to add instrumentation points ● It just works ...
  • 49. 49 7.2. ftrace ● With 4.1, Google introduced systrace/atrace ● systrace is a Python script running on host side ● atrace is native Android binary ● systrace calls atrace via ADB ● atrace uses ftrace to capture kernel events ● Stack instrumented to feed events to ftrace ● Google's doc: ● https://developer.android.com/tools/help/systrace.html ● https://developer.android.com/tools/debugging/systrace.html
  • 50. 50
  • 51. 51 ... trouble is ... ● I can't get it to work !*!@#$&!#*$! ● Default goldfish kernel doesn't have ftrace ● Able to build ftrace-enabled kernel for goldfish ● Can trace that system ... so long as I don't use atrace/systrace ... WTF1 ? ● Not all Android kernels have ftrace enabled ● Generates HTML file that can only be read by Chrome ... it doesn't work in Firefox. NIH? 1: The AOSP sources define WTF as “What a Terrible Failure”. We trust they've done their research.
  • 52. 52 ... still ... ● Have a look at these files: ● /external/chromium-trace/systrace.py ● /frameworks/native/cmds/atrace ● /frameworks/base/core/java/android/os/Trace.java ● /erameworks/native/include/utils/Trace.h ● /system/core/include/cutils/trace.h ● /frameworks/native/libs/utils/Trace.cpp ● Look for: ● ATRACE* in c/cpp files ● Trace.traceBegin()/trace.traceEnd() in Java files
  • 53. 53 # atrace ­­help usage: atrace [options] [categories...] options include:   ­a appname      enable app­level tracing for a comma separated list of  cmdlines   ­b N            use a trace buffer size of N KB   ­c              trace into a circular buffer   ­k fname,...    trace the listed kernel functions   ­n              ignore signals   ­s N            sleep for N seconds before tracing [default 0]   ­t N            trace for N seconds [defualt 5]   ­z              compress the trace dump   ­­async_start   start circular trace and return immediatly   ­­async_dump    dump the current contents of circular trace buffer   ­­async_stop    stop tracing and dump the current contents of circular                     trace buffer   ­­list_categories                   list the available tracing categories
  • 55. 55 7.3. perf on Android on ARM
  • 57. 57 0xbench AnTuTu Passmark Vellamo Geekbench2 SunSpider GLBenchmakr Quadrant Standard Edition Linpack Neocore 3DMark Epic Citadel Androbench CF-bench SD Tools RL Benchmark: SQL Benchmark & Tunning A1 SD Bench Quick Benchmark Lite 3DRating benchmark Smartbench 2011 NenaMark Rightware Browsermark An3DBenchXL CaffeineMark NBench Methanol AndEBench SmartBench 2012 RealPi
  • 58. 58 ● Works relatively well: ● logcat ● Eclipse / DDMS ● Framework tools ● Works ok: ● gdb/gdbserver ● native tools ● ftrace ● Doesn't work (for me): ● systrace/atrace ● perf 9. Summing Up
  • 59. 59 10. Loose ends ● strace ● debuggerd ● tombstones ● anr traces