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

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

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

Palestra realizada no Xamarin Summit 2019.

790726f5b5613d61926dea2e2efd4da1?s=128

Ione Souza Junior

October 06, 2019
Tweet

Transcript

  1. Entendendo e otimizando o build do Android com D8, R8

    e AAPT2
  2. Whois ⠀Ione Souza Junior ⠀Mobile Developer @ ⠀❤ Xamarin !

    ⠀Um bom Xamaritano " ⠀ ionixjunior
  3. ! Agora também sou "Youtuber" ionixjunior Ione Souza Junior

  4. Temos vagas! careers.mercos.com

  5. Sobre o que vamos falar?

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

    Xamarin Android é compilado
  7. 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
  8. 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
  9. Falar sobre compilação do Android não é algo muito simples...

  10. Como é a compilação de um projeto Xamarin Android? Isso

    vale para projetos da abordagem traditional e forms
  11. São 2 "pequenos" passos 1 - Compilação do C# 2

    - Compilação do Android
  12. Passo 1 Compilar o C#

  13. O compilador compila o código C# e gera uma IL

  14. Mas o que é IL?

  15. Mas o que é IL?

  16. Mas o que é IL? → É uma Linguagem Intermediária

  17. Mas o que é IL? → É uma Linguagem Intermediária

    → .NET Runtime converte a IL em código assembly
  18. O linker poder ser utilizado na compilação

  19. O que é o linker?

  20. O que é o linker?

  21. O que é o linker? → Remove código C# não

    utilizado no seu app
  22. 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
  23. Passo 2 Compilar o Android

  24. O AAPT inicia o mapeamento dos resources Todos os resources

    do projeto são mapeados
  25. O que é o AAPT?

  26. O que é o AAPT?

  27. O que é o AAPT? → Android Asset Packaging Tool,

    prazer
  28. O que é o AAPT? → Android Asset Packaging Tool,

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

    prazer → É o "Severino" do Android → Mapeia todos os resources em um arquivo
  30. 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
  31. Depois o DX gera o DEX

  32. O que é o DX? E o DEX?

  33. O que é o DX? E o DEX?

  34. O que é o DX? E o DEX? → DX

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

    é uma ferramenta para gerar o DEX → O DEX é um arquivo do tipo Dalvik EXecutable
  36. 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?
  37. 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
  38. 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
  39. JVM vs Dalvik

  40. Dalvik (DVM) e Android Runtime (ART)?

  41. Dalvik (DVM) e Android Runtime (ART)

  42. Dalvik (DVM) e Android Runtime (ART) → DVM e ART

    são VM's específicas para o Android
  43. 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
  44. 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)
  45. 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)
  46. O que é JIT e AOT?

  47. O que é JIT e AOT?

  48. O que é JIT e AOT? → Temos o DEX,

    mas para executar o app, código de máquina é necessário
  49. 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
  50. 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
  51. Dalvik vs ART

  52. Como o DEX é gerado?

  53. Como o DEX é gerado?

  54. Como o DEX é gerado? → O build do Xamarin

    Android gera o código Java (.java)
  55. 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)
  56. 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)
  57. Ainda sobre a compilação do Android Multidex e Proguard podem

    entrar em ação
  58. O que é o Multidex?

  59. O que é o Multidex?

  60. O que é o Multidex? → O DEX tem um

    limite de métodos
  61. 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
  62. O que é o Proguard?

  63. O que é o Proguard?

  64. O que é o Proguard? → Similar ao Linker, só

    que com código Java
  65. O que é o Proguard? → Similar ao Linker, só

    que com código Java → Remove código Java não utilizado
  66. 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
  67. 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
  68. None
  69. None
  70. Agora acho que estamos mais preparados para falar sobre as

    "novas" ferramentas
  71. D8

  72. D8

  73. D8 → Sucessor do DX

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

    forma mais otimizada: tamanho menor e operação mais rápida
  75. 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
  76. R8

  77. R8

  78. R8 → Sucessor do Proguard

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

    (faz o mesmo que o D8)
  80. R8 → Sucessor do Proguard → Também gera o DEX

    (faz o mesmo que o D8) → Faz tudo isso no mesmo processo
  81. 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
  82. AAPT2

  83. AAPT2

  84. AAPT2 → Sucessor do AAPT

  85. AAPT2 → Sucessor do AAPT → Divide a geração do

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

    artefato em duas etapas: compilação e link → Compila os resources separadamente (telas, imagens, classes...)
  87. 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
  88. 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
  89. #Partiu ativar as novas ferramentas?

  90. None
  91. Só isso?

  92. None
  93. Vamos falar sober alguns problemas encontrados e seus workarounds

  94. Problemas encontrados - R8

  95. Problemas encontrados - R8 → Configuração do proguard.cfg precisou ser

    feita, não utilizáva-mos antes !
  96. 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
  97. 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
  98. 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
  99. 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
  100. 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
  101. Problemas encontrados - AAPT2

  102. Problemas encontrados - AAPT2 → Configurar --no-version-vectors - problemas com

    Android 4
  103. 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 )
  104. 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
  105. 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
  106. 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
  107. Benchmark Será que valeu a pena?

  108. Build inicial

  109. Build inicial

  110. Build inicial

  111. Build incremental (sem alterações)

  112. Build incremental (com alterações no C#)

  113. Build incremental (com alterações em XML)

  114. Isso nos proporcionou mais produtividade E fez a gente mudar

    a maneira como medíamos performance...
  115. None
  116. Fim dos builds "Faroeste Caboclo"

  117. Recomendações para Debug e Release

  118. Recomendações para Debug e Release Debug Release Shared runtime ✅

    ❌ D8 ✅ ✅ R8 ❌ ✅ Linker ❌ ✅ AOT ❌ ✅ AAPT2 ✅ ✅ Multidex ✅ ⚠ ProduceReferenceAssembly = true ✅ ✅
  119. 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/
  120. Obrigado! ⠀Ione Souza Junior ⠀ ionixjunior