Download - The 2016 Android Developer Toolbox [NANTES]
#devfestnantes
LA BOÎTE À OUTILS DUDÉVELOPPEUR
ANDROID DE 2016
(avec le plugin Android)
BUILD VARIANTS
U+2020https://github.com/JakeWharton/u2020
MENU DE DEBUGExemple de Google iosched
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.
L'APPLICATION DEVFEST NANTES 2016https://github.com/Nilhcem/devfestnantes-2016
MESURER
ANDROID STUDIO(onglet Android Monitor)
DÉTECTER LES FUITES MÉMOIRE
LEAK CANARYhttps://github.com/square/leakcanary
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();
}
}
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]
PIDCAThttps://github.com/JakeWharton/pidcat
$ pidcat com.nilhcem.devfest
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);
}
}
ANALYSE STATIQUE DE CODE
Lint
Error Prone (Google)
Infer (Facebook)
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
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
TESTER
MOCK SERVER
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); });
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
EXEMPLE
Ensuite, aller sur :
https://github.com/Nilhcem/devfestnantes-2016 /tree/master/mockserver
$ npm install
$ npm start
http://localhost:8990/
HOSTS EDITORhttps://play.google.com/store/apps/details?id=com.nilhcem.hostseditor
DÉBUGUEUR HTTP
DÉBUGUEURS HTTP
mitmproxy
Fiddler
Charles proxy
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
ÉDITER UNE RÉPONSE
TESTER LESRESTAURATIONS
D'ÉTAT
NE PAS CONSERVER LES ACTIVITÉS
FILL RAMhttps://play.google.com/store/apps/details?id=com.tspoon.androidtoolbelt
ARRÊT DE PROCESS VIA ANDROID DEVICE MONITOR
ANALYSE
OPTIONSDÉVELOPPEURS
UIAUTOMATORVIEWER
ANIMATIONSOptions développeurs -> Échelle d'animation
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
APKTOOL + DEX2JAR + JD-GUI
http://ibotpeaches.github.io/Apktoolhttps://github.com/pxb1988/dex2jar
http://jd.benow.ca
JADXhttps://github.com/skylot/jadx
ANDROID STUDIO(Build > Analyze APK)
STETHO
STETHO - UI
STETHO - RÉSEAU
STETHO - RESSOURCES
STETHO DUMPAPP
STETHO - DUMPAPP
STETHO - DUMPAPP
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
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!"); } } }
DUMPAPP - CRÉATION D'UN PLUGIN
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; } }
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());
}
}
}
STETHO CONSOLE + RHINO
ET AUSSI
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
POSTMANhttps://www.getpostman.com/
LOCKITOhttps://play.google.com/store/apps/details?id=fr.dvilleneuve.lockito
ACCESSIBILITY SCANNERhttps://play.google.com/store/apps/details?id=com.google.android.apps.accessibility.auditor
VYSORhttp://www.vysor.io
EN CONCLUSION...
CHOISIR SELON VOSBESOINS ET
PRÉFÉRENCES
https://twitter.com/Nilhcem
https://github.com/Nilhcem/devfestnantes-2016
http://www.slideshare.net/Nilhcem/the-2016-android-developer-toolbox-nantes
EOF