Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Android ou l'ART d'optimiser le bytecode Java

306 views

Published on

Connaissez vous les optimisations réalisées par Android pour exécuter efficacement le byte code Java?
Du build jusqu'à l'exécution, voici une introduction à l'exécution du bytecode sur les plateformes Android.

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

Android ou l'ART d'optimiser le bytecode Java

  1. 1. Android ou l’ART d’optimiser le bytecode Java Adrien Grassein Smile ECS 23 avril 2018 1 / 56
  2. 2. Plan 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 2 / 56
  3. 3. 1 - Présentation 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 3 / 56
  4. 4. 1 - Présentation Adrien Grassein Expert Technique Smile ECS 7 ans d’expérience sur Android : Parrot -> Automobile / Drone (Android 1.x 2.x 4.x et 5.x) ; Redbend (Harman/Samsung) -> Virtualisation d’Android (Android 5.x 6.x et 7.x) ; Smile -> Automobile / Médical / Bancaire / Robotique (Android 6.x 7.x et 8.x). 4 / 56
  5. 5. 1 - Présentation ESN Spécialisée dans l’Open Source ; BU ECS : Issue du rachat d’OpenWide par Smile ; Spécialisée dans les systèmes embarqués ; Effectifs : 1200 au total (dont 80 dans la BU) ; Des agences en France et en Europe (4 agences en France pour la BU) ; Publication régulière de livres blancs ; Egalement organisme de formation. 5 / 56
  6. 6. 2 - Introduction 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 6 / 56
  7. 7. 2 - Introduction Pourquoi cette conf ? Java est un langage qui a mauvaise réputation ; C’est le langage par défaut pour les applications sous Android ; Journal sur Linuxfr sur l’optimisation en J2ME (lien) 7 / 56
  8. 8. 2 - Introduction But de la conf : Comprendre le but des outils que vous utilisez ; Comprendre l’esprit de la JVM Android ; Montrer comment Android optimise notre code sans qu’on ait à le retoucher. 8 / 56
  9. 9. 2 - Introduction Application de "bench" utilisée pour la conf : Calcule le temps mit pour calculer une chaine aléatoire de 100 caractères ; Le calcul est fait dans un Thread ; Le nombre de calcul est un paramètre utilisateur pour éviter les optimisations à la compilation. 9 / 56
  10. 10. 2 - Introduction Java pour Android, qu’est-ce que ça implique ? Utilisation d’une JVM sur un système embarqué ; Android est multi-application, plusieurs VM fonctionneront en parallèle. 10 / 56
  11. 11. 3 - Build 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 11 / 56
  12. 12. 3 - Build - Enjeux 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 12 / 56
  13. 13. 3 - Build - Enjeux Comment sera utilisé le produit du build ? Le binaire sera téléchargé puis stocké en flash ; Il sera chargé en RAM lors du lancement de l’application ; Le code sera ensuite interprété. 13 / 56
  14. 14. 3 - Build - Enjeux Objectif : Réduire la taille du bytecode : Téléchargement rapide et coût minimal pour l’utilisateur ; Empreinte RAM et stockage réduite ; Chargement plus rapide de l’application ; 14 / 56
  15. 15. 3 - Build - Enjeux Objectif : Générer du bytecode optimisé : Des applications plus fluides ; Augmentation de la durée de vie de la batterie. 15 / 56
  16. 16. 3 - Build - Format du binaire 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 16 / 56
  17. 17. 3 - Build - Format du binaire Solution : Changer le format du binaire Introduction du format DEX (Dalvik EXecutable) 17 / 56
  18. 18. 3 - Build - Format du binaire JAR vs DEX 18 / 56
  19. 19. 3 - Build - Format du binaire Agrégation des fichiers .class dans une seule structure ; Retrait des doublons dans le constant pool ; Optimisation de l’encodage des chaines de caractères (MUTF-8) ; Optimisation de l’encodage des indexes (LEB128). 19 / 56
  20. 20. 3 - Build - Format du binaire Optimisation du bytecode : JVM Oracle : Implémentation à Stack Les opérandes sont pushées dans une stack ; Les instructions pullent les opérandes dans la stack ; Le résultat est pushé dans la stack. JVM Android : Implémentation à Registre Les opérandes sont chargées dans des registres ; Les instructions travaillent avec les registres ; Le résultat est mis dans un registre. 20 / 56
  21. 21. 3 - Build - Format du binaire Avantages : La JVM Android peut enchaîner les opérations sur les variables ; Nécessite moins de lectures / écritures ; Nécessite moins d’instructions ; Résultat : Réduction de la taille des binaires et optimisation du bytecode. Outil : dx, d8 ou Jack. 21 / 56
  22. 22. 3 - Build - Minification - Optimisation 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 22 / 56
  23. 23. 3 - Build - Minification - Optimisation Solution : Passer du temps offline pour optimiser le bytecode Suppression du code non utilisé ; Optimisation du bytecode via diverses techniques ; Minification du code restant (obfuscation). Résultat : Réduction de la taille des binaires (50% de gain sur le bench) et optimisation du bytecode. Outil : Analyseur de code (Proguard / r8) 23 / 56
  24. 24. 3 - Build - Minification - Optimisation Workflow de build d’un fichier dex. 24 / 56
  25. 25. 3 - Build - Conclusion 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 25 / 56
  26. 26. 3 - Build - Conclusion Google réutilise des outils déjà éprouvés ; Les outils ont été pensés dès le départ pour l’optimisation ; Ils continuent d’évoluer (d8, r8). 26 / 56
  27. 27. 4 - Runtime 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 27 / 56
  28. 28. 4 - Runtime - Enjeux 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 28 / 56
  29. 29. 4 - Runtime - Enjeux Quels sont les enjeux ? : La grande majorité des applications Android reposent sur du bytecode Java ; La plupart des devices Android fonctionnent avec une batterie ; Tous les appareils ne sont pas équipés d’un SoC ultra puissant. 29 / 56
  30. 30. 4 - Runtime - Enjeux Objectif : Exécuter le mieux possible le code de l’application ; Applications plus réactives même sur d’anciens SoC ; Meilleure longévité de la batterie. 30 / 56
  31. 31. 4 - Runtime - Exécution du bytecode 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 31 / 56
  32. 32. 4 - Runtime - Exécution du bytecode Solution : Optimiser la phase d’interprétation Plusieurs techniques d’interprétation ; Evolution à travers le temps. 32 / 56
  33. 33. 4 - Runtime - Exécution du bytecode - Interprétation 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 33 / 56
  34. 34. 4 - Runtime - Exécution du bytecode - Interprétation But : Transformer le bytecode en code natif à la volée. 34 / 56
  35. 35. 4 - Runtime - Exécution du bytecode - Interprétation Avantage : Simple à implémenter ; Inconvénients : Opération lente ; Sollicite fortement le CPU (conversion et exécution). 35 / 56
  36. 36. 4 - Runtime - Exécution du bytecode - Just In Time 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 36 / 56
  37. 37. 4 - Runtime - Exécution du bytecode - Just In Time But : Compiler en code natif certaines fonctions. Principe : Un profilage a lieu pendant l’exécution de l’application ; Les méthodes choisies par un algorithme sont compilées en code natif ; Le code ainsi obtenu remplace le bytecode pour les prochains appels. Introduit sur Android 2.2 37 / 56
  38. 38. 4 - Runtime - Exécution du bytecode - Just In Time Schéma du JIT : 38 / 56
  39. 39. 4 - Runtime - Exécution du bytecode - Just In Time 39 / 56
  40. 40. 4 - Runtime - Exécution du bytecode - Just In Time Avantages : Les fonctions souvent appelées ou lourdes sont optimisées ; Le code est globalement plus rapide à exécuter (x5 dans l’exemple précédent) 40 / 56
  41. 41. 4 - Runtime - Exécution du bytecode - Just In Time Inconvénients : La compilation se fait pendant l’exécution du code ; Les optimisations ne sont pas persistantes. 41 / 56
  42. 42. 4 - Runtime - Exécution du bytecode - Ahead Of Time 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 42 / 56
  43. 43. 4 - Runtime - Exécution du bytecode - Ahead Of Time But : Compiler en code natif tout le binaire avant exécution. Principe : Un compilateur semblable au JIT recompile toutes les méthodes du binaire ; La version native (ELF) sert lors de l’exécution de l’application. Introduit sur Android 5 avec ART. 43 / 56
  44. 44. 4 - Runtime - Exécution du bytecode - Ahead Of Time 44 / 56
  45. 45. 4 - Runtime - Exécution du bytecode - Ahead Of Time 45 / 56
  46. 46. 4 - Runtime - Exécution du bytecode - Ahead Of Time Avantages : Tout le code est optimisé ; Pas besoin de profiling. 46 / 56
  47. 47. 4 - Runtime - Exécution du bytecode - Ahead Of Time Inconvénients : La compilation se fait à l’installation de l’application ; Perte de place, a-t-on besoin de garder l’optimisation de toutes les méthodes ? (9555 méthodes optimisées dans le bench) 47 / 56
  48. 48. 4 - Runtime - Exécution du bytecode - Mixed Mode 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 48 / 56
  49. 49. 4 - Runtime - Exécution du bytecode - Mixed Mode But : Gérer au mieux l’optimisation Principe : Le JIT opère normalement pendant l’exécution du programme ; Le profilage JIT est conservé en flash ; Régulièrement, quand l’appareil est en charge le compilateur AOT est appelé ; Le compilateur AOT ne compile que les méthodes nécessaires. Introduit sur Android 7.0 49 / 56
  50. 50. 4 - Runtime - Exécution du bytecode - Mixed Mode Avantages : Les fonctions utiles sont optimisées ; L’AOT se fait quand l’appareil est en charge ; L’espace de stockage est optimisé. 50 / 56
  51. 51. 4 - Runtime - Exécution du bytecode - Mixed Mode Inconvénients : L’optimisation se fait au fur et à mesure. 51 / 56
  52. 52. 4 - Runtime - Exécution du bytecode - Mixed Mode Et les mises à jour ? ART détectera le nouveau code ; Les données d’optimisations pour les méthodes changées ne seront pas utilisées ; Conclusion : Organisez votre code dans des méthodes logiques ! 52 / 56
  53. 53. 5 - Conclusion 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 53 / 56
  54. 54. 5 - Conclusion Android a fait le choix de Java, un langage interprété ; Ils ont tout mis en oeuvre dès le départ pour limiter l’impact sur les performances ; Ils continuent d’améliorer leurs techniques d’optimisation. 54 / 56
  55. 55. 6 - Questions 1 Présentation 2 Introduction 3 Build Enjeux Format du binaire Minification - Optimisation Conclusion 4 Runtime Enjeux Exécution du bytecode Interprétation Just In Time Ahead Of Time Mixed Mode 5 Conclusion 6 Questions 55 / 56
  56. 56. 6 - Questions Questions ? 56 / 56

×