{"id":10726,"date":"2016-06-26T23:21:03","date_gmt":"2016-06-26T21:21:03","guid":{"rendered":"http:\/\/flaven.fr\/?p=10726"},"modified":"2026-09-16T10:09:00","modified_gmt":"2026-09-16T08:09:00","slug":"bonnes-pratiques-android-un-resume-des-bonnes-pratiques-pour-le-developpement-dapplication-mobile-sous-android","status":"publish","type":"post","link":"https:\/\/flaven.fr\/2016\/06\/bonnes-pratiques-android-un-resume-des-bonnes-pratiques-pour-le-developpement-dapplication-mobile-sous-android\/","title":{"rendered":"Bonnes pratiques, Android &#8211; Un r\u00e9sum\u00e9 des bonnes pratiques pour le d\u00e9veloppement d&#8217;application mobile sous Android"},"content":{"rendered":"<p>\tUn article consacr\u00e9 aux &#8220;Best Practices&#8221; dans le d\u00e9veloppement d&#8217;applications Android, provenant toujours de la m\u00eame source Futurice.<\/p>\n<ul>\n<li><a href=\"https:\/\/github.com\/futurice\/ios-good-practices\" target=\"_blank\">https:\/\/github.com\/futurice\/ios-good-practices<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/futurice\/android-best-practices\" target=\"_blank\">https:\/\/github.com\/futurice\/android-best-practices<\/a><\/li>\n<\/ul>\n<h4>1. Utiliser Gradle<\/h4>\n<p>\tL&#8217;utilisation de Gradle est un pr\u00e9-requis. Il vaut mieux oublier Ant, plus limit\u00e9 et verbeux. En effet, avec Gradle :<\/p>\n<ul>\n<li>Cr\u00e9er diff\u00e9rentes variantes de votre application<\/li>\n<li>Ex\u00e9cuter facilement des t\u00e2ches sous forme de script<\/li>\n<li>G\u00e9rer les d\u00e9pendances<\/li>\n<li>Bref simplifiez-vous la vie&#8230;<\/li>\n<\/ul>\n<p>Par ailleurs et non des moindres, le  plugin Gradle est activement soutenu et d\u00e9velopp\u00e9e par les \u00e9quipes Google. On aurait tort de se priver d&#8217;une telle aide.<\/p>\n<ul>\n<li><a href=\"http:\/\/gradle.org\/getting-started-android-build\/\" target=\"_blank\">Gradle for Android build<\/a><\/li>\n<li><a href=\"https:\/\/www.thisisant.com\/developer\/ant\/ant-in-android\" target=\"_blank\">The Android ANT SDK<\/a><\/li>\n<\/ul>\n<h4>2. Structure des projets, Gradle encore<\/h4>\n<p>\tL\u00e0 encore, qui est In, qui est Out ?<br \/>\n\tLa traditionnelle structure de projet propos\u00e9 par Ant &amp; Eclipse est \u00e0 abandonner au plus vite et il est fortement conseiller de rejoindre la structure de projet propos\u00e9 par la combinaison Gradle &amp; Android Studio.<\/p>\n<p><b>La structure de projets type Gradle selon Futurice<\/b><\/p>\n<pre lang=\"bash\">\r\n\t\t\u251c\u2500 library-foobar\r\n\t\t\u251c\u2500 app\r\n\t\t\u2502  \u251c\u2500 libs\r\n\t\t\u2502  \u251c\u2500 src\r\n\t\t\u2502  \u2502  \u251c\u2500 androidTest\r\n\t\t\u2502  \u2502  \u2502  \u2514\u2500 java\r\n\t\t\u2502  \u2502  \u2502     \u2514\u2500 com\/futurice\/project\r\n\t\t\u2502  \u2502  \u2514\u2500 main\r\n\t\t\u2502  \u2502     \u251c\u2500 java\r\n\t\t\u2502  \u2502     \u2502  \u2514\u2500 com\/futurice\/project\r\n\t\t\u2502  \u2502     \u251c\u2500 res\r\n\t\t\u2502  \u2502     \u2514\u2500 AndroidManifest.xml\r\n\t\t\u2502  \u251c\u2500 build.gradle\r\n\t\t\u2502  \u2514\u2500 proguard-rules.pro\r\n\t\t\u251c\u2500 build.gradle\r\n\t\t\u2514\u2500 settings.gradle\r\n\t<\/pre>\n<p>\tLa diff\u00e9rence principale est que dans une structure &#8220;Gradle&#8221;, chacune de ressources est s\u00e9par\u00e9e dans un r\u00e9pertoire. Ce qui permet par exemple de g\u00e9rer distinctement les ressources n\u00e9cessaires \u00e0 une version payante ou gratuite de votre application.<\/p>\n<p>\tPar ailleurs, g\u00e9rer l&#8217;application dans un r\u00e9pertoire de haut niveau permet de faire la distinction avec les librairies utilis\u00e9es par votre application. Le fichier <i>settings.gradle<\/i> est pr\u00e9sent pour conserver les r\u00e9f\u00e9rences \u00e0 ces r\u00e9pertoires de librairies , fichier auquel se r\u00e9f\u00e8re <i>app\/build.gradle<\/i>.<\/p>\n<h4>3. Configuration de Gradle<\/h4>\n<p>\t<b>3.1 Structure g\u00e9n\u00e9ral<\/b><br \/>\n\tLe plus simple est de &#8220;play by the book&#8221; comme disent les anglophones en suivant<br \/>\n\tFollow Google&#8217;s guide on Gradle for Android<br \/>\n\thttp:\/\/tools.android.com\/tech-docs\/new-build-system\/user-guide<\/p>\n<p>\t<b>3.2 Ex\u00e9cution de t\u00e2ches via des scripts<\/b><br \/>\n\tMieux vaut utiliser Gradle qu&#8217;une collection de scripts en Shell, Python&#8230;.etc<br \/>\n\tUne documentation compl\u00e8te vous indique la marche \u00e0 suivre.<br \/>\n\tSource : <a href=\"http:\/\/www.gradle.org\/docs\/current\/userguide\/userguide_single.html#N10CBF\" target=\"_blank\">Writing Gradle build scripts<\/a><\/p>\n<p>\t\t<b>3.3 Gestion des mots de passe<\/b><br \/>\n\tLa solution est de cr\u00e9er un fichier <i>gradle.properties<\/i> qui sera automatiquement import\u00e9 par Gradle et pourra donc \u00eatre appel\u00e9 dans le fichier <i>build.gradle<\/i>.<\/p>\n<p>\t<b>3.4 Gestion des d\u00e9pendances<\/b><br \/>\n\tIl est grandement souhaitable d&#8217;utiliser <b>Maven<\/b> pour la gestion de d\u00e9pendances que d&#8217;importer directement les fichiers jar.<\/p>\n<p>\tSource : <a href=\"http:\/\/simpligility.github.io\/android-maven-plugin\/\" target=\"_blank\">Android Maven Plugin &#8211; android-maven-plugin<\/a><\/p>\n<p>Il faut absolument \u00e9viter de laisser le soin \u00e0 Maven de g\u00e9rer dynamiquement les versions des d\u00e9pendances. Mieux vaut une gestion manuelle des d\u00e9pendances via Maven qui garantie un environnement de d\u00e9veloppement stable, pr\u00e9dictif et reproductible.<\/p>\n<h4>4. IDEs et editeurs<\/h4>\n<p>Le choix d&#8217;un \u00e9diteur reste un choix personnel, toutefois cette \u00e9diteur doit respecter la structure du projet qui est celle des projets Gradle.<\/p>\n<p>Bien \u00e9videmment, le choix se porte naturellement vers Android Studio, qui est en ad\u00e9quation avec Gradle, c&#8217;est du google made de bout en boit. Android Studio fournit un environnement stable et adapt\u00e9 au d\u00e9veloppement Android.<\/p>\n<p>Source : <a href=\"https:\/\/developer.android.com\/sdk\/installing\/studio.html\" target=\"_blank\">Android Studio<\/a><\/p>\n<h4>5. Libraires<\/h4>\n<p>Voil\u00e0 une partie qui est int\u00e9ressante, le choix de librairies est d\u00e9terminant. Voil\u00e0 l&#8217;assortiment propos\u00e9 par Futurice.<\/p>\n<p><b>5.1 Les librairies JSON (JSON libs)<\/b><br \/>\nA premi\u00e8re vue, la premi\u00e8re librairie \u00e0 s\u00e9lectionner judicieusement lorsque vous concevez une application &#8220;API-centric&#8221;, c&#8217;est la librairie qui va convertir des objets en JSON et inversement. Futurice en fournit une &#8220;shortlist&#8221; qui font le taff :<\/p>\n<ol>\n<li><b>Jackson<\/b> est une librairie bien connue pour le parsing de JSON<br \/><a href=\"http:\/\/wiki.fasterxml.com\/JacksonHome\" target=\"_blank\">http:\/\/wiki.fasterxml.com\/JacksonHome<\/a><\/li>\n<li><b>Gson<\/b> est une alternative tout \u00e0 fait acceptable \u00e0 Jackson<br \/><a href=\"https:\/\/code.google.com\/p\/google-gson\/\" target=\"_blank\">https:\/\/code.google.com\/p\/google-gson\/<\/a><\/li>\n<\/ol>\n<p>Libre \u00e0 vous de choisir la librairie de votre choix, Jackson semble avoir les faveurs de Futurice notamment sur les 3 aspects suivants :  le &#8220;streaming&#8221;, le &#8220;in-memory tree model&#8221;, et le traditionnel &#8220;JSON-POJO data binding&#8221;.<\/p>\n<p>Deux autres librairies alternatives aux deux pr\u00e9c\u00e9dentes :<\/p>\n<ul>\n<li><b>Json-smart<\/b> <a href=\"https:\/\/code.google.com\/p\/json-smart\/\" target=\"_blank\">https:\/\/code.google.com\/p\/json-smart\/<\/a><\/li>\n<li><b>Boon JSON<\/b> <a href=\"https:\/\/github.com\/RichardHightower\/boon\/wiki\/Boon-JSON-in-five-minutes\" target=\"_blank\">ttps:\/\/code.google.com\/p\/json-smart\/<\/a><\/li>\n<\/ul>\n<p><b>5.2 Les librairies de r\u00e9seau (network libs)<\/b><br \/>\nL&#8217;autre aspect une fois la conversion JSON objet effectu\u00e9 est bien la performance optimale des requ\u00eates faites au serveur. Il existe des solutions \u00e9prouv\u00e9es \u00e0 \u00e9tudier tr\u00e8s s\u00e9rieusement pour r\u00e9pondre \u00e0 cette probl\u00e9matique primordiale.<\/p>\n<p>Parmi les librairies, il existe <b>Volley<\/b> ou <b>Retrofit<\/b>. <b>Volley<\/b> fournit aussi tout le &#8220;c\u00e2blage&#8221; n\u00e9cessaire au chargement et \u00e0 la mise en cache des images. La trio gagnant selon Futurice serait  <b>Retrofit<\/b>, <b>Picasso<\/b> pour le chargement des images et le cache des images et <b>OkHttp<\/b> pour l&#8217;optimisation des requ\u00eates HTTP. <\/p>\n<p>Les 3 librairies <b>Retrofit<\/b>, <b>Picasso<\/b> et <b>OkHttp<\/b> sont produites par la m\u00eame soci\u00e9t\u00e9, donc l&#8217;articulation entre les 3 est plut\u00f4t \u00e9vidente.<\/p>\n<p><b>OkHttp<\/b> peut aussi \u00eatre utilis\u00e9 avec <b>Volley<\/b>.<\/p>\n<ul>\n<li><b>Volley<\/b> <a href=\"https:\/\/android.googlesource.com\/platform\/frameworks\/volley\" target=\"_blank\">https:\/\/android.googlesource.com\/platform\/frameworks\/volley<\/a><\/li>\n<li><b>Retrofit<\/b> <a href=\"http:\/\/square.github.io\/retrofit\/\" target=\"_blank\">http:\/\/square.github.io\/retrofit\/<\/a><\/li>\n<li><b>Picasso<\/b> <a href=\"http:\/\/square.github.io\/picasso\/\" target=\"_blank\">http:\/\/square.github.io\/picasso\/<\/a><\/li>\n<li><b>OkHttp<\/b> <a href=\"http:\/\/square.github.io\/okhttp\/\" target=\"_blank\">http:\/\/square.github.io\/okhttp\/<\/a><\/li>\n<li><b>How to implement Android Volley with OkHttp 2.0?<\/b> <a href=\"http:\/\/stackoverflow.com\/questions\/24375043\/how-to-implement-android-volley-with-okhttp-2-0\/24951835#24951835\" target=\"_blank\">http:\/\/stackoverflow.com\/questions\/24375043\/how-to-implement-android-volley-with-okhttp-2-0\/24951835#24951835<\/a><\/li>\n<\/ul>\n<p>D&#8217;autres librairies (libs) sont recommand\u00e9es, notamment RxJava, qui se trouve \u00eatre une librairie d\u00e9velopp\u00e9e par Futurice ! En substance RxJava est une librairie dit de &#8220;Reactive Programming&#8221;, grosso modo pour g\u00e9rer des \u00e9v\u00e9nements asynchrones. Futurice pr\u00e9conise aussi quelques pr\u00e9cautions \u00e0 l&#8217;usage de RxJava, puissante mais d\u00e9routante.<br \/>\nA lire \u00e0 cette \u00e9gard, quelques-uns de leurs articles de blog :<\/p>\n<ul>\n<li><b>Tech Pick of the Week: Rx for .NET and RxJava for Android<\/b> <a href=\"http:\/\/blog.futurice.com\/tech-pick-of-the-week-rx-for-net-and-rxjava-for-android\" target=\"_blank\">http:\/\/blog.futurice.com\/tech-pick-of-the-week-rx-for-net-and-rxjava-for-android<\/a><\/li>\n<li><b>Top 7 Tips for RxJava on Android<\/b> <a href=\"http:\/\/blog.futurice.com\/top-7-tips-for-rxjava-on-android\" target=\"_blank\">http:\/\/blog.futurice.com\/top-7-tips-for-rxjava-on-android<\/a><\/li>\n<li><b>The introduction to Reactive Programming you&#8217;ve been missing<\/b> <a href=\"https:\/\/gist.github.com\/staltz\/868e7e9bc2a7b8c1f754\" target=\"_blank\">https:\/\/gist.github.com\/staltz\/868e7e9bc2a7b8c1f754<\/a><\/li>\n<li><b>Android development has its own Swift<\/b> <a href=\"http:\/\/blog.futurice.com\/android-development-has-its-own-swift\" target=\"_blank\">http:\/\/blog.futurice.com\/android-development-has-its-own-swift<\/a><\/li>\n<\/ul>\n<p>Une autre librairie <b>Retrolambda<\/b> qui permet d&#8217;utiliser une syntaxe d&#8217;expression lambda dans Android et dans d&#8217;autres plateformes pre-JDK8.  Pourquoi ? C&#8217;est l&#8217;assurance de maintenir un code concis et lisible particuli\u00e8rement si vous utilisez un style fonctionnel avec RxJava par exemple.<\/p>\n<ul>\n<li><b>Retrolambda<\/b> <a href=\"https:\/\/github.com\/evant\/gradle-retrolambda\" target=\"_blank\">https:\/\/github.com\/evant\/gradle-retrolambda<\/a><\/li>\n<\/ul>\n<p><b>5.3 Les librairies de r\u00e9seau (methodlimitation)<\/b><br \/>\nSelon la d\u00e9finition m\u00eame du site officiel d&#8217;Android, ce chiffre de 65 536 repr\u00e9sente le nombre total de r\u00e9f\u00e9rences qui peuvent \u00eatre invoqu\u00e9es dans le code dans un seul fichier bytecode Dalvik Executable (dex).<br \/>\nC&#8217;est un peu un plafond de verre, il faut donc \u00e9viter d&#8217;utiliser trop de librairies au risque d&#8217;accroitre inutilement le nombre de m\u00e9thodes et donc de vous rapprocher du m\u00eame coup de cette limite fatale. Futurice pr\u00e9conise d&#8217;utiliser un nombre limit\u00e9 de librairies ainsi que de se servir d&#8217;un outil de d\u00e9compte pour rester en de\u00e7\u00e0 du chiffre fatidique. A bannir, l&#8217;utilisation de la librairie Guava, dans la mesure ou elle poss\u00e8de 13k m\u00e9thodes.<\/p>\n<ul>\n<li><b>Configure Apps with Over 64K Methods<\/b> <a href=\"https:\/\/developer.android.com\/studio\/build\/multidex.html\" target=\"_blank\">https:\/\/developer.android.com\/studio\/build\/multidex.html<\/a><\/li>\n<li><b>Command-line tool to count per-package methods in Android .dex files<\/b> <a href=\"https:\/\/github.com\/mihaip\/dex-method-counts\" target=\"_blank\">https:\/\/github.com\/mihaip\/dex-method-counts<\/a><\/li>\n<li><b>[DEX] Sky\u2019s the limit? No, 65K methods is<\/b> <a href=\"https:\/\/medium.com\/@rotxed\/dex-skys-the-limit-no-65k-methods-is-28e6cb40cf71#.tlt72nml0\" target=\"_blank\">https:\/\/medium.com\/@rotxed\/dex-skys-the-limit-no-65k-methods-is-28e6cb40cf71#.tlt72nml0<\/a><\/li>\n<li><b>Per-Package Method Counts for Android&#8217;s DEX Format<\/b> <a href=\"http:\/\/blog.persistent.info\/2014\/05\/per-package-method-counts-for-androids.html\" target=\"_blank\">http:\/\/blog.persistent.info\/2014\/05\/per-package-method-counts-for-androids.html<\/a><\/li>\n<li><b>Play Services 5.0 Is A Monolith Abomination<\/b> <a href=\"http:\/\/jakewharton.com\/play-services-is-a-monolith\/\" target=\"_blank\">http:\/\/jakewharton.com\/play-services-is-a-monolith\/<\/a><\/li>\n<\/ul>\n<p><b>On marque une pause dans le d\u00e9roul\u00e9 des sujets trait\u00e9s. En effet, Futurice s&#8217;int\u00e9resse aux sujets parfois controvers\u00e9s entre les d\u00e9veloppeurs : l&#8217;architecture des projets, la gestion des resources&#8230; Chacun de ces sujets doit \u00eatre en effet discut\u00e9s toutefois c&#8217;est aussi \u00e0 la discr\u00e9tion du d\u00e9veloppeur, en esp\u00e9rant que celui-ci choisisse les bonnes pratiques. je vous invite vivement \u00e0 lire cette partie si vous souhaitez entamer la cr\u00e9ation ou la refonte d&#8217;une application Android.<\/b><\/p>\n<h4>6. Test frameworks<\/h4>\n<p>La framework de test du SDK Android est encore \u00e0 ses balbutiements, notamment au regard des test UI (User Interface).<\/p>\n<p>Android Gradle impl\u00e9mente actuellement une t\u00e2che nomm\u00e9 <i>connectedAndroidTest<\/i> qui ex\u00e9cute les tests que vous avez cr\u00e9\u00e9s avec JUnit, via une extension de JUnit au travers des helpers d&#8217;Android. Il existe une proc\u00e9dure pour la mise ne place de ces tests dont voici les principaux liens :<\/p>\n<ul>\n<li>Test Your App<br \/><a href=\"http:\/\/developer.android.com\/tools\/testing\/testing_android.html\" target=\"_blank\">http:\/\/developer.android.com\/tools\/testing\/testing_android.html<\/a><\/li>\n<li>Automating User Interface Tests<br \/><a href=\"http:\/\/developer.android.com\/tools\/testing\/activity_test.html\" target=\"_blank\">http:\/\/developer.android.com\/tools\/testing\/activity_test.html<\/a><\/li>\n<\/ul>\n<p>N&#8217;utiliser Robolectric que pour les tests unitaires. En effet, Robolectric est un framework qui fournit des tests d\u00e9connect\u00e9s du terminal. L&#8217;avantage est que cela accroit consid\u00e9rablement la vitesse de d\u00e9veloppement. Toutefois, bien qu&#8217;ad\u00e9quat pour des tests unitaires dans un mod\u00e8le MVC, les tests sous Robolectric sont incomplets et impr\u00e9cis quand il s&#8217;agit de tests UI (User Interface).<\/p>\n<p>Pour les tests UI, Robotium facilitera l&#8217;\u00e9criture de ce type de tests. Robotium vous sera b\u00e9n\u00e9fique en raison de la profusion des &#8220;helpers&#8221; susceptibles d&#8217;analyser les vues et dans le contr\u00f4le de l&#8217;\u00e9cran.<\/p>\n<p>Les cas de test devront aussi simple que cela : <\/p>\n<pre lang=\"bash\">\r\nsolo.sendKey(Solo.MENU);\r\nsolo.clickOnText(\"More\"); \/\/ searches for the first occurrence of \"More\" and clicks on it\r\nsolo.clickOnText(\"Preferences\");\r\nsolo.clickOnText(\"Edit File Extensions\");\r\nAssert.assertTrue(solo.searchText(\"rtf\"));\r\n<\/pre>\n<h4>7. Emulators<\/h4>\n<p>Une fois n&#8217;est pas coutume, on va citer un article pr\u00e9c\u00e9dent de ce site qui pr\u00e9sente Genymotion. Cet \u00e9mulateur Android fera amplement l&#8217;affaire \u00e0 d\u00e9faut d&#8217;avoir les vrais terminaux.<\/p>\n<ul>\n<li>Android, Genymotion, APK \u2013 Installer un environnement de recette et de d\u00e9veloppement pour Android<br \/><a href=\"https:\/\/flaven.fr\/2014\/10\/android-genymotion-apk-installer-un-environnement-de-recette-et-de-developpement-pour-android\/\" target=\"_blank\">https:\/\/flaven.fr\/2014\/10\/android-genymotion-apk-installer-un-environnement-de-recette-et-de-developpement-pour-android\/<\/a><\/li>\n<\/ul>\n<h4>8. Proguard configuration<\/h4>\n<p>ProGuard est majoritairement utilis\u00e9 sur de projets Android afin de r\u00e9duire, de &#8220;obfuscate&#8221; le code, en clair l&#8217;obscurcir pour le prot\u00e9ger !<\/p>\n<p>Il est habituel de configurer Gradle \u00e0 utiliser ProGuard lorsque on &#8220;build&#8221; une apk pour la production.<\/p>\n<p>Il existe aussi un autre outil nomm\u00e9 DexGuard, tr\u00e8s puissant pour l&#8217;optimisation et l&#8217;obscurcissement du code. C&#8217;est disons la version payante de ProGuard.<\/p>\n<ul>\n<li>ProGuard is a free Java class file shrinker, optimizer, obfuscator, and preverifier.<br \/><a href=\"http:\/\/proguard.sourceforge.net\/\" target=\"_blank\">http:\/\/proguard.sourceforge.net\/<\/a><\/li>\n<\/ul>\n<h4>9. Utiliser Stetho<\/h4>\n<p>Stetho est un ambitieux projet, soutenu par Facebook, pour le debogage des applications Android qui s&#8217;int\u00e8gre parfaitement avec la suite des Developer Tools de Chrome.<\/p>\n<p>Il est possible avec Stetho de ce que vous faites habituellement \u00e0 l&#8217;aide de Developer Tools de Chrome pour un site web \u00e0 savoir inspecter l&#8217;app pour mesurer l&#8217;activit\u00e9 r\u00e9seau, les bases de donn\u00e9es SQLite ou les pr\u00e9f\u00e9rences partag\u00e9 par votre application.<\/p>\n<p>Bien sur un conseil, assurez-vous que Stetho est uniquement disponible dans un build de d\u00e9veloppement et dans la build de production.<\/p>\n<ul>\n<li>A debug bridge for Android applications<br \/><a href=\"hhttp:\/\/facebook.github.io\/stetho\/\" target=\"_blank\">http:\/\/facebook.github.io\/stetho\/<\/a><\/li>\n<\/ul>\n<h2>En savoir plus<\/h2>\n<ul>\n<li>Un index des bonnes pratiques pour le d\u00e9veloppement Android document\u00e9 par Futurice<br \/><a href=\"https:\/\/github.com\/futurice\/android-best-practices\" target=\"_blank\">https:\/\/github.com\/futurice\/android-best-practices<\/a><\/li>\n<li>Android Keystore System<br \/><a href=\"https:\/\/developer.android.com\/training\/articles\/keystore.html\" target=\"_blank\">https:\/\/developer.android.com\/training\/articles\/keystore.html<\/a><\/li>\n<li>Getting Started<br \/><a href=\"https:\/\/developer.android.com\/training\/index.html\" target=\"_blank\">https:\/\/developer.android.com\/training\/index.html<\/a><\/li>\n<p><b>Des ressources sur l&#8217;int\u00e9gration continue des apps, merci @sofiene<\/b><\/p>\n<li>iOS continuous delivery with Jenkins and Fastlane<br \/><a href=\"https:\/\/labs.kunstmaan.be\/blog\/ios-continuous-delivery-with-jenkins-and-fastlane\" target=\"_blank\">https:\/\/labs.kunstmaan.be\/blog\/ios-continuous-delivery-with-jenkins-and-fastlane<\/a><\/li>\n<li>Continuous Integration for mobile apps with Fastlane and Jenkins<br \/><a href=\"http:\/\/blog.zuehlke.com\/en\/continuous-integration-for-mobile-apps-with-fastlane-and-jenkins\/\" target=\"_blank\">http:\/\/blog.zuehlke.com\/en\/continuous-integration-for-mobile-apps-with-fastlane-and-jenkins\/<\/a><\/li>\n<li>Jenkins, Fastlane, Crashlytics, Gradle and Slack \u2014 All together<br \/><a href=\"https:\/\/minafayek.wordpress.com\/2016\/01\/08\/jenkins-fastlane-crashlytics-gradle-and-slack-all-together\/\" target=\"_blank\">https:\/\/minafayek.wordpress.com\/2016\/01\/08\/jenkins-fastlane-crashlytics-gradle-and-slack-all-together\/<\/a><\/li>\n<li>Picking a Continuous Integration Platform for Mobile Projects<br \/><a href=\"http:\/\/www.mjdinteractive.com\/picking-a-continuous-integration-platform-for-mobile-projects\/\" target=\"_blank\">http:\/\/www.mjdinteractive.com\/picking-a-continuous-integration-platform-for-mobile-projects\/<\/a><\/li>\n<li>Continuous Integration with Fastlane and Jenkins<br \/><a href=\"https:\/\/github.com\/adou600\/IosContinuousIntegration\" target=\"_blank\">https:\/\/github.com\/adou600\/IosContinuousIntegration<\/a><\/li>\n<li>D\u00e9velopper des applications Android avec Maven<br \/><a href=\"http:\/\/blog.octo.com\/developper-des-applications-android-avec-maven\/\" target=\"_blank\">http:\/\/blog.octo.com\/developper-des-applications-android-avec-maven\/<\/a><\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Un article consacr\u00e9 aux &#8220;Best Practices&#8221; dans le d\u00e9veloppement d&#8217;applications Android, provenant toujours de la m\u00eame source Futurice. https:\/\/github.com\/futurice\/ios-good-practices https:\/\/github.com\/futurice\/android-best-practices 1. Utiliser Gradle L&#8217;utilisation de&hellip; <\/p>\n<p class=\"text-center\"><a href=\"https:\/\/flaven.fr\/2016\/06\/bonnes-pratiques-android-un-resume-des-bonnes-pratiques-pour-le-developpement-dapplication-mobile-sous-android\/\" class=\"more-link\">Continue reading &rarr; <span class=\"screen-reader-text\">Bonnes pratiques, Android &#8211; Un r\u00e9sum\u00e9 des bonnes pratiques pour le d\u00e9veloppement d&#8217;application mobile sous Android<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":10727,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"bf_ai_meta_description":"Les bonnes pratiques Android simplifient le d\u00e9veloppement d'applications mobiles. Utilisez Gradle pour g\u00e9rer les d\u00e9pendances et automatiser les t\u00e2ches.","bf_ai_og_title":"Bonnes pratiques Android","footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[3437,3454,3442,3444,3447,3448,3449,3450,3435,3452],"tags":[2238,163,2344,1910,3493,518,1871],"class_list":["post-10726","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-business-case-studies","category-journalism-writing","category-mobile-devices","category-programming-databases","category-technology-trends","category-tools-productivity","category-tutorials-how-to","category-ux-product-design","category-web-development","category-wordpress-cms","tag-android","tag-application","tag-best-practices","tag-bonnes-pratiques","tag-clip","tag-ios","tag-smartphone"],"jetpack_publicize_connections":[],"jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p3Vuhl-2N0","jetpack_featured_media_url":"https:\/\/flaven.fr\/wp-content\/uploads\/2016\/06\/android_Good_Practices_b.jpg","_links":{"self":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10726","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/comments?post=10726"}],"version-history":[{"count":1,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10726\/revisions"}],"predecessor-version":[{"id":10728,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/posts\/10726\/revisions\/10728"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/media\/10727"}],"wp:attachment":[{"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/media?parent=10726"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/categories?post=10726"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/flaven.fr\/happy-api\/wp\/v2\/tags?post=10726"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}