Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Entendendo e otimizando o build do Android com ...

Entendendo e otimizando o build do Android com D8, R8 e AAPT2

Palestra realizada no Xamarin Summit 2019.

Ione Souza Junior

October 06, 2019
Tweet

More Decks by Ione Souza Junior

Other Decks in Technology

Transcript

  1. Sobre o que vamos falar? → Entender como um projeto

    Xamarin Android é compilado → O que são e o que fazem as principais ferramentas do Android
  2. Sobre o que vamos falar? → Entender como um projeto

    Xamarin Android é compilado → O que são e o que fazem as principais ferramentas do Android → Melhores configurações para otimizar o build
  3. Como é a compilação de um projeto Xamarin Android? Isso

    vale para projetos da abordagem traditional e forms
  4. Mas o que é IL? → É uma Linguagem Intermediária

    → .NET Runtime converte a IL em código assembly
  5. O que é o linker? → Remove código C# não

    utilizado no seu app → É possível configurar as exceções para não serem removidas - linker.xml
  6. O que é o AAPT? → Android Asset Packaging Tool,

    prazer → É o "Severino" do Android
  7. O que é o AAPT? → Android Asset Packaging Tool,

    prazer → É o "Severino" do Android → Mapeia todos os resources em um arquivo
  8. O que é o AAPT? → Android Asset Packaging Tool,

    prazer → É o "Severino" do Android → Mapeia todos os resources em um arquivo → Manipula o conteúdo que vai ter no APK
  9. O que é o DX? E o DEX? → DX

    é uma ferramenta para gerar o DEX
  10. O que é o DX? E o DEX? → DX

    é uma ferramenta para gerar o DEX → O DEX é um arquivo do tipo Dalvik EXecutable
  11. O que é o DX? E o DEX? → DX

    é uma ferramenta para gerar o DEX → O DEX é um arquivo do tipo Dalvik EXecutable → DEX é o bytecode usado pela virtual machine para rodar o app - UÉ... bytecode?
  12. O que é o DX? E o DEX? → DX

    é uma ferramenta para gerar o DEX → O DEX é um arquivo do tipo Dalvik EXecutable → DEX é o bytecode usado pela virtual machine para rodar o app - UÉ... bytecode? → Android não usa a JVM, tem a sua própria VM
  13. O que é o DX? E o DEX? → DX

    é uma ferramenta para gerar o DEX → O DEX é um arquivo do tipo Dalvik EXecutable → DEX é o bytecode usado pela virtual machine para rodar o app - UÉ... bytecode? → Android não usa a JVM, tem a sua própria VM → Dalvik (DVM) e Android Runtime (ART) são as VMs do Android e usam o DEX
  14. Dalvik (DVM) e Android Runtime (ART) → DVM e ART

    são VM's específicas para o Android
  15. Dalvik (DVM) e Android Runtime (ART) → DVM e ART

    são VM's específicas para o Android → São otimizadas em relação à JVM
  16. Dalvik (DVM) e Android Runtime (ART) → DVM e ART

    são VM's específicas para o Android → São otimizadas em relação à JVM → Dalvik é JIT (Just-In-Time)
  17. Dalvik (DVM) e Android Runtime (ART) → DVM e ART

    são VM's específicas para o Android → São otimizadas em relação à JVM → Dalvik é JIT (Just-In-Time) → Android Runtime é AOT (Ahead-Of-Time)
  18. O que é JIT e AOT? → Temos o DEX,

    mas para executar o app, código de máquina é necessário
  19. O que é JIT e AOT? → Temos o DEX,

    mas para executar o app, código de máquina é necessário → JIT - A Dalvik transforma o DEX em código de máquina em tempo de execução do app
  20. O que é JIT e AOT? → Temos o DEX,

    mas para executar o app, código de máquina é necessário → JIT - A Dalvik transforma o DEX em código de máquina em tempo de execução do app → AOT - O Android Runtime transforma o DEX em código de máquina em tempo de compilação do app
  21. Como o DEX é gerado? → O build do Xamarin

    Android gera o código Java (.java)
  22. Como o DEX é gerado? → O build do Xamarin

    Android gera o código Java (.java) → O código Java é compilado e gera o Java bytecode (.class)
  23. Como o DEX é gerado? → O build do Xamarin

    Android gera o código Java (.java) → O código Java é compilado e gera o Java bytecode (.class) → O Java bytecode é convertido para Dalvik bytecode (.dex)
  24. O que é o Multidex? → O DEX tem um

    limite de métodos → Caso este limite seja excedido, vários arquivos DEX precisam ser criados = Multi-DEX
  25. O que é o Proguard? → Similar ao Linker, só

    que com código Java → Remove código Java não utilizado
  26. O que é o Proguard? → Similar ao Linker, só

    que com código Java → Remove código Java não utilizado → Diminui o tamanho do DEX
  27. O que é o Proguard? → Similar ao Linker, só

    que com código Java → Remove código Java não utilizado → Diminui o tamanho do DEX → Ajuda a evitar o Multidex
  28. D8

  29. D8

  30. D8 → Sucessor do DX → Gera o DEX de

    forma mais otimizada: tamanho menor e operação mais rápida
  31. D8 → Sucessor do DX → Gera o DEX de

    forma mais otimizada: tamanho menor e operação mais rápida → Foi "motivado" pelo principal "mal" do Android: A retrocompatibilidade - suporte ao Java 8
  32. R8

  33. R8

  34. R8 → Sucessor do Proguard → Também gera o DEX

    (faz o mesmo que o D8) → Faz tudo isso no mesmo processo
  35. R8 → Sucessor do Proguard → Também gera o DEX

    (faz o mesmo que o D8) → Faz tudo isso no mesmo processo → Continua usando proguard.cfg para mapear exceções
  36. AAPT2 → Sucessor do AAPT → Divide a geração do

    artefato em duas etapas: compilação e link
  37. AAPT2 → Sucessor do AAPT → Divide a geração do

    artefato em duas etapas: compilação e link → Compila os resources separadamente (telas, imagens, classes...)
  38. AAPT2 → Sucessor do AAPT → Divide a geração do

    artefato em duas etapas: compilação e link → Compila os resources separadamente (telas, imagens, classes...) → Junta tudo para gerar o APK
  39. AAPT2 → Sucessor do AAPT → Divide a geração do

    artefato em duas etapas: compilação e link → Compila os resources separadamente (telas, imagens, classes...) → Junta tudo para gerar o APK → Melhor experiência em builds incrementais
  40. Problemas encontrados - R8 → Configuração do proguard.cfg precisou ser

    feita, não utilizáva-mos antes ! → org.apache.http.legacy.jar foi removido do android.jar no Android >= 6
  41. Problemas encontrados - R8 → Configuração do proguard.cfg precisou ser

    feita, não utilizáva-mos antes ! → org.apache.http.legacy.jar foi removido do android.jar no Android >= 6 → Também tivemos problemas com o okhttp-3.14.2.jar
  42. Problemas encontrados - R8 → Configuração do proguard.cfg precisou ser

    feita, não utilizáva-mos antes ! → org.apache.http.legacy.jar foi removido do android.jar no Android >= 6 → Também tivemos problemas com o okhttp-3.14.2.jar → A "promessa" é que a questão do org.apache.http.legacy.jar seja resolvida em releases futuras do Visual Studio
  43. Problemas encontrados - R8 → Configuração do proguard.cfg precisou ser

    feita, não utilizáva-mos antes ! → org.apache.http.legacy.jar foi removido do android.jar no Android >= 6 → Também tivemos problemas com o okhttp-3.14.2.jar → A "promessa" é que a questão do org.apache.http.legacy.jar seja resolvida em releases futuras do Visual Studio → Link do issue: https://github.com/xamarin/xamarin-android/pull/2736
  44. Problemas encontrados - R8 → Configuração do proguard.cfg precisou ser

    feita, não utilizáva-mos antes ! → org.apache.http.legacy.jar foi removido do android.jar no Android >= 6 → Também tivemos problemas com o okhttp-3.14.2.jar → A "promessa" é que a questão do org.apache.http.legacy.jar seja resolvida em releases futuras do Visual Studio → Link do issue: https://github.com/xamarin/xamarin-android/pull/2736 → Link da solução https://github.com/xamarin/xamarin-android/issues/ 2670
  45. Problemas encontrados - AAPT2 → Configurar --no-version-vectors - problemas com

    Android 4 → Link do issue: https://github.com/xamarin/xamarin-android/ issues/3314 (PARECE que já tem uma solução )
  46. Problemas encontrados - AAPT2 → Configurar --no-version-vectors - problemas com

    Android 4 → Link do issue: https://github.com/xamarin/xamarin-android/ issues/3314 (PARECE que já tem uma solução ) → ⚠ Tínhamos dois projetos Android: um com código C# e outro com telas e imagens
  47. Problemas encontrados - AAPT2 → Configurar --no-version-vectors - problemas com

    Android 4 → Link do issue: https://github.com/xamarin/xamarin-android/ issues/3314 (PARECE que já tem uma solução ) → ⚠ Tínhamos dois projetos Android: um com código C# e outro com telas e imagens → ❌ AAPT2 compila separadamente cada resource e depois junta tudo - isso deu problema
  48. Problemas encontrados - AAPT2 → Configurar --no-version-vectors - problemas com

    Android 4 → Link do issue: https://github.com/xamarin/xamarin-android/ issues/3314 (PARECE que já tem uma solução ) → ⚠ Tínhamos dois projetos Android: um com código C# e outro com telas e imagens → ❌ AAPT2 compila separadamente cada resource e depois junta tudo - isso deu problema → ✅ Unificamos novamente os projetos Android e tudo certo
  49. Isso nos proporcionou mais produtividade E fez a gente mudar

    a maneira como medíamos performance...
  50. Recomendações para Debug e Release Debug Release Shared runtime ✅

    ❌ D8 ✅ ✅ R8 ❌ ✅ Linker ❌ ✅ AOT ❌ ✅ AAPT2 ✅ ✅ Multidex ✅ ⚠ ProduceReferenceAssembly = true ✅ ✅
  51. Referências → 2 IL - https://www.dotnetperls.com/il → The Dex File

    Format - https://www.bugsnag.com/blog/dex-and-d8 → From Code to Dex: A Compilation Story - https://medium.com/upday-devs/from-code-to- dex-a-compilation-story-e1d62f63ad6a → Xamarin Developer Summit talk - https://www.youtube.com/watch? v=ZxKNGW8Br0M&list=PLM75ZaNQSFYkolOLIcZFi3eSORFZxHx&index=3&t=0s → DVM vs ART - https://android.jlelse.eu/closer-look-at-android-runtime-dvm-vs- art-1dc5240c3924 → Difference between DVM and ART - https://stackoverflow.com/questions/31957568/what- is-difference-between-dvm-and-art-why-dvm-has-been-officially-replaced-wi → What are "sugar", "desugar" terms in context of Java 8? - https://stackoverflow.com/ questions/22060894/what-are-sugar-desugar-terms-in-context-of-java-8 → A deep dive into Android’s D8 dexer and R8 shrinker with Xamarin - https:// medium.com/@hakimgulamali88/a-deep-dive-into-androids-d8-dexer-and-r8-shrinker- with-xamarin-ca66e00b1c8d → Next-generation Dex Compiler Now in Preview - https://android- developers.googleblog.com/2017/08/next-generation-dex-compiler-now-in.html → Android Callable Wrappers for Xamarin.Android - https://docs.microsoft.com/pt-br/ xamarin/android/platform/java-integration/android-callable-wrappers → Building Android Application Bundles (APKs) by Hand - https://spin.atomicobject.com/ 2011/08/22/building-android-application-bundles-apks-by-hand/ → Android’s D8 dexer and R8 shrinker - https://devblogs.microsoft.com/xamarin/androids- d8-dexer-and-r8-shrinker/ → Android's Java 8 Support - https://jakewharton.com/androids-java-8-support/ → How Xamarin.Android AOT works - https://xamarinhelp.com/xamarin-android-aot-works/