the 2016 android developer toolbox [dubai]

84
The 2016 Android Developer Toolbox #droidconAE

Upload: nilhcem

Post on 15-Apr-2017

695 views

Category:

Technology


1 download

TRANSCRIPT

Page 1: The 2016 Android Developer Toolbox [DUBAI]

The 2016 Android Developer Toolbox

#droidconAE

Page 2: The 2016 Android Developer Toolbox [DUBAI]

@Nilhcem

Gau$er Mechling

Aspiring So+ware Cra+sman

#droidconAE

Page 3: The 2016 Android Developer Toolbox [DUBAI]

The 2016 Android Developer Toolbox

#droidconAE

Page 4: The 2016 Android Developer Toolbox [DUBAI]

"So you're telling me

we need a toolbox?"

#droidconAE

Page 5: The 2016 Android Developer Toolbox [DUBAI]

#droidconAE

Page 6: The 2016 Android Developer Toolbox [DUBAI]

"Use the right tools for the right job"

#droidconAE

Page 7: The 2016 Android Developer Toolbox [DUBAI]

#droidconAE

Page 8: The 2016 Android Developer Toolbox [DUBAI]

#droidconAE

Page 9: The 2016 Android Developer Toolbox [DUBAI]

Gradle(with the Android Plugin for Gradle)

#droidconAE

Page 10: The 2016 Android Developer Toolbox [DUBAI]

Build Variants

#droidconAE

Page 11: The 2016 Android Developer Toolbox [DUBAI]

U+2020h"ps://github.com/JakeWharton/u2020

#droidconAE

Page 12: The 2016 Android Developer Toolbox [DUBAI]

Debug screenExample from Google iosched

#droidconAE

Page 13: The 2016 Android Developer Toolbox [DUBAI]

Internal se*ngs app

Similar to u2020 Sample app

• Display build / device informa6on

• Change endpoint (restart process with JakeWharton/ProcessPhoenix)

• Show logs (pedrovgs/Lynx)

• Allow easy bug report capturing (maFprecious/telescope)

• Enable/Disable Takt / Stetho /

#droidconAE

Page 14: The 2016 Android Developer Toolbox [DUBAI]

Droidcon Dubai

applica.onh"ps://github.com/

Nilhcem/droidconae-2016

#droidconAE

Page 15: The 2016 Android Developer Toolbox [DUBAI]

Measuring

Tes$ng

Analyzing

#droidconAE

Page 16: The 2016 Android Developer Toolbox [DUBAI]

MeasuringTes$ng

Analyzing

#droidconAE

Page 17: The 2016 Android Developer Toolbox [DUBAI]

Android Studio(Android Monitor tab)

#droidconAE

Page 18: The 2016 Android Developer Toolbox [DUBAI]

#droidconAE

Page 19: The 2016 Android Developer Toolbox [DUBAI]

Detect Memory Leaks

#droidconAE

Page 20: The 2016 Android Developer Toolbox [DUBAI]

#droidconAE

Page 21: The 2016 Android Developer Toolbox [DUBAI]

Leak Canaryh"ps://github.com/square/leakcanary

#droidconAE

Page 22: The 2016 Android Developer Toolbox [DUBAI]

Frame Rateh"ps://github.com/wasabeef/Takt

compile 'jp.wasabeef:takt:1.0.2'

public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); Takt.stock(this).play(); }}

#droidconAE

Page 23: The 2016 Android Developer Toolbox [DUBAI]

Hugoh"ps://github.com/JakeWharton/hugo

Prefix classes/methods with:

@DebugLog

Result:

DroidconApp V ⇢ onCreate()

V ⇢ initGraph()

V ⇠ initGraph [13ms]

V ⇢ initLogger()

V ⇠ initLogger [1ms]

V ⇠ onCreate [73ms]

#droidconAE

Page 24: The 2016 Android Developer Toolbox [DUBAI]

Pidcath"ps://github.com/JakeWharton/pidcat

$ pidcat com.nilhcem.droidconae

#droidconAE

Page 25: The 2016 Android Developer Toolbox [DUBAI]

AndroidDevMetricsh"ps://github.com/frogermcs/

AndroidDevMetrics

apply plugin: 'com.frogermcs.androiddevmetrics'

public class MyApplication extends Application { @Override public void onCreate() { super.onCreate(); AndroidDevMetrics.initWith(this); }}

