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

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

PDF
Android - Open Source Bridge 2011
sullis
 
PPTX
Appcelerator Titanium Intro
Nicholas Jansma
 
PPTX
Using Modern Browser APIs to Improve the Performance of Your Web Applications
Nicholas Jansma
 
PDF
Recap of the google io 2017
Karan Trehan
 
KEY
SumitK's mobile app dev using drupal as base ststem
Sumit Kataria
 
PDF
l1-reactnativeintroduction-160816150540.pdf
Hương Trà Pé Xjnk
 
PPTX
solution Challenge design and flutter day.pptx
GoogleDeveloperStude22
 
PDF
React Native Introduction: Making Real iOS and Android Mobile App By JavaScript
Kobkrit Viriyayudhakorn
 
PDF
Android 3.1 - Portland Code Camp 2011
sullis
 
PPTX
Reliable mobile test automation
Vishal Banthia
 
PDF
Web App Prototypes with Google App Engine
Vlad Filippov
 
PDF
Google's serverless journey: past to present
wesley chun
 
PDF
An introduction to Titanium
Graham Weldon
 
PDF
jQuery Conference San Diego 2014 - Web Performance
dmethvin
 
PPTX
Appcelerator Titanium - An Introduction to the Titanium Ecosystem
Boydlee Pollentine
 
PPT
Unit I- ANDROID OVERVIEW.ppt
dineshkumar periyasamy
 
PDF
jQuery: The World's Most Popular JavaScript Library Comes to XPages
Teamstudio
 
PPTX
L4-AndroidProgramming presentation for student
vimalpcwork
 
PDF
Android 3.0 Portland Java User Group 2011-03-15
sullis
 
PPTX
Using Azure Functions for Integration
BizTalk360
 
Android - Open Source Bridge 2011
sullis
 
Appcelerator Titanium Intro
Nicholas Jansma
 
Using Modern Browser APIs to Improve the Performance of Your Web Applications
Nicholas Jansma
 
Recap of the google io 2017
Karan Trehan
 
SumitK's mobile app dev using drupal as base ststem
Sumit Kataria
 
l1-reactnativeintroduction-160816150540.pdf
Hương Trà Pé Xjnk
 
solution Challenge design and flutter day.pptx
GoogleDeveloperStude22
 
React Native Introduction: Making Real iOS and Android Mobile App By JavaScript
Kobkrit Viriyayudhakorn
 
Android 3.1 - Portland Code Camp 2011
sullis
 
Reliable mobile test automation
Vishal Banthia
 
Web App Prototypes with Google App Engine
Vlad Filippov
 
Google's serverless journey: past to present
wesley chun
 
An introduction to Titanium
Graham Weldon
 
jQuery Conference San Diego 2014 - Web Performance
dmethvin
 
Appcelerator Titanium - An Introduction to the Titanium Ecosystem
Boydlee Pollentine
 
Unit I- ANDROID OVERVIEW.ppt
dineshkumar periyasamy
 
jQuery: The World's Most Popular JavaScript Library Comes to XPages
Teamstudio
 
L4-AndroidProgramming presentation for student
vimalpcwork
 
Android 3.0 Portland Java User Group 2011-03-15
sullis
 
Using Azure Functions for Integration
BizTalk360
 

More from Google Developer Relations Team (10)

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

Recently uploaded (20)

PDF
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
PPTX
MuleSoft MCP Support (Model Context Protocol) and Use Case Demo
shyamraj55
 
PDF
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
PDF
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
PDF
SIZING YOUR AIR CONDITIONER---A PRACTICAL GUIDE.pdf
Muhammad Rizwan Akram
 
PDF
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
PDF
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
PPTX
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit
 
PDF
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
PDF
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
PPTX
Agentforce World Tour Toronto '25 - Supercharge MuleSoft Development with Mod...
Alexandra N. Martinez
 
PDF
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
PDF
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
PPTX
Mastering ODC + Okta Configuration - Chennai OSUG
HathiMaryA
 
PDF
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
PPTX
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
DOCX
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
PDF
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
PPTX
Digital Circuits, important subject in CS
contactparinay1
 
PDF
The 2025 InfraRed Report - Redpoint Ventures
Razin Mustafiz
 
LOOPS in C Programming Language - Technology
RishabhDwivedi43
 
MuleSoft MCP Support (Model Context Protocol) and Use Case Demo
shyamraj55
 
“Voice Interfaces on a Budget: Building Real-time Speech Recognition on Low-c...
Edge AI and Vision Alliance
 
[Newgen] NewgenONE Marvin Brochure 1.pdf
darshakparmar
 
SIZING YOUR AIR CONDITIONER---A PRACTICAL GUIDE.pdf
Muhammad Rizwan Akram
 
NLJUG Speaker academy 2025 - first session
Bert Jan Schrijver
 
“Computer Vision at Sea: Automated Fish Tracking for Sustainable Fishing,” a ...
Edge AI and Vision Alliance
 
AI Penetration Testing Essentials: A Cybersecurity Guide for 2025
defencerabbit
 
What’s my job again? Slides from Mark Simos talk at 2025 Tampa BSides
Mark Simos
 
NASA A Researcher’s Guide to International Space Station : Physical Sciences ...
Dr. PANKAJ DHUSSA
 
Agentforce World Tour Toronto '25 - Supercharge MuleSoft Development with Mod...
Alexandra N. Martinez
 
Newgen 2022-Forrester Newgen TEI_13 05 2022-The-Total-Economic-Impact-Newgen-...
darshakparmar
 
“NPU IP Hardware Shaped Through Software and Use-case Analysis,” a Presentati...
Edge AI and Vision Alliance
 
Mastering ODC + Okta Configuration - Chennai OSUG
HathiMaryA
 
Transcript: Book industry state of the nation 2025 - Tech Forum 2025
BookNet Canada
 
Future Tech Innovations 2025 – A TechLists Insight
TechLists
 
Python coding for beginners !! Start now!#
Rajni Bhardwaj Grover
 
Bitcoin for Millennials podcast with Bram, Power Laws of Bitcoin
Stephen Perrenod
 
Digital Circuits, important subject in CS
contactparinay1
 
The 2025 InfraRed Report - Redpoint Ventures
Razin Mustafiz
 
Ad

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 [email protected] android-developers.blogspot.com @AndroidDev Developer DayGoogle 2010 Thursday, September 16, 2010