The 2016 Android Developer Toolbox [NANTES]

71
#devfestnantes LA BOÎTE À OUTILS DU DÉVELOPPEUR ANDROID DE 2016

Transcript of The 2016 Android Developer Toolbox [NANTES]

Page 1: The 2016 Android Developer Toolbox [NANTES]

#devfestnantes

LA BOÎTE À OUTILS DUDÉVELOPPEUR

ANDROID DE 2016

Page 2: The 2016 Android Developer Toolbox [NANTES]

(avec le plugin Android)

Page 3: The 2016 Android Developer Toolbox [NANTES]

BUILD VARIANTS

Page 4: The 2016 Android Developer Toolbox [NANTES]

U+2020https://github.com/JakeWharton/u2020

Page 5: The 2016 Android Developer Toolbox [NANTES]

MENU DE DEBUGExemple de Google iosched

Page 6: The 2016 Android Developer Toolbox [NANTES]

ACTIVITÉ DE DEBUGInspirée de U+2020

Afficher les informations de build

Changer de serveur à la volée

Afficher les logs

Envoyer des rapports de bugs

etc.

Page 7: The 2016 Android Developer Toolbox [NANTES]

L'APPLICATION DEVFEST NANTES 2016https://github.com/Nilhcem/devfestnantes-2016

Page 8: The 2016 Android Developer Toolbox [NANTES]

MESURER

Page 9: The 2016 Android Developer Toolbox [NANTES]

ANDROID STUDIO(onglet Android Monitor)

Page 10: The 2016 Android Developer Toolbox [NANTES]
Page 11: The 2016 Android Developer Toolbox [NANTES]

DÉTECTER LES FUITES MÉMOIRE

Page 12: The 2016 Android Developer Toolbox [NANTES]
Page 13: The 2016 Android Developer Toolbox [NANTES]

LEAK CANARYhttps://github.com/square/leakcanary

Page 14: The 2016 Android Developer Toolbox [NANTES]

FRAME RATE

build.gradle :

MyApplication.java :

https://github.com/wasabeef/Takt

compile 'jp.wasabeef:takt:1.0.3'

public class MyApplication extends Application {

@Override public void onCreate() {

super.onCreate();

Takt.stock(this).play();

}

}

Page 15: The 2016 Android Developer Toolbox [NANTES]

HUGOhttps://github.com/JakeWharton/hugo

Préfixer les classes / methodes avec :

@DebugLog

Résultat :

DevFestApp V ⇢ onCreate() V ⇢ initGraph() V ⇠ initGraph [13ms] V ⇢ initLogger() V ⇠ initLogger [1ms] V ⇠ onCreate [73ms]

Page 16: The 2016 Android Developer Toolbox [NANTES]

PIDCAThttps://github.com/JakeWharton/pidcat

$ pidcat com.nilhcem.devfest

Page 17: The 2016 Android Developer Toolbox [NANTES]

ANDROIDDEVMETRICS

build.gradle :

MyApplication.java :

https://github.com/frogermcs/AndroidDevMetrics

apply plugin: 'com.frogermcs.androiddevmetrics'

public class MyApplication extends Application {

@Override public void onCreate() {

super.onCreate();

AndroidDevMetrics.initWith(this);

}

}

Page 18: The 2016 Android Developer Toolbox [NANTES]

ANALYSE STATIQUE DE CODE

Lint

Error Prone (Google)

Infer (Facebook)

Page 19: The 2016 Android Developer Toolbox [NANTES]
Page 20: The 2016 Android Developer Toolbox [NANTES]
Page 21: The 2016 Android Developer Toolbox [NANTES]
Page 22: The 2016 Android Developer Toolbox [NANTES]

SONARQUBEDockerfile :

FROM java:8

MAINTAINER Nilhcem

RUN DEBIAN_FRONTEND=noninteractive apt update

RUN DEBIAN_FRONTEND=noninteractive apt install -y wget unzip

RUN wget -q https://sonarsource.bintray.com/Distribution/sonarqube/sonarqube-6.1.zip

RUN unzip -qq sonarqube-6.1.zip -d /opt/

RUN rm sonarqube-6.1.zip

EXPOSE 9000

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

Ensuite lancer :

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

Page 23: The 2016 Android Developer Toolbox [NANTES]

SONARQUBE : CONFIGURATION GRADLEbuild.gradle :

