SlideShare a Scribd company logo
1 of 55
Download to read offline
Don’t go crashing my
heart
ŽELJKO PLESAC
ANDROID NOWADAYS
• more than 1.4 billions of users
• 23 different SDK versions
• 1,294 device vendors with more than 24,093 distinct
Android devices
YOUR USERS DESERVE
BEAUTIFUL APPLICATIONS,
WITH BEST POSSIBLE USER
EXPERIENCE.
CRASHES HAVE ENORMOUS
AFFECT ON USER
EXPERIENCE.
NOBODY LIKES CRASHES*.
* EXPECT TESTERS
PROVIDE BETTER CRASH EXPERIENCE
• you should care about your crashes and try to minimise
them
• optimise your applications in a way, that you can detect
crash even before it occurs
01USE STATIC CODE CHECKERS &
WRITE TESTS
Strict rules
• use at least default set of rules
• enforce zero tolerance to all static
code checker warnings and
errors
• aim for high test code coverage
• don’t test only for positive
outcomes, test also for negative
• write stress tests
• always insert at least one test
which will throw an exception or
bug
• all tests have to pass before
merging into development
TESTS STABILITY?
Test frameworks have bugs. CI
servers also. Android platform also.
HANDLING FAILED TESTS
• all failed tests have to be carefully examined
• if they are not caused by your code, ignore them but test
them once again when new version of testing platform is
available
• this doesn’t mean that everything is not your fault
03USE CONTINUOUS
INTEGRATION
CONTINOUS INTEGRATION
• static code checkers & tests automation
• a lot of available products - Jenkins, Travis, CircleCI…
• use protected branches for master and development branch
• use Git flow (or some other pattern)
04HANDLE COMMON ANDROID
PROBLEMS - MEMORY LEAKS
MEMORY LEAKS
• they will cause problems and crash your applications
• a lot of great tools
A memory leak detection library for Android and Java,
developed by Square (Pierre-Yves Ricau).
De facto standard for detecting memory leaks, use it in your
debug builds.
LEAK CANARY
• detects memory leaks in your
application, external libraries,
event Android OS itself
• it will not give you an answer
what is the cause of a leak, just
an information that the leak has
occurred
WEAK REFERENCES ARE NOT
THE ANSWER TO
EVERYTHING.
05CRASH FAST
CRASH YOU APPLICATIONS AS SOON
AS POSSIBLE
• Square’s approach to handling crashes (presentation and
video)
• organise your code in a way that it crashes as soon as
possible
• use exceptions
• null values are evil
package co.infinum.crashhandler.sampleapp;
/**
* Created by Željko Plesac on 13/03/16.
*/
public class Person {
private String name;
private String surname;
public Person(String name, String surname) {
this.name = name;
this.surname = surname;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSurname() {
return surname;
}
public void setSurname(String surname) {
this.surname = surname;
}
}
package co.infinum.crashhandler.sampleapp;
/**
* Created by Željko Plesac on 13/03/16.
*/
public class PersonUtils {
private PersonUtils() {
}
public static String getFullName(Person person) {
return person.getName() + person.getSurname();
}
}
package co.infinum.crashhandler.sampleapp;
/**
* Created by Željko Plesac on 13/03/16.
*/
public class PersonUtils {
private PersonUtils() {
}
public static String getFullName(Person person) {
if(person != null){
return person.getName() + person.getSurname();
}
else{
return null;
}
}
}
package co.infinum.crashhandler.sampleapp;
/**
* Created by Željko Plesac on 13/03/16.
*/
public class PersonUtils {
private PersonUtils() {
}
public static String getFullName(Person person) {
if (person == null) {
throw new IllegalStateException("Person cannot be null!”);
}
return person.getName() + person.getSurname();
}
}
06LOG AND MEASURE
LOG AND MEASURE YOUR CRASHES
• lot of great tools (Crashlytics, AppsDynamics, Crittercism)
• analyse your crashes
• are crashes happening on custom ROMs?
• are crashes occurring only on cheap phones?
• are your crashes frequent?
I don’t care about
warnings, only errors.
- KING HENRIK VIII.
TRY-CATCH BLOCK AND EXCEPTIONS
• you should care about your handled exceptions
• they have to be logged and analysed
• should contain useful information
package co.infinum.crashhandler.sampleapp;
/**
* Created by Željko Plesac on 13/03/16.
*/
public class ProfilePresenterImpl implements ProfilePresenter{
private Person person;
private ProfileView view;
public ProfilePresenterImpl(Profile person){
this.person = person;
}
…
public void showPersonData() {
view.showFullName(PersonUtils.getFullName(person)));
view.showBirthday(PersonUtils.getFormattedBirthday(person)));
view.hideLoadingDialog();
}
}
package co.infinum.crashhandler.sampleapp;
/**
* Created by Željko Plesac on 13/03/16.
*/
public class ProfilePresenterImpl implements ProfilePresenter{
private Person person;
private ProfileView view;
public ProfilePresenterImpl(Profile person){
this.person = person;
}
…
public void showPersonData() {
String fullName = PersonUtils.getFullName(person));
if(fullName != null){
view.showFullName(PersonUtils.getFullName(person)));
}
view.showBirthday(PersonUtils.getFormattedBirthday(person)));
view.hideLoadingDialog();
}
}
package co.infinum.crashhandler.sampleapp;
/**
* Created by Željko Plesac on 13/03/16.
*/
public class ProfilePresenterImpl implements ProfilePresenter{
private Person person;
private ProfileView view;
public ProfilePresenterImpl(Profile person){
this.person = person;
}
…
public void showPersonData() {
try{
String fullName = PersonUtils.getFullName(person));
if(fullName != null){
view.showFullName(PersonUtils.getFullName(person)));
}
view.showBirthday(PersonUtils.getFormattedBirthday(person))));}
}
catch(Exception e){
e.prinStackTrace();
view.showErrorDialog();
}
}
}
TIMBER
• Utility on top of Android's normal Log class
• by Jake Wharton
Timber.plant(new Timber.DebugTree());
Timber.d(...)
Timber.i(...)
Timber.v(...)
Timber.e(...)
Timber.w(...)
Timber.wtf(...)
CRASH REPORTING TREE
private static class CrashReportingTree extends Timber.Tree {



@Override

protected void log(int priority, String tag, String message, Throwable t) {

if (priority == Log.VERBOSE || priority == Log.DEBUG) {

return;

}



// will write to the crash report but NOT to logcat

Crashlytics.log(message);



if (t != null) {

Crashlytics.logException(t);

}

}

}
CRASH REPORTING TREE
@Override