#droidconAE

Page 26: The 2016 Android Developer Toolbox [DUBAI]

#PerfMa(ers

#droidconAE

Page 27: The 2016 Android Developer Toolbox [DUBAI]

#PerfMa(ersactually...

#droidconAE

Page 28: The 2016 Android Developer Toolbox [DUBAI]

#QualityMa*ers

#droidconAE

Page 29: The 2016 Android Developer Toolbox [DUBAI]

Code sta)c analysis tools

#droidconAE

Page 30: The 2016 Android Developer Toolbox [DUBAI]

Code sta)c analysis tools• Lint

• PMD

• Checkstyle

• Findbugs

• Facebook's infer

#droidconAE

Page 31: The 2016 Android Developer Toolbox [DUBAI]

SonarQube

#droidconAE

Page 32: The 2016 Android Developer Toolbox [DUBAI]

SonarQube Dockerfile

FROM java:8MAINTAINER Nilhcem

RUN DEBIAN_FRONTEND=noninteractive apt updateRUN DEBIAN_FRONTEND=noninteractive apt install -y wget unzipRUN wget -q https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-5.4.zipRUN unzip -qq sonarqube-5.4.zip -d /opt/RUN rm sonarqube-5.4.zip

EXPOSE 9000

CMD ["/opt/sonarqube-5.4/bin/linux-x86-64/sonar.sh", "console"]

Then launch:

docker build -t nilhcem/sonarqube .docker run -p 9000:9000 -d nilhcem/sonarqube

#droidconAE

Page 33: The 2016 Android Developer Toolbox [DUBAI]

SonarQube Gradle Configura1on

apply plugin: 'org.sonarqube'

sonarqube { properties { def appProject = project(':app') def appProjectBuildDir = appProject.buildDir

property 'sonar.projectKey', 'droidconae' property 'sonar.projectName', 'DroidconAE 2016' property 'sonar.projectVersion', appProject.android.defaultConfig.versionName

property 'sonar.host.url', 'http://docker:9000' property 'sonar.sources', 'src' property 'sonar.sourceEncoding', 'UTF-8' property 'sonar.java.binaries', 'build'

property 'sonar.exclusions', '**/*Test.java' property 'sonar.core.codeCoveragePlugin', 'jacoco' property 'sonar.jacoco.reportPath', "$appProjectBuildDir/jacoco/testProductionDebugUnitTest.exec" property 'sonar.junit.reportsPath', "$appProjectBuildDir/test-results/productionDebug" }}

./gradlew :app:assembleProductionDebug :app:testProductionDebugUnitTest :app:sonarqube

#droidconAE

Page 34: The 2016 Android Developer Toolbox [DUBAI]

#droidconAE

Page 35: The 2016 Android Developer Toolbox [DUBAI]

#droidconAE

Page 36: The 2016 Android Developer Toolbox [DUBAI]

Measuring

Tes$ngAnalyzing

#droidconAE

Page 37: The 2016 Android Developer Toolbox [DUBAI]

Mock Server

#droidconAE

Page 38: The 2016 Android Developer Toolbox [DUBAI]

NodeJS + Express/* Setup */var fs = require('fs');var express = require('express');var app = express();app.set('port', process.env.PORT || 8080);var port = app.get('port');

/* Speakers list */app.get('/speakers', function(req, res) { res.type('application/json; charset=utf8'); res.status(200).send(fs.readFileSync('data/speakers.json', 'utf8'));});

/* Other web services */// ...

/* Starting the server */app.listen(port, function () { console.log('Express server listening on port ' + port);});

#droidconAE

Page 39: The 2016 Android Developer Toolbox [DUBAI]

NodeJS + Express: Slow servicesleep(2000);

// Ugly, but does the job :)function sleep(durationMillis) { var now = new Date().getTime(); while(new Date().getTime() < now + durationMillis) { // do nothing }}

#droidconAE

Page 40: The 2016 Android Developer Toolbox [DUBAI]

Example

h"ps://github.com/Nilhcem/droidconae-2016/tree/master/mockserver

$ npm install$ node server.js

Then, go tohttp://localhost:8990/

#droidconAE

Page 42: The 2016 Android Developer Toolbox [DUBAI]

HTTP Debugging

#droidconAE

Page 43: The 2016 Android Developer Toolbox [DUBAI]

