28
{ Andromance Android Performance Optimization O. Mert Şimşek /orhunmertsimsek mertsimsek.net 4pps.co

Andromance - Android Performance

Embed Size (px)

DESCRIPTION

Android Performance Optimization presentation which is told on @ DevFest Ankara 2013, @ DevFest Eskişehir 2013, @ DevFest Konya 2014, @DevFest İstanbul 2014

Citation preview

Page 1: Andromance - Android Performance

{ AndromanceAndroid Performance

Optimization

O. Mert Şimşek /orhunmertsimsekmertsimsek.net4pps.co

Page 2: Andromance - Android Performance

Orhun Mert Şimşek

• Co-Founder & CEO of 4pps• Android & iOS Developer• Educational Responsible at

GDG Ankara• Android Evangelist

Page 3: Andromance - Android Performance

Let’s Boost the App

Page 4: Andromance - Android Performance

Use Splash If You Need

It is better to show a splash, instead of grotty progress bars

Page 5: Andromance - Android Performance

internal Getters & Setters?

Without a JIT, direct field access is about 3x faster than invoking a trivial getter. With the JIT (where direct field access is as cheap as accessing a local), direct field access is about 7x faster than invoking a trivial getter.*

(*): http://developer.android.com/training/articles/perf-tips.html

Page 6: Andromance - Android Performance

StrictMode

If you think that you might be doing some bad things accidentally, you should use StrictMode

It is commonly used to detect accidental network or disc access on the UI thread.

Page 7: Andromance - Android Performance

StrictMode

public void onCreate() { if (DEVELOPER_MODE) { StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder() .detectDiskReads() .detectDiskWrites() .detectNetwork() // or .detectAll() for all detectable problems .penaltyLog() .build()); StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder() .detectLeakedSqlLiteObjects() .detectLeakedClosableObjects() .penaltyLog() .penaltyDeath() .build()); } super.onCreate(); }

An example

Page 8: Andromance - Android Performance

DDMS

Page 9: Andromance - Android Performance

Use Hierarchy Viewer

You can determine layers and some performance stats of UI with this tool

Hard to use but very effective!

Page 10: Andromance - Android Performance

Use Hierarchy Viewer

Page 11: Andromance - Android Performance

Use Hierarchy Viewer

Page 12: Andromance - Android Performance

Use Less Objects, More Primitives

Creating an object is extremely: EXPENSIVE!

… but «primitive» is not!

Using a 2 different integer array is more efficient than using object arrays like fooBar(int,int)

badArray = new FooBar[] { new FooBar(5,8) , new FooBar(84,2) };

firstCoolArray = new int[] { 5, 84 };secondCoolArray = new int[] { 8 , 2 };

Page 13: Andromance - Android Performance

How to Search a 2D Array?

Search first for row, then column

TO DO

for (int i = 0; i < foo.length ; i++) {for (int j = 0; j < foo.length ; j++) {

process(foo[i,j]);}

}

NOT TO DO

for (int i = 0; i < foo.length ; i++) {for (int j = 0; j < foo.length ; j++) {

process(foo[j,i]);}

}

Page 14: Andromance - Android Performance

Use «Static» as Possible

It is 15% - 20%  faster!

And also use «static final» for your constants

Static variables are initialized only once , at the start of the execution.

Page 15: Andromance - Android Performance

«Lint» Usage

The lint tool checks your Android project source files for potential bugs and optimization improvements for correctness, security, performance, usability, accessibility, and internationalization. *

http://developer.android.com/tools/debugging/improving-w-lint.html

Page 16: Andromance - Android Performance

«Lint» Usage

In Eclipse it is easy to use, just one click!

In command line:

«lint [flags] <project directory>»

«lint myproject»

«lint --check MissingPrefix myproject»

Page 17: Andromance - Android Performance

Reusable Layouts

<include layout="@layout/titlebar"/>

It is commonly used for title bars, yes-no button panels etc.

Very easy to implement: Create a layout and use it in another layout with «<include ../>» tag

Page 18: Andromance - Android Performance

Do Your Hard-Work on Background Threads

It is forbidden to make network processes in main thread, since Android 3.0

How about Instagram? When you finished writing some hashtags and pressed to send button,

It had been posted just a while ago!

Page 19: Andromance - Android Performance

View Holder for ListView Objects

static class ViewHolder {  TextView text;  TextView timestamp;  ImageView icon;}

ViewHolder holder = new ViewHolder();holder.icon = (ImageView) convertView.findViewById(R.id.listitem_image);holder.text = (TextView) convertView.findViewById(R.id.listitem_text);…

A ViewHolder object stores each of the component views inside the ListView object, so you can immediately access them without the need to look them up repeatedly.

Smooth!

Page 20: Andromance - Android Performance

XML Drawables

PNG’s, JPG’s and others are big sized and a hard work for mobile device.

But creating an image with XML is very cheap and it is more efficient than you expected.

Using a 400 kb background image or using an Xml drawable which has size of just 300 bytes?

Page 21: Andromance - Android Performance

XML Drawables

<?xml version="1.0" encoding="UTF-8"?><shape  xmlns:android="http://schemas.android.com/apk/res/android"  android:shape="rectangle">  <stroke    android:width="3dp"    android:color="#000000" />  <gradient    android:endColor="#F5CD7A"    android:startColor="#657892"    android:angle="90" /></shape>

Page 22: Andromance - Android Performance

Handling Overdraws

The most important part of performance. – If you ask me!

Since Android 4.2, we can see overdraws in our devices.

Overdraw is simply, drawing a pixel more than once.

It’s notation is also simple:

• No color: No overdraw• Blue: 1x overdraw (pixel is drawed 2 times)• Green: 2x overdraw• Light Red: 3x overdraw• Dark Red: 4x or more overdraw (ALERT!)

Page 23: Andromance - Android Performance

Handling Overdraws

SpotifyYoutube

Page 24: Andromance - Android Performance

• Acceptable red areas

• Mostly blue and green

• Optimized by Romain Guy - The God of Android Performance Optimization

Page 25: Andromance - Android Performance

• JUST red areas

• Whole screen is drawed more than 5 times

• Probably haven’t checked for overdraws

Page 26: Andromance - Android Performance

Handling Overdraws

How to avoid?

Actually its secret is written at the last one

• thumbnail.setBackgroundColor(0x0);• android:windowBackground="@null"• If a view will not used anymore, don’t make its visibility «INVISIBLE»,

make it «GONE»• And use a simple design!

Page 27: Andromance - Android Performance

Summary and Little Other Tips

Do use two parallel «int» arrays instead of array of objects (int,int) Do use «primitive» instead of objects Do use as possible as «static» methods Do use «static final» for constants Do use foreach instead of for Do use as possible as Xml Drawables instead of images (jpg,png)

Don’t create unnecessary objects Don’t allocate memory if you can work without it Don’t use getters and setters inside the class Don’t do your hard works on main thread

and the most important one: Don’t publish your app unless it doesn’t have performance problems!

Page 28: Andromance - Android Performance

Torment Is Over, That’s All!

Thanks for listening!

O. Mert Şimşek /orhunmertsimsekmertsimsek.net