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.

Avatar for Ione Souza Junior

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/