it's always your fault. poznań adg 2016
TRANSCRIPT
![Page 1: It's always your fault. Poznań ADG 2016](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/1.jpg)
Android Technical Lead
Applause Inc.
Przemek Jakubczyk
pjakubczyk
@pjakubczyk
1
![Page 2: It's always your fault. Poznań ADG 2016](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/2.jpg)
A guide to make crashproof libraries
It's always your fault
2
![Page 3: It's always your fault. Poznań ADG 2016](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/3.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/4.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/5.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/6.jpg)
GRADLE
6
![Page 7: It's always your fault. Poznań ADG 2016](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/7.jpg)
Just use it.
7
because it’s the base for Android build system
![Page 8: It's always your fault. Poznań ADG 2016](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/8.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/9.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/10.jpg)
Gradle
10
Not possible :)
Often heard question. How to pass arguments to tasks?
![Page 11: It's always your fault. Poznań ADG 2016](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/11.jpg)
Create new task for each configuration.
Gradle
11
task buildAll (
dependsOn:
["assembleFreeRelease,
assemblePaidRelease"]
)
![Page 12: It's always your fault. Poznań ADG 2016](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/12.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/13.jpg)
Java
13
![Page 14: It's always your fault. Poznań ADG 2016](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/14.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/15.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/16.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/17.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/18.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/19.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/20.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/21.jpg)
Android
21
![Page 22: It's always your fault. Poznań ADG 2016](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/22.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/23.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/24.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/25.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/26.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/27.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/28.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/29.jpg)
The End
29
![Page 30: It's always your fault. Poznań ADG 2016](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/30.jpg)
License
30
![Page 31: It's always your fault. Poznań ADG 2016](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/31.jpg)
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](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/32.jpg)
Thank you
32
![Page 33: It's always your fault. Poznań ADG 2016](https://reader033.vdocuments.us/reader033/viewer/2022051521/58ebbf831a28aba7318b4639/html5/thumbnails/33.jpg)
A guide to make crashproof libraries
It's always your fault
33