SlideShare a Scribd company logo
Developer DayGoogle 2010
Thursday, September 16, 2010
High-performance Android apps
Tim Bray
Developer DayGoogle 2010
Thursday, September 16, 2010
Outline
• Why care?
• What is an ANR? Why do we see them?
• Quantifying responsiveness and “jank”
• Android SDK features for performance
• Numbers to know
• Storage and network issues
• Tools
• What to do?
Developer DayGoogle 2010
Thursday, September 16, 2010
“Jank”
• Chrome team's term for stalling the event loop,
i.e. not instantly responsive to input
• Eliminate by:
• Reacting to events quickly
• Don't hog the event loop (“main” / UI) thread!
• Getting back into the select() / epoll_wait()
call ASAP, so...
• … you can react to future events quickly
(touches, drags)
• Else...
Developer DayGoogle 2010
Thursday, September 16, 2010
Developer DayGoogle 2010
Thursday, September 16, 2010
ANR: “App Not Responding”
• Happens when:
• UI thread”) doesn't respond to input event in
5 seconds, or
• a BroadcastReceiver doesn't finish in 10
seconds
• Typically due to network or storage
operations on main thread
• But users complain about delays much less
than 5 seconds!
Developer DayGoogle 2010
Thursday, September 16, 2010
Some Nexus One Numbers
• ~0.04 ms: writing a byte on pipe process A->B, B->A
or reading simple /proc files from Dalvik
• ~0.12 ms: void/void Binder RPC call A->B, B->A
• ~5-25 ms: uncached flash reading a byte
• ~5-200+(!) ms: uncached flash writing tiny amount
• 16 ms: one frame of 60 fps video
• 100-200 ms: human perception of slow action
• 108/350/500/800 ms: ping over 3G. varies!
• ~1-6+ seconds: TCP setup + HTTP fetch of 6k via 3G
Developer DayGoogle 2010
Thursday, September 16, 2010
Writing to flash (yaffs2)
Developer DayGoogle 2010
Source: empirical samples over Google employee phones (Mar 2010)
• Create file, 512 byte write,
delete (ala sqlite .journal in
transaction)
• Flash is different than disks
you're likely used to: read,
write, erase, wear-leveling, GC
• Write performance is highly
variable!
Thursday, September 16, 2010
Sqlite Performance
• There’s no such thing as a cheap write
• Use indexes (see EXPLAIN & EXPLAIN
QUERY PLAN)
• For logging, consider file-append rather than
database-write
Developer DayGoogle 2010
Thursday, September 16, 2010
Lessons
• Writing to storage is slow
• Using the network is slow
• Always assume the worst; performance is
guaranteed to produce bad reviews and Market
ratings
Developer DayGoogle 2010
Thursday, September 16, 2010
Tools: asyncTask
Developer DayGoogle 2010
“AsyncTask enables proper
and easy use of the UI
thread. This class allows to
perform background
operations and publish
results on the UI thread
without having to manipulate
threads and/or handlers.”
Thursday, September 16, 2010
Tool: asyncTask
Developer DayGoogle 2010
private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> {
protected Long doInBackground(URL... urls) { // on some background thread
int count = urls.length; long totalSize = 0;
for (int i = 0; i < count; i++) {
totalSize += Downloader.downloadFile(urls[i]);
publishProgress((int) ((i / (float) count) * 100));
}
return totalSize;
}
protected void onProgressUpdate(Integer... progress) { // on UI thread!
setProgressPercent(progress[0]);
}
protected void onPostExecute(Long result) { // on UI thread!
showDialog("Downloaded " + result + " bytes");
}
}
new DownloadFilesTask().execute(url1, url2, url3); // call from UI thread!
Thursday, September 16, 2010
Tool: asyncTask
Developer DayGoogle 2010
private boolean handleWebSearchRequest(final ContentResolver cr) {
...
new AsyncTask<Void, Void, Void>() {
protected Void doInBackground(Void... unused) {
Browser.updateVisitedHistory(cr, newUrl, false);
Browser.addSearchUrl(cr, newUrl);
return null;
}
}.execute()
...
return true;
}
Thursday, September 16, 2010
asyncTask Details
• Must be called from a main thread
• rather, a thread with a Handler/Looper
• No nested calls!
• An activity process may exit before its
AsyncTask completes (user goes elsewhere,
low RAM, etc).
• If this is a problem, use IntentService
Developer DayGoogle 2010
Thursday, September 16, 2010
Tool: android.app.IntentService
• “IntentService is a base class for Services that
handle asynchronous requests (expressed as
Intents) on demand. Clients send requests
through startService(Intent) calls; the service is
started as needed, handles each Intent in turn
using a worker thread, and stops itself when it
runs out of work.”
• Intent happens in a Service, so Android tries
hard not to kill it
• Easy way to do use a Service
Developer DayGoogle 2010
Thursday, September 16, 2010
Calendar's use of IntentService
Developer DayGoogle 2010
public class DismissAllAlarmsService extends IntentService {
@Override public void onHandleIntent(Intent unusedIntent) {
ContentResolver resolver = getContentResolver();
...
resolver.update(uri, values, selection, null);
}
}
In AlertReceiver extends BroadcastReceiver, onReceive() (main thread)
Intent intent = new Intent(context, DismissAllAlarmsService.class);
context.startService(intent);
Thursday, September 16, 2010
UI Tips
• Disable UI elements immediately, before kicking off
your AsyncTask to finish the task
• Use an animation or ProgressDialog to show you’re
working
• One example strategy:
1. Immediately, disable UI elementes
2. Briefly, a spinner in the title bar
3. If more than 200msec, show a ProgressDialog
4. in AsyncTask onPostExecute, cancel alarm timer
Developer DayGoogle 2010
Thursday, September 16, 2010
What to do?
1. Design the simplest thing that could possible
work, where “could possibly work” excludes
doing network transactions on the UI thread.
Maybe it’ll be fast enough!
2. If it’s not fast enough, measure and find out
why.
3. Fix the biggest performance problems.
4. goto 2
Developer DayGoogle 2010
Thursday, September 16, 2010
Profiling Tools
• Traceview (for CPU-bound apps)
• dalvik.system.VMDebug#{start,stop}MethodTracing()
• adb shell am profile <PROCESS> start <FILE>
• adb shell am profile <PROCESS> stop
• Log.d() calls with a timestamp aren’t terrible
• Extreme profiling: Aggregate user profile data
Developer DayGoogle 2010
Thursday, September 16, 2010
Demo
• Profiling Tim’s “LifeSaver 2” application
Developer DayGoogle 2010
Thursday, September 16, 2010
Thank you!
Tim Bray, Developer Advocate
twbray@google.com android-developers.blogspot.com @AndroidDev
Developer DayGoogle 2010
Thursday, September 16, 2010