HTTP Debugging• mitmproxy

• Fiddler

• Charles proxy

#droidconAE

Page 44: The 2016 Android Developer Toolbox [DUBAI]

Charles Proxy

• Simulate a laggy/unstable connec3on

• Repeat queries

• Check the responses

• Add some breakpoints to

• Cancel an HTTP(s) call

• Edit a request

• Edit a response

#droidconAE

Page 45: The 2016 Android Developer Toolbox [DUBAI]

Cancel a request

#droidconAE

Page 46: The 2016 Android Developer Toolbox [DUBAI]

Edit a response

#droidconAE

Page 47: The 2016 Android Developer Toolbox [DUBAI]

MeasuringTes$ng

Analyzing#droidconAE

Page 48: The 2016 Android Developer Toolbox [DUBAI]

Developer Op*ons

#droidconAE

Page 49: The 2016 Android Developer Toolbox [DUBAI]

#droidconAE

Page 50: The 2016 Android Developer Toolbox [DUBAI]

#droidconAE

Page 51: The 2016 Android Developer Toolbox [DUBAI]

hierarchyviewerh"ps://developer.android.com/tools/performance/hierarchy-viewer/

setup.html#hvproto-variableh"p://developer.android.com/tools/debugging/debugging-ui.html

$ export ANDROID_HVPROTO=ddm$ exec ${ANDROID_HOME}/tools/monitor

#droidconAE

Page 52: The 2016 Android Developer Toolbox [DUBAI]

uiautomatorviewer

#droidconAE

Page 53: The 2016 Android Developer Toolbox [DUBAI]

Anima&ons

Developer op)ons -> Anima)on scale

#droidconAE

Page 54: The 2016 Android Developer Toolbox [DUBAI]

Anima&ons

Make a screencast:

$ adb shell screenrecord /sdcard/demo.mp4$ adb pull /sdcard/demo.mp4

VLC :

Press the keyboard E key to see frames one by one

#droidconAE

Page 55: The 2016 Android Developer Toolbox [DUBAI]

apktool + dex2jar + JD-GUIh"p://ibotpeaches.github.io/Apktoolh"ps://github.com/pxb1988/dex2jar

h"p://jd.benow.ca

#droidconAE

Page 56: The 2016 Android Developer Toolbox [DUBAI]

jadxh"ps://github.com/skylot/jadx

#droidconAE

Page 57: The 2016 Android Developer Toolbox [DUBAI]

Stetho

#droidconAE

Page 58: The 2016 Android Developer Toolbox [DUBAI]

Stetho - UI

#droidconAE

Page 59: The 2016 Android Developer Toolbox [DUBAI]

Stetho - Network

#droidconAE

Page 60: The 2016 Android Developer Toolbox [DUBAI]

Stetho - Resources

#droidconAE

Page 61: The 2016 Android Developer Toolbox [DUBAI]

Stetho - Dumpapp

#droidconAE

Page 62: The 2016 Android Developer Toolbox [DUBAI]

Stetho - Dumpapp

#droidconAE

Page 63: The 2016 Android Developer Toolbox [DUBAI]

Stetho - Dumpapp

#droidconAE

Page 64: The 2016 Android Developer Toolbox [DUBAI]

Some more dumpapp examples

#droidconAE

Page 65: The 2016 Android Developer Toolbox [DUBAI]

$ dumpapp accessToken invalidate

$ dumpapp accessToken showfce1235425dcdeadbeef8cafebabe42

$ dumpapp clipboard getHello

$ dumpapp clipboard set "Text to copy"$ dumpapp onTrimMemory$ dumpapp openIntent scheme://open/speaker/3

$ dumpapp gcmTokenuHyMKnEQ:APA91bEHZ6afFLQQMzKgSDjp5y_0397usitPqj_Bp02

$ dumpapp geolocDataLocation[fused 22.5430883,114.1043205 acc=21 et=+21m5s492ms]

$ dumpapp runningServicescom.example.LocationService

#droidconAE

Page 66: The 2016 Android Developer Toolbox [DUBAI]

Stetho - Custom pluginh"p://code.tutsplus.com/tutorials/debugging-android-apps-with-facebooks-

stetho--cms-24205

