it's always your fault. poznań adg 2016

33
Android Technical Lead Applause Inc. Przemek Jakubczyk pjakubczyk @pjakubczyk 1

Upload: przemek-jakubczyk

Post on 22-Jan-2018

486 views

Category:

Mobile


2 download

TRANSCRIPT

Page 1: It's always your fault. Poznań ADG 2016

Android Technical Lead

Applause Inc.

Przemek Jakubczyk

pjakubczyk

@pjakubczyk

1

Page 2: It's always your fault. Poznań ADG 2016

A guide to make crashproof libraries

It's always your fault

2

Page 3: It's always your fault. Poznań ADG 2016

Background

At Applause I am responsible for quality

Applause SDK is crash and bug reporting library

shipped to over 1000 customers

SDK works with apps around the world

3

Page 4: It's always your fault. Poznań ADG 2016

History

Joined 2 years ago to project with no QA

Today ~1800 unit tests covering 3k methods

82% lines covered

Last major problem was support for Marshmallow

4

Other than that over 6 months of no customer complain

Page 5: It's always your fault. Poznań ADG 2016

How your SDK should look like

Be universal

Work in every provided configuration

Be robust

Work in any environment

Be defensive

5

Page 6: It's always your fault. Poznań ADG 2016

GRADLE

6

Page 7: It's always your fault. Poznań ADG 2016

Just use it.

7

because it’s the base for Android build system

Page 8: It's always your fault. Poznań ADG 2016

Gradle

use simple tricks to protect your

styling

8

android {

resourcePrefix 'applause_'

}

or pass custom values to source

code via DSL

defaultConfig {

resValue "string","applause_library_version”, "$version"

}

Page 9: It's always your fault. Poznań ADG 2016

Gradle

easier integration with your Groovy

scripts

for example create own distribution

task

task buildAll (

dependsOn: 'assembleRelease',

type: Copy) {

from “build/outputs/”

into “another_path”

}

9

Page 10: It's always your fault. Poznań ADG 2016

Gradle

10

Not possible :)

Often heard question. How to pass arguments to tasks?

Page 11: It's always your fault. Poznań ADG 2016

Create new task for each configuration.

Gradle

11

task buildAll (

dependsOn:

["assembleFreeRelease,

assemblePaidRelease"]

)

Page 12: It's always your fault. Poznań ADG 2016

Gradle

With great power comes great responsibility

Mind the execution time

Common trick is to use VCS for versionNumber, each run takes time

If possible (please!) don’t make http calls - huge delay, timeout, offline?

Use only in tasks, not in build script evaluation.

12

Page 13: It's always your fault. Poznań ADG 2016

Java

13

Page 14: It's always your fault. Poznań ADG 2016

Java

catching Exception doesn’t solve problem

often hides real cause

tempting but dangerous

14

try {

network.getClients();

} catch (Exception e) {

// handle exception

}

Page 15: It's always your fault. Poznań ADG 2016

Java

Null Object Pattern

instead constantly checking for not null

value

15

public interface Api {

void post(String action);

Api NULL = new Api() {

void post(String action){}

};

}

getApi().post(“Works”)

Page 16: It's always your fault. Poznań ADG 2016

Java

NPE

Null Pointer Exception is the most popular

exception thrown in runtime.

NullObject pattern partially solves the problem.

Use empty objects, collections etc;

16

List<User> fetchUsers(){

try {

return api.getAllUsers();

} catch (IOException e){

return new

ArrayList<Users>();

}

}

Page 17: It's always your fault. Poznań ADG 2016

Java

Usually library is started by one static method

… and next versions provide more functionality

Init interface becomes complex

17

Page 18: It's always your fault. Poznań ADG 2016

Java

public static void start(

String baseUrl,

String defaultUser,

String defaultPassword,

boolean cacheRequests,

boolean forceHttps,

int timeout

)

18

Conf conf = new Conf.Builder()

.withUrl(“http://api.github.com”)

.withUser(“pjakubczyk”)

.withPassword(“droidcon2015Krakow”)

.withCache(false)

.withHttps(true)

.withTimeout(15)

.build();

Library.start(conf);

Page 19: It's always your fault. Poznań ADG 2016

Java

Builder pattern organize configuration

Easier data validation

Pass only parameters user wants

Handling default values

19

Page 20: It's always your fault. Poznań ADG 2016

Java

methods, fields, constructors

default, private, protected, public

Might sound a bit controversial

I use default or public

A.Reflection

B.Allow developers to override, it’s their responsibility 20

Page 21: It's always your fault. Poznań ADG 2016

Android

21

Page 22: It's always your fault. Poznań ADG 2016

Android

View.inEditMode() determines if view is drawn in Android Studio

Usually to disable other components

Let’s invert the usage

22

Page 23: It's always your fault. Poznań ADG 2016

23

public void onFinishInflate(){

TextView title = findViewById(R.id.title);

if(inEditMode()) {

int count = title.getText().length();

if(count > 30){

title.setTextSize(24.0f);

} else {

title.setTextSize(30.0f);

}

}

}

Page 24: It's always your fault. Poznań ADG 2016

Android

Build.VERSION.SDK_INT

ApplicationInfo.targetSdkVersion

the library doesn’t know where it’s run

24

Page 25: It's always your fault. Poznań ADG 2016

Android

usually interface for loading pictures from to web to Widget looks like this:

pictureLoader.load(“url_to_resource”, imageView);

passing arguments extending from View, Activity etc.

often lead to Memory leak

queue is flooded with requests holding all references

25

Page 26: It's always your fault. Poznań ADG 2016

Android

Android Studio is bundled with great profilers

Use memory usage graph to monitor you cache logic

Use cpu usage graph to monitor your custom views behaviour.

Use network traffic graph to check if your code doesn’t call web for stuff which

suppose to be in cache

26

Page 27: It's always your fault. Poznań ADG 2016

Android

ProGuard is outstanding tool to shrink code and inject bytecode optimizations

While shipping your code you must either provide:

copy&paste configuration to ProGuard (latest plugin supports auto-configuration)

be transparent to ProGuard.

Configuration vs Transparency?

Transparency!27

Page 28: It's always your fault. Poznań ADG 2016

Android http://www.methodscount.com/

28

Product Method count

com.squareup.okhttp3:okhttp:3.0.1 2704

io.relayr:android-sdk:1.0.2 5413

io.reactivex:rxjava:1.1.0 4605

com.google.code.gson:gson:2. 1341

com.applause:applause-sdk:3.4.0 5041

com.fasterxml.jackson.core:jackson-databind:2.7.0 10732

com.parse:parse-android:1.13.0 4543

Page 29: It's always your fault. Poznań ADG 2016

The End

29

Page 30: It's always your fault. Poznań ADG 2016

License

30

Page 31: It's always your fault. Poznań ADG 2016

Licence

31

by default you own the copyright

no licence doesn’t conclue you can use it in your project

open code (found online) != open source movement

transferring code goes along with transferring the ownership

Check the licence

Check if it infects yours

(Apache, MIT vs GPL v2, LGPL, BSD)

Page 32: It's always your fault. Poznań ADG 2016

Thank you

32

Page 33: It's always your fault. Poznań ADG 2016

A guide to make crashproof libraries

It's always your fault

33