More Related Content

PPTX
『Apple Watch』、買う?ー『Apple Watch』によって健康への向き合い方がどう変わるかー
PPT
Primeros auxilios
PDF
Business idea - 「Kinectで実現するスマートライフ」健康管理編
PPT
Pitney Bowes User Forums
PDF
Google Developer Day 2010 Japan: クールな Android アプリを作るには (安生真, 山下盛史, 江川崇)
PDF
Google Developer Day 2010 Japan: Android や iPhone で活用する Maps API のモバイル端末向け新機能...
PDF
Google Developer Day 2010 Japan: Google App Engine についての最新情報 (松尾貴史)
PDF
Google Developer Day 2010 Japan: Google エンジニアの日常 (山内 知昭)
『Apple Watch』、買う?ー『Apple Watch』によって健康への向き合い方がどう変わるかー
Primeros auxilios
Business idea - 「Kinectで実現するスマートライフ」健康管理編
Pitney Bowes User Forums
Google Developer Day 2010 Japan: クールな Android アプリを作るには (安生真, 山下盛史, 江川崇)
Google Developer Day 2010 Japan: Android や iPhone で活用する Maps API のモバイル端末向け新機能...
Google Developer Day 2010 Japan: Google App Engine についての最新情報 (松尾貴史)
Google Developer Day 2010 Japan: Google エンジニアの日常 (山内 知昭)

Similar to Google Developer Day 2010 Japan: 高性能な Android アプリを作るには (ティム ブレイ) (20)