class AppDumperPlugin implements DumperPlugin { @Override public String getName() { return "my_plugin_name"; }

@Override public void dump(DumperContext dumpContext) throws DumpException { PrintStream writer = dumperContext.getStdout(); String commandName = (args.isEmpty()) ? "" : args.remove(0);

if (commandName.equals("test")) { out.println("Hello, World!"); } }}

#droidconAE

Page 67: The 2016 Android Developer Toolbox [DUBAI]

Stetho - Custom plugin

#droidconAE

Page 68: The 2016 Android Developer Toolbox [DUBAI]

Stetho - Dumpapp (example)(ActivityProvider in a dependency graph in debug)

@Singletonpublic class ActivityProvider implements Application.ActivityLifecycleCallbacks {

private Activity currentActivity;

@Inject public ActivityProvider(Application app) { app.registerActivityLifecycleCallbacks(this); }

public Activity getCurrentActivity() { return currentActivity; }

@Override public void onActivityResumed(Activity activity) { currentActivity = activity; }

@Override public void onActivityPaused(Activity activity) { currentActivity = null; }}

#droidconAE

Page 69: The 2016 Android Developer Toolbox [DUBAI]

Stetho - Dumpapp (example)

AppDumperPlugin.java

private void displayCurrentSessionData(PrintStream writer) { Activity activity = activityProvider.getCurrentActivity(); if (activity instanceof SessionDetailsActivity) { try { // Use reflection to access private "session" field Field field = SessionDetailsActivity.class.getDeclaredField("session"); field.setAccessible(true); Session session = (Session) field.get(activity); writer.println(new GsonBuilder().setPrettyPrinting().create().toJson(session)); } catch (Exception e) { writer.println(e.getMessage()); } }}

#droidconAE

Page 70: The 2016 Android Developer Toolbox [DUBAI]

Stetho console + Rhino

#droidconAE

Page 71: The 2016 Android Developer Toolbox [DUBAI]

Measuring

Tes$ng

Analyzing

#droidconAE

Page 72: The 2016 Android Developer Toolbox [DUBAI]

Measuring

Tes$ng

Analysing

Lastly

#droidconAE

Page 73: The 2016 Android Developer Toolbox [DUBAI]

ADB + Shell# Open a deep linking intentadb shell am start -a android.intent.action.VIEW -d "scheme://app/deep/linking"

# List running servicesadb shell dumpsys activity services

# Get the path of an install applicationadb shell pm path app.package.name

# Clear app dataadb shell pm clean app.package.name

# Take a screenshotadb shell screencap -p | perl -pe '\''s/\x0D\x0A/\x0A/g'\'' > screen.png

# Paste text from your computer clipboard to your android devicepbpaste | sed "s/%/%%/g" | sed "s/ /\%\s/g" | xargs adb shell input text

#droidconAE

Page 74: The 2016 Android Developer Toolbox [DUBAI]

Postmanh"ps://www.getpostman.com/

#droidconAE

Page 75: The 2016 Android Developer Toolbox [DUBAI]

Lockito

#droidconAE

Page 76: The 2016 Android Developer Toolbox [DUBAI]

Fill RAMOn-device low-memory tes2ng for Android

h"ps://play.google.com/store/apps/details?id=com.tspoon.androidtoolbelt

#droidconAE

Page 77: The 2016 Android Developer Toolbox [DUBAI]

ViewInspectorh"ps://github.com/xfumihiro/ViewInspector

#droidconAE

Page 78: The 2016 Android Developer Toolbox [DUBAI]

Methodscounth"p://www.methodscount.com/

h"ps://github.com/mihaip/dex-method-counts

#droidconAE

Page 79: The 2016 Android Developer Toolbox [DUBAI]

Vysorh"p://www.vysor.io/

#droidconAE

Page 80: The 2016 Android Developer Toolbox [DUBAI]

As a conclusion...

#droidconAE

Page 81: The 2016 Android Developer Toolbox [DUBAI]

Choose according to your needs and tastes

#droidconAE

Page 82: The 2016 Android Developer Toolbox [DUBAI]

The 2016 Android Developer Toolbox

#droidconAE

Page 83: The 2016 Android Developer Toolbox [DUBAI]

(Example of an)Android Developer Toolbox

#droidconAE

Page 84: The 2016 Android Developer Toolbox [DUBAI]

Master your toolsto build be*er apps

❤h"ps://twi"er.com/Nilhcem

h"ps://plus.google.com/+Gau2erMechling#droidconAE