Jug Lausanne Android Janvier2013

3 073 vues

Publié le

Slides de ma présentation au JUG Lausanne (Janvier 2013) : slides d'introduction à la plateforme Android, les bases du développement Android, les relations avec Java (outillage, librairies, ...) et quelques bonnes pratiques pour gérer la diversité des devices.

Publié dans : Technologie
0 commentaire
3 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

Aucun téléchargement
Vues
Nombre de vues
3 073
Sur SlideShare
0
Issues des intégrations
0
Intégrations
603
Actions
Partages
0
Téléchargements
0
Commentaires
0
J’aime
3
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Jug Lausanne Android Janvier2013

  1. 1. Android JUG Lausanne Janvier 2013 Jérôme Van Der Linden1 © OCTO 2012
  2. 2. Moi !   Architecte Java/JEE @ Octo !   Archi, dev, audit, conseil Metroide !   jva@octo.com !   Développeur Android depuis 2009 Android !   Metroide Holo !   Formateur Octo depuis 2010 Colors !   Auteur de android-holo-colors.com !   Co-Inventeur de Appaloosa !   Co-Auteur de Robospice @jeromevdl +Jérôme Van Der Linden2 © OCTO 2012
  3. 3. Plan !  La plateforme Android !  Les bases du développement !  Outillage et écosystème !  Bonnes pratiques3 © OCTO 2012
  4. 4. Plan !  La plateforme Android !  Les bases du développement !  Outillage et écosystème !  Bonnes pratiques4 © OCTO 2012
  5. 5. 08/2005 11/2007 08/2008 10/2008 05/2009 09/2009 01/2010 Rachat SDK 1.0 SDK 1.5 1er SDK Startup OHA Market (utilisable) SDK 1.6 SDK 2.1 public v0.9 Android HTC G1 HTC G2 05/2010 12/2010 02/2011 10/2011 02/2012 07/2012 SDK 3.0 Market SDK 2.2 Push SDK 2.3 Tablettes SDK 4.0 devient SDK 4.1 ... only PlayStore5 © OCTO 2012
  6. 6. Quelques chiffres nombre dapplications sur Google Play Store6 © OCTO 2012
  7. 7. 7 © OCTO 2012
  8. 8. Java !   Sous ensemble de l’implémentation Apache Harmony !   JavaSE 5 !   Et aussi ... !   Junit (3.8) !   Apache commons logging et HttpComponents !   Parsers json et xml !   Mais ... !   Toutes les méthodes des classe Android sont stubés !   throw new RuntimeException("Stub"); !   Impossible d’exécuter / tester sans émulateur / device8 © OCTO 2012
  9. 9. DVM : Dalvik Virtual Machine code bytecode application .java .class .dex .apk javac dx apkbuilber !   Compilation JIT depuis Android 2.2 !   Pas de génération de bytcode au runtime !  runtime weaving KO !  mais compiletime OK !   Des tentatives de groovy, scala !   GC mark&sweep https://sites.google.com/site/io/dalvik-vm-internals 9 © OCTO 2012
  10. 10. Sécurité !   Système basé sur Linux !   users, groups, droits... : par défaut l’utilisateur n’est pas root !   Sandboxing !   Une VM par application !   Un user unique par application !   Un process unique par application !   Un espace dédié du filesystem par application !   Permissions !   Un ensemble de permissions pour accéder aux différents services !   Les permissions sont affichées avant l’installation de l’application !   Signature !   Les applications sont signées pour être publiées sur le store !   Communications !   Les applications ne peuvent communiquer entre elles sauf !   Par des Intents !   Si elles utilisent un filesystem commun (ex: SDCard) !   Si elles autorisent explicitement dans le manifest (ContentProviders, Services !   Si elles ont la même signature (partage du même user id)10 © OCTO 2012
  11. 11. Plan !  La plateforme Android !  Les bases du développement !  Outillage et écosystème !  Bonnes pratiques11 © OCTO 2012
  12. 12. Structure d’un projet Classes java Classes de mapping des ressources Android JAR d’Android Ressources « brutes » Ressources mappées par Android : - images (png, xml) -  animation (xml) -  écrans (xml) -  menus (xml) -  media (wav, aac, mp3, H.264, mpeg4, ogg) -  data : textes, styles couleurs, tableaux… (xml) Manifest de l’application12 © OCTO 2012
  13. 13. AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" Identification package="com.octo.android.askbob" android:versionCode="1" formelle de android:versionName="1.0" > l’application <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16" /> <uses-feature android:name="android.hardware.bluetooth" /> Contraintes tech de l’application <uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> Permissions de <application l’application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name=".activity.SplashScreenActivity" android:theme="@android:style/Theme.NoTitleBar" > Contenu de <intent-filter> l’application : <action android:name="android.intent.action.MAIN" /> Icône, Nom, <category android:name="android.intent.category.LAUNCHER" /> Activités, Services </intent-filter> </activity> <activity android:name=".activity.OctoDetailActivity" /> <service android:name="com.octo.android.askbob.network.AskBobJsonSpiceService" android:exported="false" /> </application> </manifest> 13 © OCTO 2012
  14. 14. Permissions !   130 permissions !   internet, gps, bluetooth, contacts, telephone, sms, camera, vibreur, état du réseau/wifi, accès a la SD...14 © OCTO 2012
  15. 15. Ressources public final class R { public static final class drawable { public static final int ic_dictionary=0x7f020000; public static final int ic_menu_search=0x7f020001; } public static final class layout { public static final int main=0x7f030000; public static final int result=0x7f030001; public static final int word=0x7f030002; } public static final class menu { public static final int options_menu=0x7f080000; } public static final class string { /** The name of the application. */ public static final int app_name=0x7f060000; /** The menu entry that invokes search. */ public static final int menu_search=0x7f060003; } public static final class id { public static final int list=0x7f090001; public static final int text=0x7f090000; } //... } R.javastrings.xml <TextView main.xml<resources> android:id="@+id/text" <!-- The name of the application. --> android:layout_width="fill_parent" <string name="app_name">Dictionary</string> android:layout_height="wrap_content" /> <ListView <!-- The menu entry that invokes search. --> android:id="@+id/list" <string name="menu_search">Search</string> android:layout_width="fill_parent" </resources> android:layout_height="0dp"> 15 © OCTO 2012
  16. 16. Utilisation des ressources public final class R { public static final class drawable { public static final int ic_dictionary=0x7f020000; public static final int ic_menu_search=0x7f020001; } public static final class layout { public static final int main=0x7f030000; !   Utilisable dans le code java public static final int result=0x7f030001; public static final int word=0x7f030002; !   getResources.getDrawable } public static final class menu { (R.drawable.ic_menu_search) public static final int options_menu=0x7f080000; } !   getResources.getString public static final class string { /** The name of the application. (R.string.menu_search) */ public static final int app_name=0x7f060000; /** The menu entry that invokes search. */ !   Et dans les xml } public static final int menu_search=0x7f060003; public static final class id { !   @drawable/ic_dictionnary public static final int list=0x7f090001; public static final int text=0x7f090000; !   @string/menu_search } //... !   @id/text } R.java16 © OCTO 2012
  17. 17. Layout !   Définit la structure visuelle de l’IHM, conteneur d’éléments graphiques !   Généralement défini en XML à la XUL <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/button" android:text="@string/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" /> </LinearLayout> !   Et récupérable depuis Java : Button button = (Button) findViewById(R.id.button); !   Ou instancié dynamiquement en java à la Swing !   Plus rare sauf pour vos propres composants SuperExtendedButton button = new SuperExtendedButton(context); button.setText(R.string.button1); layout.addView(button); 17 © OCTO 2012
  18. 18. MVC Contrôleur Activity, Fragment Modèle Vue POJO, DB Layout (XML)18 © OCTO 2012
  19. 19. MVC public class DetailActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_detail); TextView fullNameTextView = (TextView) findViewById(R.id.detail_fullname); } } activity_detail.xml DetailActivity.java <?xml version="1.0" encoding="utf-8"?> <ScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/detail_background" > <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" Contrôleur android:padding="5dp" > <TextView Activity, android:id="@+id/detail_fullname" style="@style/DetailTitle" android:layout_width="wrap_content" Fragment android:layout_height="wrap_content"/> <Button style="@style/DetailButton" Modèle Vue android:id="@+id/detail_mobile_button" android:layout_below="@id/detail_fullname" android:drawableLeft="@drawable/ic_menu_call" /> </RelativeLayout> POJO, DB Layout (XML) </ScrollView> 19 © OCTO 2012
  20. 20. Cycle de vie des activités!   onSaveInstanceState : !   backup des donnés de l’écran lors d’un changement de configuration (rotation de l’écran, reception d’un appel, ...)20 © OCTO 2012
  21. 21. Intents – Navigation entre Activités !   Résolution explicite !   Spécification d’un composant (class) Intent intent = new Intent(ActivityA.this, ActivityB.class); ActivityA startActivity(intent); ActivityB // OU startActivityForResult(intent, REQUEST_CODE); !   Passage de paramètres !   Types primitifs (boolean, int, double, ...) + String !   Serializable !   Parcelable intent.putExtra(String key, value); !   Réception des paramètres protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ActivityB getIntent().getStringExtra(key); getIntent().getParcelableExtra(key2); // ... } 21 © OCTO 2012
  22. 22. Parcelable public class User implements Parcelable { private String name; private int age; public int describeContents() { return 0; } public void writeToParcel(Parcel dest, int flags) { dest.writeString(name); dest.writeInt(age); } public User(Parcel userParcel) { name = userParcel.readString(); age = userParcel.readInt(); } public static final Parcelable.Creator<User> CREATOR = new Parcelable.Creator<User>() { public User createFromParcel(Parcel in) { return new User(in); } public User[] newArray(int size) { return new User[size]; } }; } 22 © OCTO 2012
  23. 23. Intents – Navigation dans le système !   Résolution implicite !   Via une action !   Exemple: partager du contenu Intent sharingIntent = new Intent(android.content.Intent.ACTION_SEND); sharingIntent.setType("text/plain"); sharingIntent.putExtra(android.content.Intent.EXTRA_SUBJECT, "Subject Here"); sharingIntent.putExtra(android.content.Intent.EXTRA_TEXT, "Content to share"); startActivity(Intent.createChooser(sharingIntent, "Share via")); !   Rendre son application réceptive à un Intent !   Via les intent-filter : action + category + data <activity android:name="ShareActivity" > <intent-filter> <action android:name="android.intent.action.SEND" /> <category android:name="android.intent.category.DEFAULT" /> <data android:mimeType="text/plain" /> <data android:mimeType="image/*" /> </intent-filter> </activity> 23 © OCTO 2012
  24. 24. Événements !   onClick !   Disponible depuis le SDK 1.6, auparavant, il fallait définir un OnClickListener... <Button layout activity android:id="@+id/button" public void onButtonClick(View v) { android:layout_width="wrap_content" // do something android:layout_height="wrap_content" } android:onClick="onButtonClick" /> !   Listeners !   OnClickListener textview.setOnKeyListener(new OnKeyListener() { !   OnFocusChangeListener @Override public boolean onKey(View v, int keyCode, KeyEvent event) !   OnKeyListener { // do something !   OnDragListener return false; } !   OnCheckedChangeListener }); !   OnMenuItemClickListener !   OnItemSelectedListener !   ...24 © OCTO 2012
  25. 25. LinearLayout !   Alignement Horizontal ou Vertical <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/ apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/button1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button1" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button1" /> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button1" /> </LinearLayout> 25 © OCTO 2012
  26. 26. RelativeLayout !   Positionnement relatif <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http:// schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/button1" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_below="@id/button1" android:layout_alignLeft="@id/button1" android:text="@string/button2" /> <Button android:id="@+id/button3" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@id/button2" android:layout_below="@id/button1" android:text="@string/button3" /> </RelativeLayout> 26 © OCTO 2012
  27. 27. TableLayout <?xml version="1.0" encoding="utf-8"?> <TableLayout xmlns:android="http:// schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" > <TableRow> <Button android:id="@+id/button1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/button1" /> <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button2" /> </TableRow> <TableRow> <Button android:id="@+id/button3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/button3" /> <Button android:id="@+id/button4" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/button3" /> </TableRow> </TableLayout> 27 © OCTO 2012
  28. 28. Conteneurs (!= layout) ListView TabView MapView WebView GridView ScrollView28 © OCTO 2012
  29. 29. Listes !   Listview <ListView android:id="@android:id/list" android:layout_width="fill_parent" android:layout_height="fill_parent" /> !   Utilisation d’Adapters pour populer la liste !   Idem pour les Gridview !   listview.setAdapter(myAdapter); !   BaseAdapter, ArrayAdapter, CursorAdapter public class MyAdapter extends BaseAdapter { public int getCount() {} // return cell number public Object getItem(int position) {} // return model object for the cell public long getItemId(int position) {} // return cell object id (position) public View getView(int position, View convertView, ViewGroup parent) { View cell = null; if (convertView == null) { // create view by inflating layout for the cell here } else { cell = convertView; // recycle an older cell } // set cell attributes here return cell; } } 29 © OCTO 2012
  30. 30. Composants graphiques Checkbox Button ProgressBar Radio Switch Spinner SeekBar Picker Dialog30 © OCTO 2012
  31. 31. Adoptez votre propre style !   Soit le champ texte suivant : <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" android:textColor="#00FF00" android:typeface="monospace" /> !   On peut extraire le style suivant : <resources> <style name="CodeFont" parent="@android:style/TextAppearance.Medium"> <item name="android:layout_width">fill_parent</item> <item name="android:layout_height">wrap_content</item> <item name="android:textColor">#00FF00</item> <item name="android:typeface">monospace</item> </style> </resources> !   Et réduire ainsi le champ texte à : <TextView style="@style/CodeFont" android:text="@string/hello" /> !   Mais surtout le rendre disponible à d’autres champs textes sans dupliquer des lignes et des lignes de propriétés31 © OCTO 2012
  32. 32. Héritage des styles !   Héritage d’un style système <style name="GreenText" parent="@android:style/TextAppearance"> <item name="android:textColor">#00FF00</item> </style> !   Héritage d’un style défini <style name="CodeFont.Red"> <item name="android:textColor">#FF0000</item> </style> <style name="CodeFont.Red.Big"> <item name="android:textSize">30dp</item> </style> !   Surcharge <style name="CodeFont.Red.Dark"> <item name="android:textColor">#FF6611</item> </style> 32 © OCTO 2012
  33. 33. Theme = ∑ styles !   Un thème est un ensemble de styles appliqués à toute l’application ou à une activité entière !   Définition dans le fichier AndroidManifest.xml <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@android:style/Theme.Holo.Light" > <activity android:name=".activity.SplashScreenActivity" android:theme="@android:style/Theme.NoTitleBar" /> !   Depuis Honeycomb, Thème Holo (inspiré du film Tron) !   basé sur la couleur bleu #33b5e5 !   Pensez à étendre le style Holo ou Holo.Light pour vos thèmes <style name="CustomTheme" parent="android:Theme.Holo.Light"> <item name="android:windowBackground">@color/custom_theme_color</item> <item name="android:colorBackground">@color/custom_theme_color</item> </style> 33 © OCTO 2012
  34. 34. Plan !  La plateforme Android !  Les bases du développement !  Outillage et écosystème !  Bonnes pratiques34 © OCTO 2012
  35. 35. Développement !   SDK Android !   Windows / Mac / Linux !   SDK Manager (« android ») !   Tools !   Platform-tools !   Sources35 © OCTO 2012
  36. 36. Eclipse + ADT !   Android Developer Tools (ADT) !   Création, compilation, debug, packaging !   Auto complétion dans le XML !   Editeur WYSIWYG !   DDMS, analyse des devices : !   thread, !   mémoire, !   filesystem, !   simulation d’appels, de SMS, de GPS, ... !   Logcat !   accès aux logs des devices36 © OCTO 2012
  37. 37. IntelliJ !   Support natif d’Android !   Même fonctionnalités que ADT !   Éditeur WYSIWYG depuis la v12 :37 © OCTO 2012
  38. 38. SDK Tools !   android !   Permet de télécharger les différentes versions du SDK (SDK Manager) !   Permet de créer des projets Android !   Permet de créer des images AVD (Android Virtual Device) !   emulator !   Emule les images AVD !   Permet de tester/debugger l’application !   adb (Android Debug Bridge) !   Permet d’installer des apk (Android PacKage) sur le device !   Permet de copier des fichiers sur le device !   Permet d’exécuter des commandes shell sur le device38 © OCTO 2012
  39. 39. SDK Tools !   Lint !   Analyse du code Android (~ PMD/Findbugs Android) !   Intégré à Eclipse et IntelliJ !   hierarchyviewer !   Permet de visualiser l’arbre des vues pour optimiser les perfs de l’UI !   draw9patch !   Permet de créer des png « extensibles » !   Fichier « .9.png » !   traceview !   Profiling d’une application en cours d’exécution39 © OCTO 2012
  40. 40. Librairies !   Roboguice: Google guice pour Android !   Injection de dépendances !   Injection de view... !   Spring Android !   RestTemplate pour faciliter les appels de services HTTP/REST !   Robospice !   Traitements réseaux asynchrones !   Mise en cache !   Ormlite !   ORM léger pour Sqlite40 © OCTO 2012
  41. 41. Librairies !   ActionBarSherlock !   Mise à disposition des ActionBar sur les Android < 3.0 !   HoloEverywhere !   Mise à disposition du thème Holo pour les Android < 3.0 !   Android Asset Studio & Android Holo Colors !   Création d’icônes, d’images (holo), de fichiers de styles, ... !   Et des dizaines d’autres disponibles sur !   http://www.theultimateandroidlibrary.com/ !   http://www.openintents.org/en/libraries !   http://www.androidviews.net/41 © OCTO 2012
  42. 42. Et mes librairies Java ? !   Spring ? !   Privilégier quelque chose de plus léger : Roboguice !   Hibernate ? !   Idem : Ormlite !   Guava ? !   Pourquoi pas, même si la lib est un peu lourde !   Utiliser proguard pour réduire la taille du binaire final !   Apache Commons ? !   Absolument, ne réinventez pas la roue ! !   Jackson !   OK, évitez de parser les json à la main  !   D’une manière générale !   Attention à la compatibilité avec le java d’Android !   Attention à la quantité et la taille des jars importés (dépendances transitives...) !   Vérifier qu’il n’y a pas un équivalent plus léger dédié à Android42 © OCTO 2012
  43. 43. Tests – Android !   Instrumentation Android !   Basé sur JUnit !   Test d’Activités, de Services Android, ... !   Manipulation du Context !   Exécution sur un AVD ou un device !   Très lent ! !   UIAutomator !   Disponible à partir du SDK 16 !   Manipulation de l’interface avec des selector (à la CSS) !   monkey & monkeyrunner !   Test du singe : événements aléatoires sur l’interface43 © OCTO 2012
  44. 44. Tests – Robotium !   Basé sur les tests d’instrumentation Android !   Aussi lent... !   Manipulation plus simple de l’interface !   Solo public class MaintTest extends ActivityInstrumentationTestCase2<MainActivity> { private Solo solo; @Override protected void setUp() throws Exception { super.setUp(); solo = new Solo(getInstrumentation(), getActivity()); } public void testSendBob() { EditText FirsteditText = (EditText) solo.getView(R.id.edittext_name); solo.enterText(FirsteditText, "Bob"); solo.clickOnButton("Send"); assertTrue(solo.searchText("Hello Bob")); } 44 © OCTO 2012
  45. 45. Tests – Robolectric !   Fonctionne sur une JVM standard !   Pas besoin de device ou d’émulateur pour exécuter les tests !   Remplace les RuntimeException(stub) par des « Shadow Objects »  Beaucoup plus rapide @RunWith(RobolectricTestRunner.class) public class MyActivityTest { private Activity activity; private Button pressMeButton; private TextView results; @Before public void setUp() throws Exception { activity = new MyActivity(); activity.onCreate(null); pressMeButton = (Button) activity.findViewById(R.id.press_me_button); results = (TextView) activity.findViewById(R.id.results_text_view); } @Test public void shouldUpdateResultsWhenButtonIsClicked() throws Exception { pressMeButton.performClick(); String resultsText = results.getText().toString(); assertThat(resultsText, equalTo("Testing Android Rocks!")); } } 45 © OCTO 2012
  46. 46. Mocks !   Possibilité de faire du mock comme en Java !   Attention à Dalvik : Tous les frameworks ne sont pas compatibles !   Mockito !   Android Mock !   Easymock pas (encore) disponible !   En cours d’adaptation !   Android fournit également des classes de mock pour le contexte, les ressources, les contentprovider, ...46 © OCTO 2012
  47. 47. Build – Ant !   Ant est l’outil de build initialement proposé par Google pour les projets Android !   build.xml automatiquement généré à la création d’un projet en ligne de commande (android create project ...) !   build.xml importe le build.xml fourni dans ${sdk.dir}/tools/ant/ !   Sauf besoins supplémentaires, il n’est pas nécessaire de définir des tâches de build !   Par défaut, couvre les besoins de compilation, packaging (release), déploiements sur un device/émulateur, test, coverage (emma) !   Est amené à disparaître...http://developer.android.com/tools/building/building-cmdline.html 47 © OCTO 2012
  48. 48. Build – Maven !   android-maven-plugin <plugin> <groupId>com.jayway.maven.plugins.android.generation2</groupId> <artifactId>android-maven-plugin</artifactId> <version>3.5</version> </plugin> !   compile, package, test, deploie, execute, start/stop l’émulateur, obfusque, release, ... !   android.jar sur central depuis juin 2010 !   Ca n’a pas toujours été si simple...  : mosabua !   De nombreux jar de librairies également sur central !   Ca n’a pas toujours été si simple...  : mvn install:installl-file !   Intégration dans Eclipse avec m2eclipse (+ android connector) !   Ca n’a pas toujours été si simple...  : m2eclipse-android-plugin !   Intégration native dans IntelliJ http://code.google.com/p/maven-android-plugin/ 48 © OCTO 2012
  49. 49. Build – Gradle !   Gradle est le futur outil de build préconisé par Google, en remplacement de Ant !   Actuellement en version 0.1, pas stable et surtout pas accessible au commun des mortels (SDK previews) !   Un projet plus mature existe en attendant... !   https://github.com/jvoegele/gradle-android-pluginhttp://tools.android.com/tech-docs/new-build-system/using-the-new-build-system 49 © OCTO 2012
  50. 50. Intégration continue Privilégier le plugin maven au plugin jenkins pour démarrer un émulateur50 © OCTO 2012
  51. 51. Plan !  La plateforme Android !  Les bases du développement !  Outillage et écosystème !  Bonnes pratiques51 © OCTO 2012
  52. 52. Supporter la fragmentation http://developer.android.com/about/dashboards 29/12/2012 Versions du SDK Résolutions & densités d’écrans 52 © OCTO 2012
  53. 53. Gestions des différentes versions du SDK !  Oublier les versions < 2.2 !   3 % du parc... tanpis pour eux  !  Attention quand vous développez avec une version récente du SDK ! 97% !   Code non dispo dans les SDK antérieurs  Lint saura vous le rappeler !   Si besoin utiliser @TargetApi(API)! !   Et vérifier la valeur de android.os.Build.VERSION.SDK_INT! !  Utiliser la librairie de support !   android-support.jar !   Backport des fonctionnalités 3+ pour les versions >= 1.6 !   Fragments !   ViewPager !   Notifications !   ...53 © OCTO 2012
  54. 54. Gestion des résolutions et densités !   Des dizaines de résolutions différentes !   320x240, 400x240, 640x240, 640x360, 480x320, 800x480, 854x480, 800x600, 960x540, 960x640, 1280x800, 1366x768… 3 4 6 8 !  Densité (dp) !   Unité de mesure indépendante des pixels !   1 dp = 1 pixel en mdpi !   px = dp * (dpi / 160) !   Utiliser les dp et sp, pas les px ! !   Oublier les small et ldpi 97% !   3% du parc !   La tendance est aux grands écrans54 © OCTO 2012
  55. 55. Gestion des résolutions et densités !   Limiter l’utilisation de dimension fixes !   Privilégier wrap_content, fill_parent/match_parent !   Utiliser layout_weight, !   Pourcentage sur l’écran !   Utiliser les RelativeLayout !   Utiliser les images xml et les 9 patch (.9.png) !   images extensibles <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" > <gradient android:angle="270" android:centerY="0.4" android:endColor="@color/dark_blue" android:startColor="@color/blue" android:centerColor="@color/light_blue" /> <stroke android:width="1dp" android:color="@color/border_grey" /> <corners android:radius="6dp" /> <padding android:bottom="10dp" android:left="12dp" android:right="12dp" android:top="10dp" /> </shape> 55 © OCTO 2012
  56. 56. Gestion de la diversité !   Beaucoup de ressources... !   Il existe 18 types de qualifier : ne pas tout combiner ! !   Ex : application Contacts Android ressources utiles traductions56 © OCTO 2012
  57. 57. Pensez aux tablettes !   Une tablette n’est pas nécessairement xlarge !   Il existe des tablettes 7’ large  utiliser sw580dp à la place !   Adoptez les fragments !   Découpage de l’UI en « Fragments » !   Mutualisation des layouts entre smartphone et tablette57 © OCTO 2012
  58. 58. Fragments !   Les fragments deviennent les contrôleurs !   L’activité gère la communication entre fragments !   transactions : ajout, suppression, remplacement de fragment !  activity.xml : <fragment android:name="path.to.source.Fragment" android:id="@+id/fragment_main_list" Fragment! Fragment.java! android:layout_width="fill_parent" Activity.java ! android:layout_height="fill_parent" /> !  Fragment.java : public View onCreateView(Inflater inflater, View container, Bundle bundle) { return inflater.inflate(R.layout.fragment, container, false); } layout/ layout/ activity.xml ! fragment.xml !58 © OCTO 2012
  59. 59. User Experience – ActionBar!   Disponible à partir du SDK 3 !   Utiliser ActionBarSherlock pour les versions antérieures!   Mixe automatique actionbar + menu contextuel sur les smartphones59 © OCTO 2012
  60. 60. User Experience – Ne bloquez pas l’UI !   Éviter d’instancier des objets dans les méthodes appelées des dizaines de fois par seconde (ex : onTouch, onScroll, onDraw...) !   Ne jamais faire de traitement long dans le thread UI !   Appels de webservices, requête complexe en bdd, decodage de bitmap, ... !   Utiliser des mécanismes pour faire des traitements asynchrones !   AsyncTask & AsyncTaskLoader !   Services !   Librairie Robospice (basée sur les services)60 © OCTO 2012
  61. 61. User Experience – Think Android !AndroidiOSWP7 !   Pas de bouton back !   Bouton physique ou dans l’ActionBar !   Pas d’indicateurs sur les lignes de liste !   Simplement rien  !   Les onglets (Tab) sont en haut de l’écran !   Les icones des applications sont différentes (pas de halo, de carré arrondi) !   ... 61 © OCTO 2012
  62. 62. Ressources !   http://developer.android.com/index.html !   Site de référence : très complet !   http://android-developers.blogspot.fr/ !   Blog officiel Google Android : annonces et bons articles !   http://www.androiduipatterns.com/ !   Blog sur les patterns UI et UX !   http://androiddevweekly.com/ !   Toutes les semaines, des articles, des libs, des exemples, des tutos... !  http://android.cyrilmottier.com/ !   Blog de Cyril Mottier, un expert Android reconnu !   Twitter : #android #androiddev !   Google+ : +AndroidDevelopers62 © OCTO 2012
  63. 63. Questions63 © OCTO 2012

×