public void onCreate() {

super.onCreate();
CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder()
.disabled(BuildConfig.DEBUG).build();
Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build());
if (BuildConfig.DEBUG) {

Timber.plant(new Timber.DebugTree());

} else {

Timber.plant(new CrashReportingTree());

}

}
package co.infinum.crashhandler.sampleapp;
/**
* Created by Željko Plesac on 13/03/16.
*/
public class ProfilePresenterImpl implements ProfilePresenter{
private Person person;
private ProfileView view;
public ProfilePresenterImpl(Profile person){
this.person = person;
}
…
public void showPersonData() {
try{
String fullName = PersonUtils.getFullName(person));
if(fullName != null){
view.showFullName(PersonUtils.getFullName(person)));
}
view.showBirthday(PersonUtils.getFormattedBirthday(person))));}
}
catch(Exception e){
Timber.e(e, “Failure in “ + getClass().getSimpleName());
view.showErrorDialog();
}
}
}
/**
* Logs everything to crashlytics, then we just need to log an exception and we
should see all prior logs online!
*/
private static class RemoteDebuggingTree extends Timber.Tree {
@Override
protected void log(int priority, String tag, String message, Throwable t) {
// will write to the crash report as well to logcat
Crashlytics.log(priority, tag, message);
if (t != null) {
Crashlytics.logException(t);
}
}
}
08HIDE CRASHES FROM YOUR
USERS
Crashes are just
exceptions,
which are not
handled by your
application*.
* IN MOST CASES
APP CRASH HANDLERS
• define custom app crash handler in all of your production
builds
• avoid ugly system dialogs
• simple configuration
• apps are restarted, so they go into stable state
• watch for cyclic bugs!
public class AppCrashHandler implements Thread.UncaughtExceptionHandler {



private Activity liveActivity;



public AppCrashHandler(Application application) {

application.registerActivityLifecycleCallbacks(new
Application.ActivityLifecycleCallbacks() { 

@Override

public void onActivityResumed(Activity activity) {

liveActivity = activity;

}

@Override

public void onActivityPaused(Activity activity) {

liveActivity = null;

}

});

}

@Override

public void uncaughtException(Thread thread, Throwable ex) {

if(liveActivity != null){

Intent intent = new Intent(getApplicationContext(), MainActivity.class);

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

liveActivity.finish();

liveActivity.startActivity(intent);

}



System.exit(0);

}

}
CUSTOM CRASH HANDLER
APPLICATION CLASS
@Override

public void onCreate() {

super.onCreate();

Thread.setDefaultUncaughtExceptionHandler(new AppCrashHandler(this));

}
→
EXAMPLE
08USE STAGED ROLLOUTS
STAGED ROLLOUT
• can only be used for app updates, not when publishing an
app for the first time
• your update reaches only a percentage of your users, which
you can increase over time
STAGED ROLLOUT PROCESS ①
• at first, define that your update is only available to small
percentage of your users (I.E. 5%)
• closely monitor crash reports and user feedback
• users receiving the staged rollout can leave public
reviews on Google Play
• if everything goes OK, increase the percentage
• if you get negative feedback or encounter some bugs, halt
the process and fix all of reported problems
10HARSH TRUTH
YOUR APPS WILL CRASH IN
PRODUCTION, AND THERE IS
NOTHING YOU CAN DO TO
PREVENT IT.
THERE IS NO SUCH THING AS 100%
CRASH FREE ANDROID APPLICATION
• large number of different devices
• large number of OS versions
• in most cases, proposed minimum API value is 15 and
the current stable version is 23, which means that your
app has to work on 8 different API versions
• device vendors alter Android OS - they add custom
solutions and bloatware
• rooted Android devices - core functionalities can be altered
THINGS ARE GOING TO
BECOME EVEN MORE
COMPLICATED.
Phones, tablets, phablets, freezers, smartwatches, cars, bikes,
boards….
ANDROID IS EXPANDING.
MultiWindow support, Jack compiler, new APIs, deprecated
APIs, new programming languages…
ANDROID IS GETTING NEW
FEATURES.
THAT’S THE BEAUTY OF
ANDROID.
DEVELOPERS WILL ALWAYS FIND A WAY.
Thank you!
Visit www.infinum.co or find us on social networks:
infinum.co infinumco infinumco infinum
TWITTER: @ZELJKOPLESAC
EMAIL: ZELJKO.PLESAC@INFINUM.CO

More Related Content

What's hot

A guide to Android automated testing
A guide to Android automated testingA guide to Android automated testing
A guide to Android automated testingjotaemepereira
 
LDNSE: Testdroid for Mobile App and Web Testing (London Selenium Meetup)
LDNSE: Testdroid for Mobile App and Web Testing (London Selenium Meetup)LDNSE: Testdroid for Mobile App and Web Testing (London Selenium Meetup)
LDNSE: Testdroid for Mobile App and Web Testing (London Selenium Meetup)Bitbar
 
Writing simple buffer_overflow_exploits
Writing simple buffer_overflow_exploitsWriting simple buffer_overflow_exploits
Writing simple buffer_overflow_exploitsD4rk357 a
 
Justin collins - Practical Static Analysis for continuous application delivery
Justin collins - Practical Static Analysis for continuous application deliveryJustin collins - Practical Static Analysis for continuous application delivery
Justin collins - Practical Static Analysis for continuous application deliveryDevSecCon
 
Because you can’t fix what you don’t know is broken...
Because you can’t fix what you don’t know is broken...Because you can’t fix what you don’t know is broken...
Because you can’t fix what you don’t know is broken...Marcel Bruch
 
Pwning mobile apps without root or jailbreak
Pwning mobile apps without root or jailbreakPwning mobile apps without root or jailbreak
Pwning mobile apps without root or jailbreakAbraham Aranguren
 
Security Vulnerabilities in Mobile Applications (Kristaps Felzenbergs)
Security Vulnerabilities in Mobile Applications (Kristaps Felzenbergs)Security Vulnerabilities in Mobile Applications (Kristaps Felzenbergs)
Security Vulnerabilities in Mobile Applications (Kristaps Felzenbergs)TestDevLab
 
Inversion Of Control
Inversion Of ControlInversion Of Control
Inversion Of Controlbhochhi
 
Beyond the Basics, Debugging with Firebug and Web Inspector
Beyond the Basics, Debugging with Firebug and Web InspectorBeyond the Basics, Debugging with Firebug and Web Inspector
Beyond the Basics, Debugging with Firebug and Web InspectorSteven Roussey
 
Testing on Android
Testing on AndroidTesting on Android
Testing on AndroidAri Lacenski
 
Критика "библиотечного" подхода в разработке под Android. UA Mobile 2016.
Критика "библиотечного" подхода в разработке под Android. UA Mobile 2016.Критика "библиотечного" подхода в разработке под Android. UA Mobile 2016.
Критика "библиотечного" подхода в разработке под Android. UA Mobile 2016.UA Mobile
 