apply plugin: 'org.sonarqube'

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

property 'sonar.projectKey', 'devfestnantes-2016' property 'sonar.projectName', 'DevFest Nantes 2016' property 'sonar.projectVersion', appProject.android.defaultConfig.versionName

property 'sonar.host.url', 'http://localhost:9000' property 'sonar.sources', 'src' property 'sonar.sourceEncoding', 'UTF-8' property 'sonar.java.binaries', 'build/intermediates/classes/production/debug' property 'sonar.java.test.binaries', 'build/intermediates/classes/test/production/debug'

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

Ensuite lancer :

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

Page 24: The 2016 Android Developer Toolbox [NANTES]
Page 25: The 2016 Android Developer Toolbox [NANTES]
Page 26: The 2016 Android Developer Toolbox [NANTES]

TESTER

Page 27: The 2016 Android Developer Toolbox [NANTES]

MOCK SERVER

Page 28: The 2016 Android Developer Toolbox [NANTES]

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');

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

/* Autres services web */ // ...

/* Démarrer le serveur */ app.listen(port, function () { console.log('Express server listening on port ' + port); });

Page 29: The 2016 Android Developer Toolbox [NANTES]

NODEJS + EXPRESSSimuler une réponse lente

sleep(2000);

function sleep(durationMillis) { var now = new Date().getTime(); while (new Date().getTime() < now + durationMillis) { // do nothing } } // SVP ne prenez pas ce slide en photo, j’en suis pas fier

Page 30: The 2016 Android Developer Toolbox [NANTES]

EXEMPLE

Ensuite, aller sur :

https://github.com/Nilhcem/devfestnantes-2016 /tree/master/mockserver

$ npm install

$ npm start

http://localhost:8990/

Page 31: The 2016 Android Developer Toolbox [NANTES]

HOSTS EDITORhttps://play.google.com/store/apps/details?id=com.nilhcem.hostseditor

Page 32: The 2016 Android Developer Toolbox [NANTES]

DÉBUGUEUR HTTP

Page 33: The 2016 Android Developer Toolbox [NANTES]

DÉBUGUEURS HTTP

mitmproxy

Fiddler

Charles proxy

Page 34: The 2016 Android Developer Toolbox [NANTES]

CHARLES PROXYSimuler une connexion lente/instable

Répéter des requêtes

Vérifier les réponses

Ajouter des points d’arrêt pour: Annuler un appel HTTP(s)

Éditer une requête

Éditer une réponse

Page 35: The 2016 Android Developer Toolbox [NANTES]

ÉDITER UNE RÉPONSE

Page 36: The 2016 Android Developer Toolbox [NANTES]

TESTER LESRESTAURATIONS

D'ÉTAT

Page 37: The 2016 Android Developer Toolbox [NANTES]

NE PAS CONSERVER LES ACTIVITÉS

Page 38: The 2016 Android Developer Toolbox [NANTES]

FILL RAMhttps://play.google.com/store/apps/details?id=com.tspoon.androidtoolbelt

Page 39: The 2016 Android Developer Toolbox [NANTES]

ARRÊT DE PROCESS VIA ANDROID DEVICE MONITOR

Page 40: The 2016 Android Developer Toolbox [NANTES]

ANALYSE

Page 41: The 2016 Android Developer Toolbox [NANTES]

OPTIONSDÉVELOPPEURS

Page 42: The 2016 Android Developer Toolbox [NANTES]
Page 43: The 2016 Android Developer Toolbox [NANTES]
Page 44: The 2016 Android Developer Toolbox [NANTES]

UIAUTOMATORVIEWER

Page 45: The 2016 Android Developer Toolbox [NANTES]

ANIMATIONSOptions développeurs -> Échelle d'animation

Page 46: The 2016 Android Developer Toolbox [NANTES]

ANIMATIONS

Faire un screencast (API 19+) :

VLC :

$ adb shell screenrecord /sdcard/demo.mp4

$ adb pull /sdcard/demo.mp4

Appuyer sur la touche 'E' du clavier

pour voir les frames une par une

Page 47: The 2016 Android Developer Toolbox [NANTES]

APKTOOL + DEX2JAR + JD-GUI

http://ibotpeaches.github.io/Apktoolhttps://github.com/pxb1988/dex2jar

http://jd.benow.ca

Page 48: The 2016 Android Developer Toolbox [NANTES]

JADXhttps://github.com/skylot/jadx

Page 49: The 2016 Android Developer Toolbox [NANTES]

ANDROID STUDIO(Build > Analyze APK)

Page 50: The 2016 Android Developer Toolbox [NANTES]

STETHO

Page 51: The 2016 Android Developer Toolbox [NANTES]

STETHO - UI

Page 52: The 2016 Android Developer Toolbox [NANTES]

STETHO - RÉSEAU

Page 53: The 2016 Android Developer Toolbox [NANTES]

STETHO - RESSOURCES

Page 54: The 2016 Android Developer Toolbox [NANTES]

STETHO DUMPAPP

Page 55: The 2016 Android Developer Toolbox [NANTES]

STETHO - DUMPAPP

Page 56: The 2016 Android Developer Toolbox [NANTES]

STETHO - DUMPAPP

Page 57: The 2016 Android Developer Toolbox [NANTES]

D'AUTRES EXEMPLES AVEC DUMPAPP$ dumpapp accessToken invalidate $ dumpapp accessToken show fce1235425dcdeadbeef8cafebabe42

$ dumpapp clipboard get Hello

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

$ dumpapp gcmToken uHyMKnEQ:APA91bEHZ6afFLQQMzKgSDjp5y_0397usitPqj_Bp02

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

$ dumpapp runningServices com.example.LocationService

Page 58: The 2016 Android Developer Toolbox [NANTES]

DUMPAPP - CRÉATION D'UN PLUGINhttp://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!"); } } }

Page 59: The 2016 Android Developer Toolbox [NANTES]

DUMPAPP - CRÉATION D'UN PLUGIN

Page 60: The 2016 Android Developer Toolbox [NANTES]

DUMPAPP - CRÉATION D'UN PLUGIN

(ActivityProvider dans un graph de dépendance en debug)

@Singleton public 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; } }