PDF
Android - Open Source Bridge 2011
PPTX
Appcelerator Titanium Intro
PPTX
Using Modern Browser APIs to Improve the Performance of Your Web Applications
PDF
Recap of the google io 2017
KEY
SumitK's mobile app dev using drupal as base ststem
PDF
l1-reactnativeintroduction-160816150540.pdf
PPTX
solution Challenge design and flutter day.pptx
PDF
React Native Introduction: Making Real iOS and Android Mobile App By JavaScript
PDF
Android 3.1 - Portland Code Camp 2011
PPTX
Reliable mobile test automation
PDF
Web App Prototypes with Google App Engine
PDF
Google's serverless journey: past to present
PDF
An introduction to Titanium
PDF
jQuery Conference San Diego 2014 - Web Performance
PPTX
Appcelerator Titanium - An Introduction to the Titanium Ecosystem
PPT
Unit I- ANDROID OVERVIEW.ppt
PDF
jQuery: The World's Most Popular JavaScript Library Comes to XPages
PPTX
L4-AndroidProgramming presentation for student
PDF
Android 3.0 Portland Java User Group 2011-03-15
PPTX
Using Azure Functions for Integration
Android - Open Source Bridge 2011
Appcelerator Titanium Intro
Using Modern Browser APIs to Improve the Performance of Your Web Applications
Recap of the google io 2017
SumitK's mobile app dev using drupal as base ststem
l1-reactnativeintroduction-160816150540.pdf
solution Challenge design and flutter day.pptx
React Native Introduction: Making Real iOS and Android Mobile App By JavaScript
Android 3.1 - Portland Code Camp 2011
Reliable mobile test automation
Web App Prototypes with Google App Engine
Google's serverless journey: past to present
An introduction to Titanium
jQuery Conference San Diego 2014 - Web Performance
Appcelerator Titanium - An Introduction to the Titanium Ecosystem
Unit I- ANDROID OVERVIEW.ppt
jQuery: The World's Most Popular JavaScript Library Comes to XPages
L4-AndroidProgramming presentation for student
Android 3.0 Portland Java User Group 2011-03-15
Using Azure Functions for Integration
Ad

More from Google Developer Relations Team (10)