Robotium at Android Only 2010-09-29
Robotium at Android Only 2010-09-29Robotium at Android Only 2010-09-29
Robotium at Android Only 2010-09-29Hugo Josefson
 
NicoleMaguire_NEES_FinalReport
NicoleMaguire_NEES_FinalReportNicoleMaguire_NEES_FinalReport
NicoleMaguire_NEES_FinalReportNicole Maguire
 
Lab Implementation of Boolean logic in LabVIEW FPGA
Lab Implementation of Boolean logic in LabVIEW FPGALab Implementation of Boolean logic in LabVIEW FPGA
Lab Implementation of Boolean logic in LabVIEW FPGAVincent Claes
 
Anti-Debugging - A Developers View
Anti-Debugging - A Developers ViewAnti-Debugging - A Developers View
Anti-Debugging - A Developers ViewTyler Shields
 
Selenium interview questions and answers
Selenium interview questions and answersSelenium interview questions and answers
Selenium interview questions and answerskavinilavuG
 
Game Programming 06 - Automated Testing
Game Programming 06 - Automated TestingGame Programming 06 - Automated Testing
Game Programming 06 - Automated TestingNick Pruehs
 

What's hot (20)

A guide to Android automated testing
A guide to Android automated testingA guide to Android automated testing
A guide to Android automated testing
 
LDNSE: Testdroid for Mobile App and Web Testing (London Selenium Meetup)
LDNSE: Testdroid for Mobile App and Web Testing (London Selenium Meetup)LDNSE: Testdroid for Mobile App and Web Testing (London Selenium Meetup)
LDNSE: Testdroid for Mobile App and Web Testing (London Selenium Meetup)
 
Writing simple buffer_overflow_exploits
Writing simple buffer_overflow_exploitsWriting simple buffer_overflow_exploits
Writing simple buffer_overflow_exploits
 
Justin collins - Practical Static Analysis for continuous application delivery
Justin collins - Practical Static Analysis for continuous application deliveryJustin collins - Practical Static Analysis for continuous application delivery
Justin collins - Practical Static Analysis for continuous application delivery
 
Because you can’t fix what you don’t know is broken...
Because you can’t fix what you don’t know is broken...Because you can’t fix what you don’t know is broken...
Because you can’t fix what you don’t know is broken...
 
Need 4 Speed FI
Need 4 Speed FINeed 4 Speed FI
Need 4 Speed FI
 
Pwning mobile apps without root or jailbreak
Pwning mobile apps without root or jailbreakPwning mobile apps without root or jailbreak
Pwning mobile apps without root or jailbreak
 
Security Vulnerabilities in Mobile Applications (Kristaps Felzenbergs)
Security Vulnerabilities in Mobile Applications (Kristaps Felzenbergs)Security Vulnerabilities in Mobile Applications (Kristaps Felzenbergs)
Security Vulnerabilities in Mobile Applications (Kristaps Felzenbergs)
 
Inversion Of Control
Inversion Of ControlInversion Of Control
Inversion Of Control
 
Selenium Handbook
Selenium HandbookSelenium Handbook
Selenium Handbook
 
Beyond the Basics, Debugging with Firebug and Web Inspector
Beyond the Basics, Debugging with Firebug and Web InspectorBeyond the Basics, Debugging with Firebug and Web Inspector
Beyond the Basics, Debugging with Firebug and Web Inspector
 
Testing on Android
Testing on AndroidTesting on Android
Testing on Android
 
Robotium Tutorial
Robotium TutorialRobotium Tutorial
Robotium Tutorial
 
Критика "библиотечного" подхода в разработке под Android. UA Mobile 2016.
Критика "библиотечного" подхода в разработке под Android. UA Mobile 2016.Критика "библиотечного" подхода в разработке под Android. UA Mobile 2016.
Критика "библиотечного" подхода в разработке под Android. UA Mobile 2016.
 
Robotium at Android Only 2010-09-29
Robotium at Android Only 2010-09-29Robotium at Android Only 2010-09-29
Robotium at Android Only 2010-09-29
 
NicoleMaguire_NEES_FinalReport
NicoleMaguire_NEES_FinalReportNicoleMaguire_NEES_FinalReport
NicoleMaguire_NEES_FinalReport
 
Lab Implementation of Boolean logic in LabVIEW FPGA
Lab Implementation of Boolean logic in LabVIEW FPGALab Implementation of Boolean logic in LabVIEW FPGA
Lab Implementation of Boolean logic in LabVIEW FPGA
 
Anti-Debugging - A Developers View
Anti-Debugging - A Developers ViewAnti-Debugging - A Developers View
Anti-Debugging - A Developers View
 
Selenium interview questions and answers
Selenium interview questions and answersSelenium interview questions and answers
Selenium interview questions and answers
 
Game Programming 06 - Automated Testing
Game Programming 06 - Automated TestingGame Programming 06 - Automated Testing
Game Programming 06 - Automated Testing
 

Viewers also liked

Infinum Android Talks #17 - A quest for WebSockets by Zeljko Plesac
Infinum Android Talks #17 - A quest for WebSockets by Zeljko PlesacInfinum Android Talks #17 - A quest for WebSockets by Zeljko Plesac
Infinum Android Talks #17 - A quest for WebSockets by Zeljko PlesacInfinum
 
Infinum Android Talks #17 - Intro by Ivan Kocijan
Infinum Android Talks #17 - Intro by Ivan KocijanInfinum Android Talks #17 - Intro by Ivan Kocijan
Infinum Android Talks #17 - Intro by Ivan KocijanInfinum
 
Infinum Android Talks #17 - Developing an Android library by Dino Kovac
Infinum Android Talks #17 - Developing an Android library  by Dino KovacInfinum Android Talks #17 - Developing an Android library  by Dino Kovac
Infinum Android Talks #17 - Developing an Android library by Dino KovacInfinum
 
Crash Fast - Square’s approach to Android crashes - Devoxx Be 2014
Crash Fast - Square’s approach to Android crashes - Devoxx Be 2014Crash Fast - Square’s approach to Android crashes - Devoxx Be 2014
Crash Fast - Square’s approach to Android crashes - Devoxx Be 2014Pierre-Yves Ricau
 
Infinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran Burojevic
Infinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran BurojevicInfinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran Burojevic
Infinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran BurojevicInfinum
 
Infinum iOS Talks #2 - Xamarin by Ivan Đikić
Infinum iOS Talks #2 - Xamarin by Ivan ĐikićInfinum iOS Talks #2 - Xamarin by Ivan Đikić
Infinum iOS Talks #2 - Xamarin by Ivan ĐikićInfinum
 
Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...
Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...
Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...Infinum
 