Page 61: The 2016 Android Developer Toolbox [NANTES]

DUMPAPP - CRÉATION D'UN PLUGIN

AppDumperPlugin.java

private void displayCurrentSessionData(PrintStream writer) {

Activity activity = activityProvider.getCurrentActivity();

if (activity instanceof SessionDetailsActivity) {

try {

// Un peu de réflection pour accéder au membre privé "session"

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());

}

}

}

Page 62: The 2016 Android Developer Toolbox [NANTES]

STETHO CONSOLE + RHINO

Page 63: The 2016 Android Developer Toolbox [NANTES]

ET AUSSI

Page 64: The 2016 Android Developer Toolbox [NANTES]

ADB + SHELL

# Ouvrir un deep link adb shell am start -a android.intent.action.VIEW -d "scheme://app/deep/linking"

# Lister les services qui tournent actuellement sur l'appareil adb shell dumpsys activity services

# Récupérer le chemin de l’apk d’une application installée adb shell pm path app.package.name

# Supprimer les données de l'app adb shell pm clean app.package.name

# Prendre un screenshot adb shell screencap -p | perl -pe '\''s/\x0D\x0A/\x0A/g'\'' > screen.png

# Coller le texte du clipboard de son ordi vers son appareil android pbpaste | sed "s/%/%%/g" | sed "s/ /\%\s/g" | xargs adb shell input text

Page 65: The 2016 Android Developer Toolbox [NANTES]

POSTMANhttps://www.getpostman.com/

Page 66: The 2016 Android Developer Toolbox [NANTES]

LOCKITOhttps://play.google.com/store/apps/details?id=fr.dvilleneuve.lockito

Page 67: The 2016 Android Developer Toolbox [NANTES]

ACCESSIBILITY SCANNERhttps://play.google.com/store/apps/details?id=com.google.android.apps.accessibility.auditor

Page 68: The 2016 Android Developer Toolbox [NANTES]

VYSORhttp://www.vysor.io

Page 69: The 2016 Android Developer Toolbox [NANTES]

EN CONCLUSION...

Page 70: The 2016 Android Developer Toolbox [NANTES]

CHOISIR SELON VOSBESOINS ET

PRÉFÉRENCES

Page 71: The 2016 Android Developer Toolbox [NANTES]

https://twitter.com/Nilhcem

https://github.com/Nilhcem/devfestnantes-2016

http://www.slideshare.net/Nilhcem/the-2016-android-developer-toolbox-nantes

EOF