PDF
Google Developer Day 2010 Japan: 音声入力 API for Android (アレックス グランスタイン, 小西 祐介)
PDF
Google Developer Day 2010 Japan: 「App Engine 開発者コミュニティ「appengine ja night」とフレ...
PDF
Google Developer Day 2010 Japan: Part 1: Google App Engine for Business の概要 P...
PDF
Google Developer Day 2010 Japan: Google Chrome の Developer Tools (ミカイル ナガノフ, ...
PDF
Google Developer DAy 2010 Japan: HTML5 についての最新情報 (マイク スミス)
PDF
Google Developer Day 2010 Japan: 新 SocialWeb: 全てはオープンスタンダードの元に (ティモシー ジョーダン)
PDF
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
PDF
Google Developer Day 2010 Japan: HTML5 とウェブサイトデザイン (矢倉 眞隆)
PDF
Google Developer Day 2010 Japan: Android でリアルタイムゲームを開発する方法: リベンジ (クリス プルエット)
PDF
Google Developer Day 2010 Japan: マーケットライセンシングを使って Android アプリケーションを守るには (トニー ...
Google Developer Day 2010 Japan: 音声入力 API for Android (アレックス グランスタイン, 小西 祐介)
Google Developer Day 2010 Japan: 「App Engine 開発者コミュニティ「appengine ja night」とフレ...
Google Developer Day 2010 Japan: Part 1: Google App Engine for Business の概要 P...
Google Developer Day 2010 Japan: Google Chrome の Developer Tools (ミカイル ナガノフ, ...
Google Developer DAy 2010 Japan: HTML5 についての最新情報 (マイク スミス)
Google Developer Day 2010 Japan: 新 SocialWeb: 全てはオープンスタンダードの元に (ティモシー ジョーダン)
Google Developer Day 2010 Japan: プログラミング言語 Go (鵜飼 文敏)
Google Developer Day 2010 Japan: HTML5 とウェブサイトデザイン (矢倉 眞隆)
Google Developer Day 2010 Japan: Android でリアルタイムゲームを開発する方法: リベンジ (クリス プルエット)
Google Developer Day 2010 Japan: マーケットライセンシングを使って Android アプリケーションを守るには (トニー ...
Ad

Recently uploaded (20)

PPTX
Programs and apps: productivity, graphics, security and other tools
PPTX
Big Data Technologies - Introduction.pptx
PPTX
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
NewMind AI Weekly Chronicles - August'25 Week I
PDF
Approach and Philosophy of On baking technology
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
Per capita expenditure prediction using model stacking based on satellite ima...
PDF
Building Integrated photovoltaic BIPV_UPV.pdf
PPTX
Cloud computing and distributed systems.
PPTX
MYSQL Presentation for SQL database connectivity
PPTX
sap open course for s4hana steps from ECC to s4
PDF
MIND Revenue Release Quarter 2 2025 Press Release
PDF
Reach Out and Touch Someone: Haptics and Empathic Computing
PDF
Agricultural_Statistics_at_a_Glance_2022_0.pdf
PDF
Encapsulation theory and applications.pdf
PPTX
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
PPT
Teaching material agriculture food technology
Programs and apps: productivity, graphics, security and other tools
Big Data Technologies - Introduction.pptx
Detection-First SIEM: Rule Types, Dashboards, and Threat-Informed Strategy
Chapter 3 Spatial Domain Image Processing.pdf
NewMind AI Weekly Chronicles - August'25 Week I
Approach and Philosophy of On baking technology
Encapsulation_ Review paper, used for researhc scholars
ACSFv1EN-58255 AWS Academy Cloud Security Foundations.pptx
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Per capita expenditure prediction using model stacking based on satellite ima...
Building Integrated photovoltaic BIPV_UPV.pdf
Cloud computing and distributed systems.
MYSQL Presentation for SQL database connectivity
sap open course for s4hana steps from ECC to s4
MIND Revenue Release Quarter 2 2025 Press Release
Reach Out and Touch Someone: Haptics and Empathic Computing
Agricultural_Statistics_at_a_Glance_2022_0.pdf
Encapsulation theory and applications.pdf
Effective Security Operations Center (SOC) A Modern, Strategic, and Threat-In...
Teaching material agriculture food technology

Google Developer Day 2010 Japan: 高性能な Android アプリを作るには (ティム ブレイ)

  • 2. High-performance Android apps Tim Bray Developer DayGoogle 2010 Thursday, September 16, 2010
  • 3. Outline • Why care? • What is an ANR? Why do we see them? • Quantifying responsiveness and “jank” • Android SDK features for performance • Numbers to know • Storage and network issues • Tools • What to do? Developer DayGoogle 2010 Thursday, September 16, 2010
  • 4. “Jank” • Chrome team's term for stalling the event loop, i.e. not instantly responsive to input • Eliminate by: • Reacting to events quickly • Don't hog the event loop (“main” / UI) thread! • Getting back into the select() / epoll_wait() call ASAP, so... • … you can react to future events quickly (touches, drags) • Else... Developer DayGoogle 2010 Thursday, September 16, 2010
  • 6. ANR: “App Not Responding” • Happens when: • UI thread”) doesn't respond to input event in 5 seconds, or • a BroadcastReceiver doesn't finish in 10 seconds • Typically due to network or storage operations on main thread • But users complain about delays much less than 5 seconds! Developer DayGoogle 2010 Thursday, September 16, 2010
  • 7. Some Nexus One Numbers • ~0.04 ms: writing a byte on pipe process A->B, B->A or reading simple /proc files from Dalvik • ~0.12 ms: void/void Binder RPC call A->B, B->A • ~5-25 ms: uncached flash reading a byte • ~5-200+(!) ms: uncached flash writing tiny amount • 16 ms: one frame of 60 fps video • 100-200 ms: human perception of slow action • 108/350/500/800 ms: ping over 3G. varies! • ~1-6+ seconds: TCP setup + HTTP fetch of 6k via 3G Developer DayGoogle 2010 Thursday, September 16, 2010
  • 8. Writing to flash (yaffs2) Developer DayGoogle 2010 Source: empirical samples over Google employee phones (Mar 2010) • Create file, 512 byte write, delete (ala sqlite .journal in transaction) • Flash is different than disks you're likely used to: read, write, erase, wear-leveling, GC • Write performance is highly variable! Thursday, September 16, 2010
  • 9. Sqlite Performance • There’s no such thing as a cheap write • Use indexes (see EXPLAIN & EXPLAIN QUERY PLAN) • For logging, consider file-append rather than database-write Developer DayGoogle 2010 Thursday, September 16, 2010
  • 10. Lessons • Writing to storage is slow • Using the network is slow • Always assume the worst; performance is guaranteed to produce bad reviews and Market ratings Developer DayGoogle 2010 Thursday, September 16, 2010
  • 11. Tools: asyncTask Developer DayGoogle 2010 “AsyncTask enables proper and easy use of the UI thread. This class allows to perform background operations and publish results on the UI thread without having to manipulate threads and/or handlers.” Thursday, September 16, 2010
  • 12. Tool: asyncTask Developer DayGoogle 2010 private class DownloadFilesTask extends AsyncTask<URL, Integer, Long> { protected Long doInBackground(URL... urls) { // on some background thread int count = urls.length; long totalSize = 0; for (int i = 0; i < count; i++) { totalSize += Downloader.downloadFile(urls[i]); publishProgress((int) ((i / (float) count) * 100)); } return totalSize; } protected void onProgressUpdate(Integer... progress) { // on UI thread! setProgressPercent(progress[0]); } protected void onPostExecute(Long result) { // on UI thread! showDialog("Downloaded " + result + " bytes"); } } new DownloadFilesTask().execute(url1, url2, url3); // call from UI thread! Thursday, September 16, 2010
  • 13. Tool: asyncTask Developer DayGoogle 2010 private boolean handleWebSearchRequest(final ContentResolver cr) { ... new AsyncTask<Void, Void, Void>() { protected Void doInBackground(Void... unused) { Browser.updateVisitedHistory(cr, newUrl, false); Browser.addSearchUrl(cr, newUrl); return null; } }.execute() ... return true; } Thursday, September 16, 2010
  • 14. asyncTask Details • Must be called from a main thread • rather, a thread with a Handler/Looper • No nested calls! • An activity process may exit before its AsyncTask completes (user goes elsewhere, low RAM, etc). • If this is a problem, use IntentService Developer DayGoogle 2010 Thursday, September 16, 2010
  • 15. Tool: android.app.IntentService • “IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand. Clients send requests through startService(Intent) calls; the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.” • Intent happens in a Service, so Android tries hard not to kill it • Easy way to do use a Service Developer DayGoogle 2010 Thursday, September 16, 2010
  • 16. Calendar's use of IntentService Developer DayGoogle 2010 public class DismissAllAlarmsService extends IntentService { @Override public void onHandleIntent(Intent unusedIntent) { ContentResolver resolver = getContentResolver(); ... resolver.update(uri, values, selection, null); } } In AlertReceiver extends BroadcastReceiver, onReceive() (main thread) Intent intent = new Intent(context, DismissAllAlarmsService.class); context.startService(intent); Thursday, September 16, 2010
  • 17. UI Tips • Disable UI elements immediately, before kicking off your AsyncTask to finish the task • Use an animation or ProgressDialog to show you’re working • One example strategy: 1. Immediately, disable UI elementes 2. Briefly, a spinner in the title bar 3. If more than 200msec, show a ProgressDialog 4. in AsyncTask onPostExecute, cancel alarm timer Developer DayGoogle 2010 Thursday, September 16, 2010
  • 18. What to do? 1. Design the simplest thing that could possible work, where “could possibly work” excludes doing network transactions on the UI thread. Maybe it’ll be fast enough! 2. If it’s not fast enough, measure and find out why. 3. Fix the biggest performance problems. 4. goto 2 Developer DayGoogle 2010 Thursday, September 16, 2010
  • 19. Profiling Tools • Traceview (for CPU-bound apps) • dalvik.system.VMDebug#{start,stop}MethodTracing() • adb shell am profile <PROCESS> start <FILE> • adb shell am profile <PROCESS> stop • Log.d() calls with a timestamp aren’t terrible • Extreme profiling: Aggregate user profile data Developer DayGoogle 2010 Thursday, September 16, 2010
  • 20. Demo • Profiling Tim’s “LifeSaver 2” application Developer DayGoogle 2010 Thursday, September 16, 2010
  • 21. Thank you! Tim Bray, Developer Advocate twbray@google.com android-developers.blogspot.com @AndroidDev Developer DayGoogle 2010 Thursday, September 16, 2010