Infinum iOS Talks #1 - Swift done right by Ivan Dikic
Infinum iOS Talks #1 - Swift done right by Ivan DikicInfinum iOS Talks #1 - Swift done right by Ivan Dikic
Infinum iOS Talks #1 - Swift done right by Ivan DikicInfinum
 
Infinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho Poluta
Infinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho PolutaInfinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho Poluta
Infinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho PolutaInfinum
 
Infinum Android Talks #18 - In-app billing by Ivan Marić
Infinum Android Talks #18 - In-app billing by Ivan MarićInfinum Android Talks #18 - In-app billing by Ivan Marić
Infinum Android Talks #18 - In-app billing by Ivan MarićInfinum
 
Infinum Android Talks #14 - Facebook for Android API
Infinum Android Talks #14 - Facebook for Android APIInfinum Android Talks #14 - Facebook for Android API
Infinum Android Talks #14 - Facebook for Android APIInfinum
 
Infinum Android Talks #18 - How to cache like a boss by Željko Plesac
Infinum Android Talks #18 - How to cache like a boss by Željko PlesacInfinum Android Talks #18 - How to cache like a boss by Željko Plesac
Infinum Android Talks #18 - How to cache like a boss by Željko PlesacInfinum
 
Infinum Android Talks #9 - Making your app location-aware
Infinum Android Talks #9 - Making your app location-awareInfinum Android Talks #9 - Making your app location-aware
Infinum Android Talks #9 - Making your app location-awareInfinum
 
Infinum Android Talks #14 - Gradle plugins
Infinum Android Talks #14 - Gradle pluginsInfinum Android Talks #14 - Gradle plugins
Infinum Android Talks #14 - Gradle pluginsInfinum
 
Infinum Android Talks #18 - Create fun lists by Ivan Marić
Infinum Android Talks #18 - Create fun lists by Ivan MarićInfinum Android Talks #18 - Create fun lists by Ivan Marić
Infinum Android Talks #18 - Create fun lists by Ivan MarićInfinum
 
Infinum Android Talks #17 - Testing your Android applications by Ivan Kust
Infinum Android Talks #17 - Testing your Android applications by Ivan KustInfinum Android Talks #17 - Testing your Android applications by Ivan Kust
Infinum Android Talks #17 - Testing your Android applications by Ivan KustInfinum
 
Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...
Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...
Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...Infinum
 
Infinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
Infinum iOS Talks #2 - VIPER for everybody by Damjan VujaklijaInfinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
Infinum iOS Talks #2 - VIPER for everybody by Damjan VujaklijaInfinum
 

Viewers also liked (18)

Infinum Android Talks #17 - A quest for WebSockets by Zeljko Plesac
Infinum Android Talks #17 - A quest for WebSockets by Zeljko PlesacInfinum Android Talks #17 - A quest for WebSockets by Zeljko Plesac
Infinum Android Talks #17 - A quest for WebSockets by Zeljko Plesac
 
Infinum Android Talks #17 - Intro by Ivan Kocijan
Infinum Android Talks #17 - Intro by Ivan KocijanInfinum Android Talks #17 - Intro by Ivan Kocijan
Infinum Android Talks #17 - Intro by Ivan Kocijan
 
Infinum Android Talks #17 - Developing an Android library by Dino Kovac
Infinum Android Talks #17 - Developing an Android library  by Dino KovacInfinum Android Talks #17 - Developing an Android library  by Dino Kovac
Infinum Android Talks #17 - Developing an Android library by Dino Kovac
 
Crash Fast - Square’s approach to Android crashes - Devoxx Be 2014
Crash Fast - Square’s approach to Android crashes - Devoxx Be 2014Crash Fast - Square’s approach to Android crashes - Devoxx Be 2014
Crash Fast - Square’s approach to Android crashes - Devoxx Be 2014
 
Infinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran Burojevic
Infinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran BurojevicInfinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran Burojevic
Infinum iOS Talks #1 - Becoming an iOS developer swiftly by Vedran Burojevic
 
Infinum iOS Talks #2 - Xamarin by Ivan Đikić
Infinum iOS Talks #2 - Xamarin by Ivan ĐikićInfinum iOS Talks #2 - Xamarin by Ivan Đikić
Infinum iOS Talks #2 - Xamarin by Ivan Đikić
 
Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...
Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...
Infinum Android Talks #19 - Stop wasting time fixing bugs with TDD by Domagoj...
 
Infinum iOS Talks #1 - Swift done right by Ivan Dikic
Infinum iOS Talks #1 - Swift done right by Ivan DikicInfinum iOS Talks #1 - Swift done right by Ivan Dikic
Infinum iOS Talks #1 - Swift done right by Ivan Dikic
 
Infinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho Poluta
Infinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho PolutaInfinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho Poluta
Infinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho Poluta
 
Infinum Android Talks #18 - In-app billing by Ivan Marić
Infinum Android Talks #18 - In-app billing by Ivan MarićInfinum Android Talks #18 - In-app billing by Ivan Marić
Infinum Android Talks #18 - In-app billing by Ivan Marić
 
Infinum Android Talks #14 - Facebook for Android API
Infinum Android Talks #14 - Facebook for Android APIInfinum Android Talks #14 - Facebook for Android API
Infinum Android Talks #14 - Facebook for Android API
 
Infinum Android Talks #18 - How to cache like a boss by Željko Plesac
Infinum Android Talks #18 - How to cache like a boss by Željko PlesacInfinum Android Talks #18 - How to cache like a boss by Željko Plesac
Infinum Android Talks #18 - How to cache like a boss by Željko Plesac
 
Infinum Android Talks #9 - Making your app location-aware
Infinum Android Talks #9 - Making your app location-awareInfinum Android Talks #9 - Making your app location-aware
Infinum Android Talks #9 - Making your app location-aware
 
Infinum Android Talks #14 - Gradle plugins
Infinum Android Talks #14 - Gradle pluginsInfinum Android Talks #14 - Gradle plugins
Infinum Android Talks #14 - Gradle plugins
 
Infinum Android Talks #18 - Create fun lists by Ivan Marić
Infinum Android Talks #18 - Create fun lists by Ivan MarićInfinum Android Talks #18 - Create fun lists by Ivan Marić
Infinum Android Talks #18 - Create fun lists by Ivan Marić
 
Infinum Android Talks #17 - Testing your Android applications by Ivan Kust
Infinum Android Talks #17 - Testing your Android applications by Ivan KustInfinum Android Talks #17 - Testing your Android applications by Ivan Kust
Infinum Android Talks #17 - Testing your Android applications by Ivan Kust
 
Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...
Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...
Infinum Android Talks #20 - Making your Android apps fast like Blue Runner an...
 
Infinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
Infinum iOS Talks #2 - VIPER for everybody by Damjan VujaklijaInfinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
Infinum iOS Talks #2 - VIPER for everybody by Damjan Vujaklija
 

Similar to Android Meetup Slovenia #5 - Don't go crashing my heart by Zeljko Plesac, Infinum

Crash Wars - The handling awakens
Crash Wars  - The handling awakensCrash Wars  - The handling awakens
Crash Wars - The handling awakensŽeljko Plesac
 
Crash wars - The handling awakens
Crash wars - The handling awakensCrash wars - The handling awakens
Crash wars - The handling awakensŽeljko Plesac
 
Crash wars - The handling awakens v3.0
Crash wars - The handling awakens v3.0Crash wars - The handling awakens v3.0
Crash wars - The handling awakens v3.0Željko Plesac
 
How to build Sdk? Best practices
How to build Sdk? Best practicesHow to build Sdk? Best practices
How to build Sdk? Best practicesVitali Pekelis
 
iOS Application Penetration Testing for Beginners
iOS Application Penetration Testing for BeginnersiOS Application Penetration Testing for Beginners
iOS Application Penetration Testing for BeginnersRyanISI
 
[Ultracode Munich #4] Short introduction to the new Android build system incl...
[Ultracode Munich #4] Short introduction to the new Android build system incl...[Ultracode Munich #4] Short introduction to the new Android build system incl...
[Ultracode Munich #4] Short introduction to the new Android build system incl...BeMyApp
 
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android DevelopmentBeing Epic: Best Practices for Android Development
Being Epic: Best Practices for Android DevelopmentReto Meier
 
Titanium appcelerator best practices
Titanium appcelerator best practicesTitanium appcelerator best practices
Titanium appcelerator best practicesAlessio Ricco
 
Whoops! Where did my architecture go?
Whoops! Where did my architecture go?Whoops! Where did my architecture go?
Whoops! Where did my architecture go?Oliver Gierke
 
Best Practices in apps development with Titanium Appcelerator
Best Practices in apps development with Titanium Appcelerator Best Practices in apps development with Titanium Appcelerator
Best Practices in apps development with Titanium Appcelerator Alessio Ricco
 
BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...
BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...
BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...Whymca
 
Infinum Android Talks #14 - How (not) to get f***** by checkstyle, pdm, findb...
Infinum Android Talks #14 - How (not) to get f***** by checkstyle, pdm, findb...Infinum Android Talks #14 - How (not) to get f***** by checkstyle, pdm, findb...
Infinum Android Talks #14 - How (not) to get f***** by checkstyle, pdm, findb...Infinum
 
Bring the fun back to java
Bring the fun back to javaBring the fun back to java
Bring the fun back to javaciklum_ods
 
Whoops! where did my architecture go?
Whoops! where did my architecture go?Whoops! where did my architecture go?
Whoops! where did my architecture go?Oliver Gierke
 
MD-IV-CH-ppt.ppt
MD-IV-CH-ppt.pptMD-IV-CH-ppt.ppt
MD-IV-CH-ppt.pptbharatt7
 
Unit Testing on Android - Droidcon Berlin 2015
Unit Testing on Android - Droidcon Berlin 2015Unit Testing on Android - Droidcon Berlin 2015
Unit Testing on Android - Droidcon Berlin 2015Buşra Deniz, CSM
 
QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...
QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...
QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...QAFest
 

Similar to Android Meetup Slovenia #5 - Don't go crashing my heart by Zeljko Plesac, Infinum (20)

Crash Wars - The handling awakens
Crash Wars  - The handling awakensCrash Wars  - The handling awakens
Crash Wars - The handling awakens
 
Crash wars - The handling awakens
Crash wars - The handling awakensCrash wars - The handling awakens
Crash wars - The handling awakens
 
Crash wars - The handling awakens v3.0
Crash wars - The handling awakens v3.0Crash wars - The handling awakens v3.0
Crash wars - The handling awakens v3.0
 
How to build Sdk? Best practices
How to build Sdk? Best practicesHow to build Sdk? Best practices
How to build Sdk? Best practices
 
iOS Application Penetration Testing for Beginners
iOS Application Penetration Testing for BeginnersiOS Application Penetration Testing for Beginners
iOS Application Penetration Testing for Beginners
 
Android programming-basics
Android programming-basicsAndroid programming-basics
Android programming-basics
 
[Ultracode Munich #4] Short introduction to the new Android build system incl...
[Ultracode Munich #4] Short introduction to the new Android build system incl...[Ultracode Munich #4] Short introduction to the new Android build system incl...
[Ultracode Munich #4] Short introduction to the new Android build system incl...
 
Being Epic: Best Practices for Android Development
Being Epic: Best Practices for Android DevelopmentBeing Epic: Best Practices for Android Development
Being Epic: Best Practices for Android Development
 
Titanium appcelerator best practices
Titanium appcelerator best practicesTitanium appcelerator best practices
Titanium appcelerator best practices
 
Whoops! Where did my architecture go?
Whoops! Where did my architecture go?Whoops! Where did my architecture go?
Whoops! Where did my architecture go?
 
Best Practices in apps development with Titanium Appcelerator
Best Practices in apps development with Titanium Appcelerator Best Practices in apps development with Titanium Appcelerator
Best Practices in apps development with Titanium Appcelerator
 
BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...
BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...
BEST PRACTICES PER LA SCRITTURA DI APPLICAZIONI TITANIUM APPCELERATOR - Aless...
 
Make it compatible
Make it compatibleMake it compatible
Make it compatible
 
iOS Application Exploitation
iOS Application ExploitationiOS Application Exploitation
iOS Application Exploitation
 
Infinum Android Talks #14 - How (not) to get f***** by checkstyle, pdm, findb...
Infinum Android Talks #14 - How (not) to get f***** by checkstyle, pdm, findb...Infinum Android Talks #14 - How (not) to get f***** by checkstyle, pdm, findb...
Infinum Android Talks #14 - How (not) to get f***** by checkstyle, pdm, findb...
 
Bring the fun back to java
Bring the fun back to javaBring the fun back to java
Bring the fun back to java
 
Whoops! where did my architecture go?
Whoops! where did my architecture go?Whoops! where did my architecture go?
Whoops! where did my architecture go?
 
MD-IV-CH-ppt.ppt
MD-IV-CH-ppt.pptMD-IV-CH-ppt.ppt
MD-IV-CH-ppt.ppt
 
Unit Testing on Android - Droidcon Berlin 2015
Unit Testing on Android - Droidcon Berlin 2015Unit Testing on Android - Droidcon Berlin 2015
Unit Testing on Android - Droidcon Berlin 2015
 
QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...
QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...
QA Fest 2018. Adam Stasiak. React Native is Coming – the story of hybrid mobi...
 

More from Infinum

Infinum Android Talks #20 - DiffUtil
Infinum Android Talks #20 - DiffUtilInfinum Android Talks #20 - DiffUtil
Infinum Android Talks #20 - DiffUtilInfinum
 
Infinum Android Talks #20 - Benefits of using Kotlin
Infinum Android Talks #20 - Benefits of using KotlinInfinum Android Talks #20 - Benefits of using Kotlin
Infinum Android Talks #20 - Benefits of using KotlinInfinum
 
Infinum iOS Talks #4 - Making our VIPER more reactive
Infinum iOS Talks #4 - Making our VIPER more reactiveInfinum iOS Talks #4 - Making our VIPER more reactive
Infinum iOS Talks #4 - Making our VIPER more reactiveInfinum
 
Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...
Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...
Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...Infinum
 
Infinum Android Talks #13 - Using ViewDragHelper
Infinum Android Talks #13 - Using ViewDragHelperInfinum Android Talks #13 - Using ViewDragHelper
Infinum Android Talks #13 - Using ViewDragHelperInfinum
 
Infinum Android Talks #14 - Log4j
Infinum Android Talks #14 - Log4jInfinum Android Talks #14 - Log4j
Infinum Android Talks #14 - Log4jInfinum
 
Infinum Android Talks #16 - Enterprise app development with Samsung by Blaz S...
Infinum Android Talks #16 - Enterprise app development with Samsung by Blaz S...Infinum Android Talks #16 - Enterprise app development with Samsung by Blaz S...
Infinum Android Talks #16 - Enterprise app development with Samsung by Blaz S...Infinum
 
Infinum Android Talks #16 - Retrofit 2 by Kristijan Jurkovic
Infinum Android Talks #16 - Retrofit 2 by Kristijan JurkovicInfinum Android Talks #16 - Retrofit 2 by Kristijan Jurkovic
Infinum Android Talks #16 - Retrofit 2 by Kristijan JurkovicInfinum
 
Infinum Android Talks #16 - How to shoot your self in the foot by Dino Kovac
Infinum Android Talks #16 - How to shoot your self in the foot by Dino KovacInfinum Android Talks #16 - How to shoot your self in the foot by Dino Kovac
Infinum Android Talks #16 - How to shoot your self in the foot by Dino KovacInfinum
 
Infinum Android Talks #16 - App Links by Ana Baotic
Infinum Android Talks #16 - App Links by Ana BaoticInfinum Android Talks #16 - App Links by Ana Baotic
Infinum Android Talks #16 - App Links by Ana BaoticInfinum
 
Infinum Android Talks #15 - Garfield Android Studio Plugin - Be Smart, Be Lazy
Infinum Android Talks #15 - Garfield Android Studio Plugin - Be Smart, Be LazyInfinum Android Talks #15 - Garfield Android Studio Plugin - Be Smart, Be Lazy
Infinum Android Talks #15 - Garfield Android Studio Plugin - Be Smart, Be LazyInfinum
 
Infinum Android Talks #15 - Timber + Crashlytics -> A match made in heaven
Infinum Android Talks #15 - Timber + Crashlytics -> A match made in heavenInfinum Android Talks #15 - Timber + Crashlytics -> A match made in heaven
Infinum Android Talks #15 - Timber + Crashlytics -> A match made in heavenInfinum
 
Infinum Android Talks #15 - How to develop a simple 2D game with physics engine
Infinum Android Talks #15 - How to develop a simple 2D game with physics engineInfinum Android Talks #15 - How to develop a simple 2D game with physics engine
Infinum Android Talks #15 - How to develop a simple 2D game with physics engineInfinum
 

More from Infinum (13)

Infinum Android Talks #20 - DiffUtil
Infinum Android Talks #20 - DiffUtilInfinum Android Talks #20 - DiffUtil
Infinum Android Talks #20 - DiffUtil
 
Infinum Android Talks #20 - Benefits of using Kotlin
Infinum Android Talks #20 - Benefits of using KotlinInfinum Android Talks #20 - Benefits of using Kotlin
Infinum Android Talks #20 - Benefits of using Kotlin
 
Infinum iOS Talks #4 - Making our VIPER more reactive
Infinum iOS Talks #4 - Making our VIPER more reactiveInfinum iOS Talks #4 - Making our VIPER more reactive
Infinum iOS Talks #4 - Making our VIPER more reactive
 
Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...
Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...
Infinum iOS Talks #4 - Making your Swift networking code more awesome with Re...
 
Infinum Android Talks #13 - Using ViewDragHelper
Infinum Android Talks #13 - Using ViewDragHelperInfinum Android Talks #13 - Using ViewDragHelper
Infinum Android Talks #13 - Using ViewDragHelper
 
Infinum Android Talks #14 - Log4j
Infinum Android Talks #14 - Log4jInfinum Android Talks #14 - Log4j
Infinum Android Talks #14 - Log4j
 
Infinum Android Talks #16 - Enterprise app development with Samsung by Blaz S...
Infinum Android Talks #16 - Enterprise app development with Samsung by Blaz S...Infinum Android Talks #16 - Enterprise app development with Samsung by Blaz S...
Infinum Android Talks #16 - Enterprise app development with Samsung by Blaz S...
 
Infinum Android Talks #16 - Retrofit 2 by Kristijan Jurkovic
Infinum Android Talks #16 - Retrofit 2 by Kristijan JurkovicInfinum Android Talks #16 - Retrofit 2 by Kristijan Jurkovic
Infinum Android Talks #16 - Retrofit 2 by Kristijan Jurkovic
 
Infinum Android Talks #16 - How to shoot your self in the foot by Dino Kovac
Infinum Android Talks #16 - How to shoot your self in the foot by Dino KovacInfinum Android Talks #16 - How to shoot your self in the foot by Dino Kovac
Infinum Android Talks #16 - How to shoot your self in the foot by Dino Kovac
 
Infinum Android Talks #16 - App Links by Ana Baotic
Infinum Android Talks #16 - App Links by Ana BaoticInfinum Android Talks #16 - App Links by Ana Baotic
Infinum Android Talks #16 - App Links by Ana Baotic
 
Infinum Android Talks #15 - Garfield Android Studio Plugin - Be Smart, Be Lazy
Infinum Android Talks #15 - Garfield Android Studio Plugin - Be Smart, Be LazyInfinum Android Talks #15 - Garfield Android Studio Plugin - Be Smart, Be Lazy
Infinum Android Talks #15 - Garfield Android Studio Plugin - Be Smart, Be Lazy
 
Infinum Android Talks #15 - Timber + Crashlytics -> A match made in heaven
Infinum Android Talks #15 - Timber + Crashlytics -> A match made in heavenInfinum Android Talks #15 - Timber + Crashlytics -> A match made in heaven
Infinum Android Talks #15 - Timber + Crashlytics -> A match made in heaven
 
Infinum Android Talks #15 - How to develop a simple 2D game with physics engine
Infinum Android Talks #15 - How to develop a simple 2D game with physics engineInfinum Android Talks #15 - How to develop a simple 2D game with physics engine
Infinum Android Talks #15 - How to develop a simple 2D game with physics engine
 

Recently uploaded

Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Modelsaagamshah0812
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio, Inc.
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfjoe51371421
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
Introduction to Decentralized Applications (dApps)
Introduction to Decentralized Applications (dApps)Introduction to Decentralized Applications (dApps)
Introduction to Decentralized Applications (dApps)Intelisync
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...harshavardhanraghave
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comFatema Valibhai
 
What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number SystemsJheuzeDellosa
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software DevelopersVinodh Ram
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfkalichargn70th171
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdfWave PLM
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providermohitmore19
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfkalichargn70th171
 

Recently uploaded (20)

Unlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language ModelsUnlocking the Future of AI Agents with Large Language Models
Unlocking the Future of AI Agents with Large Language Models
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
why an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdfwhy an Opensea Clone Script might be your perfect match.pdf
why an Opensea Clone Script might be your perfect match.pdf
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Introduction to Decentralized Applications (dApps)
Introduction to Decentralized Applications (dApps)Introduction to Decentralized Applications (dApps)
Introduction to Decentralized Applications (dApps)
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
Reassessing the Bedrock of Clinical Function Models: An Examination of Large ...
 
HR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.comHR Software Buyers Guide in 2024 - HRSoftware.com
HR Software Buyers Guide in 2024 - HRSoftware.com
 
What is Binary Language? Computer Number Systems
What is Binary Language?  Computer Number SystemsWhat is Binary Language?  Computer Number Systems
What is Binary Language? Computer Number Systems
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
Professional Resume Template for Software Developers
Professional Resume Template for Software DevelopersProfessional Resume Template for Software Developers
Professional Resume Template for Software Developers
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
 
5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf5 Signs You Need a Fashion PLM Software.pdf
5 Signs You Need a Fashion PLM Software.pdf
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
TECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service providerTECUNIQUE: Success Stories: IT Service provider
TECUNIQUE: Success Stories: IT Service provider
 
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdfThe Ultimate Test Automation Guide_ Best Practices and Tips.pdf
The Ultimate Test Automation Guide_ Best Practices and Tips.pdf
 

Android Meetup Slovenia #5 - Don't go crashing my heart by Zeljko Plesac, Infinum

  • 1. Don’t go crashing my heart ŽELJKO PLESAC
  • 2. ANDROID NOWADAYS • more than 1.4 billions of users • 23 different SDK versions • 1,294 device vendors with more than 24,093 distinct Android devices
  • 3. YOUR USERS DESERVE BEAUTIFUL APPLICATIONS, WITH BEST POSSIBLE USER EXPERIENCE.
  • 4. CRASHES HAVE ENORMOUS AFFECT ON USER EXPERIENCE.
  • 5. NOBODY LIKES CRASHES*. * EXPECT TESTERS
  • 6. PROVIDE BETTER CRASH EXPERIENCE • you should care about your crashes and try to minimise them • optimise your applications in a way, that you can detect crash even before it occurs
  • 7. 01USE STATIC CODE CHECKERS & WRITE TESTS
  • 8. Strict rules • use at least default set of rules • enforce zero tolerance to all static code checker warnings and errors • aim for high test code coverage • don’t test only for positive outcomes, test also for negative • write stress tests • always insert at least one test which will throw an exception or bug • all tests have to pass before merging into development
  • 9. TESTS STABILITY? Test frameworks have bugs. CI servers also. Android platform also.
  • 10. HANDLING FAILED TESTS • all failed tests have to be carefully examined • if they are not caused by your code, ignore them but test them once again when new version of testing platform is available • this doesn’t mean that everything is not your fault
  • 12. CONTINOUS INTEGRATION • static code checkers & tests automation • a lot of available products - Jenkins, Travis, CircleCI… • use protected branches for master and development branch • use Git flow (or some other pattern)
  • 14. MEMORY LEAKS • they will cause problems and crash your applications • a lot of great tools
  • 15. A memory leak detection library for Android and Java, developed by Square (Pierre-Yves Ricau). De facto standard for detecting memory leaks, use it in your debug builds. LEAK CANARY
  • 16. • detects memory leaks in your application, external libraries, event Android OS itself • it will not give you an answer what is the cause of a leak, just an information that the leak has occurred
  • 17. WEAK REFERENCES ARE NOT THE ANSWER TO EVERYTHING.
  • 19. CRASH YOU APPLICATIONS AS SOON AS POSSIBLE • Square’s approach to handling crashes (presentation and video) • organise your code in a way that it crashes as soon as possible • use exceptions • null values are evil
  • 20. package co.infinum.crashhandler.sampleapp; /** * Created by Željko Plesac on 13/03/16. */ public class Person { private String name; private String surname; public Person(String name, String surname) { this.name = name; this.surname = surname; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } }
  • 21. package co.infinum.crashhandler.sampleapp; /** * Created by Željko Plesac on 13/03/16. */ public class PersonUtils { private PersonUtils() { } public static String getFullName(Person person) { return person.getName() + person.getSurname(); } }
  • 22. package co.infinum.crashhandler.sampleapp; /** * Created by Željko Plesac on 13/03/16. */ public class PersonUtils { private PersonUtils() { } public static String getFullName(Person person) { if(person != null){ return person.getName() + person.getSurname(); } else{ return null; } } }
  • 23. package co.infinum.crashhandler.sampleapp; /** * Created by Željko Plesac on 13/03/16. */ public class PersonUtils { private PersonUtils() { } public static String getFullName(Person person) { if (person == null) { throw new IllegalStateException("Person cannot be null!”); } return person.getName() + person.getSurname(); } }
  • 25. LOG AND MEASURE YOUR CRASHES • lot of great tools (Crashlytics, AppsDynamics, Crittercism) • analyse your crashes • are crashes happening on custom ROMs? • are crashes occurring only on cheap phones? • are your crashes frequent?
  • 26.
  • 27. I don’t care about warnings, only errors. - KING HENRIK VIII.
  • 28. TRY-CATCH BLOCK AND EXCEPTIONS • you should care about your handled exceptions • they have to be logged and analysed • should contain useful information
  • 29. package co.infinum.crashhandler.sampleapp; /** * Created by Željko Plesac on 13/03/16. */ public class ProfilePresenterImpl implements ProfilePresenter{ private Person person; private ProfileView view; public ProfilePresenterImpl(Profile person){ this.person = person; } … public void showPersonData() { view.showFullName(PersonUtils.getFullName(person))); view.showBirthday(PersonUtils.getFormattedBirthday(person))); view.hideLoadingDialog(); } }
  • 30. package co.infinum.crashhandler.sampleapp; /** * Created by Željko Plesac on 13/03/16. */ public class ProfilePresenterImpl implements ProfilePresenter{ private Person person; private ProfileView view; public ProfilePresenterImpl(Profile person){ this.person = person; } … public void showPersonData() { String fullName = PersonUtils.getFullName(person)); if(fullName != null){ view.showFullName(PersonUtils.getFullName(person))); } view.showBirthday(PersonUtils.getFormattedBirthday(person))); view.hideLoadingDialog(); } }
  • 31. package co.infinum.crashhandler.sampleapp; /** * Created by Željko Plesac on 13/03/16. */ public class ProfilePresenterImpl implements ProfilePresenter{ private Person person; private ProfileView view; public ProfilePresenterImpl(Profile person){ this.person = person; } … public void showPersonData() { try{ String fullName = PersonUtils.getFullName(person)); if(fullName != null){ view.showFullName(PersonUtils.getFullName(person))); } view.showBirthday(PersonUtils.getFormattedBirthday(person))));} } catch(Exception e){ e.prinStackTrace(); view.showErrorDialog(); } } }
  • 32. TIMBER • Utility on top of Android's normal Log class • by Jake Wharton
  • 34. CRASH REPORTING TREE private static class CrashReportingTree extends Timber.Tree {
 
 @Override
 protected void log(int priority, String tag, String message, Throwable t) {
 if (priority == Log.VERBOSE || priority == Log.DEBUG) {
 return;
 }
 
 // will write to the crash report but NOT to logcat
 Crashlytics.log(message);
 
 if (t != null) {
 Crashlytics.logException(t);
 }
 }
 }
  • 35. CRASH REPORTING TREE @Override
 public void onCreate() {
 super.onCreate(); CrashlyticsCore crashlyticsCore = new CrashlyticsCore.Builder() .disabled(BuildConfig.DEBUG).build(); Fabric.with(this, new Crashlytics.Builder().core(crashlyticsCore).build()); if (BuildConfig.DEBUG) {
 Timber.plant(new Timber.DebugTree());
 } else {
 Timber.plant(new CrashReportingTree());
 }
 }
  • 36. package co.infinum.crashhandler.sampleapp; /** * Created by Željko Plesac on 13/03/16. */ public class ProfilePresenterImpl implements ProfilePresenter{ private Person person; private ProfileView view; public ProfilePresenterImpl(Profile person){ this.person = person; } … public void showPersonData() { try{ String fullName = PersonUtils.getFullName(person)); if(fullName != null){ view.showFullName(PersonUtils.getFullName(person))); } view.showBirthday(PersonUtils.getFormattedBirthday(person))));} } catch(Exception e){ Timber.e(e, “Failure in “ + getClass().getSimpleName()); view.showErrorDialog(); } } }
  • 37. /** * Logs everything to crashlytics, then we just need to log an exception and we should see all prior logs online! */ private static class RemoteDebuggingTree extends Timber.Tree { @Override protected void log(int priority, String tag, String message, Throwable t) { // will write to the crash report as well to logcat Crashlytics.log(priority, tag, message); if (t != null) { Crashlytics.logException(t); } } }
  • 38. 08HIDE CRASHES FROM YOUR USERS
  • 39. Crashes are just exceptions, which are not handled by your application*. * IN MOST CASES
  • 40. APP CRASH HANDLERS • define custom app crash handler in all of your production builds • avoid ugly system dialogs • simple configuration • apps are restarted, so they go into stable state • watch for cyclic bugs!
  • 41. public class AppCrashHandler implements Thread.UncaughtExceptionHandler {
 
 private Activity liveActivity;
 
 public AppCrashHandler(Application application) {
 application.registerActivityLifecycleCallbacks(new Application.ActivityLifecycleCallbacks() { 
 @Override
 public void onActivityResumed(Activity activity) {
 liveActivity = activity;
 }
 @Override
 public void onActivityPaused(Activity activity) {
 liveActivity = null;
 }
 });
 }
 @Override
 public void uncaughtException(Thread thread, Throwable ex) {
 if(liveActivity != null){
 Intent intent = new Intent(getApplicationContext(), MainActivity.class);
 intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
 liveActivity.finish();
 liveActivity.startActivity(intent);
 }
 
 System.exit(0);
 }
 } CUSTOM CRASH HANDLER
  • 42. APPLICATION CLASS @Override
 public void onCreate() {
 super.onCreate();
 Thread.setDefaultUncaughtExceptionHandler(new AppCrashHandler(this));
 }
  • 45. STAGED ROLLOUT • can only be used for app updates, not when publishing an app for the first time • your update reaches only a percentage of your users, which you can increase over time
  • 46. STAGED ROLLOUT PROCESS ① • at first, define that your update is only available to small percentage of your users (I.E. 5%) • closely monitor crash reports and user feedback • users receiving the staged rollout can leave public reviews on Google Play • if everything goes OK, increase the percentage • if you get negative feedback or encounter some bugs, halt the process and fix all of reported problems
  • 48. YOUR APPS WILL CRASH IN PRODUCTION, AND THERE IS NOTHING YOU CAN DO TO PREVENT IT.
  • 49. THERE IS NO SUCH THING AS 100% CRASH FREE ANDROID APPLICATION • large number of different devices • large number of OS versions • in most cases, proposed minimum API value is 15 and the current stable version is 23, which means that your app has to work on 8 different API versions • device vendors alter Android OS - they add custom solutions and bloatware • rooted Android devices - core functionalities can be altered
  • 50. THINGS ARE GOING TO BECOME EVEN MORE COMPLICATED.
  • 51. Phones, tablets, phablets, freezers, smartwatches, cars, bikes, boards…. ANDROID IS EXPANDING.
  • 52. MultiWindow support, Jack compiler, new APIs, deprecated APIs, new programming languages… ANDROID IS GETTING NEW FEATURES.
  • 53. THAT’S THE BEAUTY OF ANDROID.
  • 54. DEVELOPERS WILL ALWAYS FIND A WAY.
  • 55. Thank you! Visit www.infinum.co or find us on social networks: infinum.co infinumco infinumco infinum TWITTER: @ZELJKOPLESAC EMAIL: ZELJKO.PLESAC@INFINUM.CO