$30 off During Our Annual Pro Sale. View Details »

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.

Ione Souza Junior

October 06, 2019
Tweet

More Decks by Ione Souza Junior

Other Decks in Technology

Transcript

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

    View Slide

  2. Whois
    ⠀Ione Souza Junior
    ⠀Mobile Developer @
    ⠀❤ Xamarin
    !
    ⠀Um bom Xamaritano
    "
    ⠀ ionixjunior

    View Slide

  3. !
    Agora também sou "Youtuber"
    ionixjunior Ione Souza Junior

    View Slide

  4. Temos vagas!
    careers.mercos.com

    View Slide

  5. Sobre o que vamos falar?

    View Slide

  6. Sobre o que vamos falar?
    → Entender como um projeto Xamarin Android é
    compilado

    View Slide

  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

    View Slide

  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

    View Slide

  9. Falar sobre compilação
    do Android não é algo
    muito simples...

    View Slide

  10. Como é a compilação de
    um projeto Xamarin
    Android?
    Isso vale para projetos da abordagem traditional e forms

    View Slide

  11. São 2 "pequenos" passos
    1 - Compilação do C#
    2 - Compilação do Android

    View Slide

  12. Passo 1
    Compilar o C#

    View Slide

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

    View Slide

  14. Mas o que é IL?

    View Slide

  15. Mas o que é IL?

    View Slide

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

    View Slide

  17. Mas o que é IL?
    → É uma Linguagem Intermediária
    → .NET Runtime converte a IL em código assembly

    View Slide

  18. O linker poder ser
    utilizado na compilação

    View Slide

  19. O que é o linker?

    View Slide

  20. O que é o linker?

    View Slide

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

    View Slide

  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

    View Slide

  23. Passo 2
    Compilar o Android

    View Slide

  24. O AAPT inicia o
    mapeamento dos
    resources
    Todos os resources do projeto são mapeados

    View Slide

  25. O que é o AAPT?

    View Slide

  26. O que é o AAPT?

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  31. Depois o DX gera o DEX

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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?

    View Slide

  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

    View Slide

  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

    View Slide

  39. JVM vs Dalvik

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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)

    View Slide

  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)

    View Slide

  46. O que é JIT e AOT?

    View Slide

  47. O que é JIT e AOT?

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  51. Dalvik vs ART

    View Slide

  52. Como o DEX é gerado?

    View Slide

  53. Como o DEX é gerado?

    View Slide

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

    View Slide

  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)

    View Slide

  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)

    View Slide

  57. Ainda sobre a compilação
    do Android
    Multidex e Proguard podem entrar em ação

    View Slide

  58. O que é o Multidex?

    View Slide

  59. O que é o Multidex?

    View Slide

  60. O que é o Multidex?
    → O DEX tem um limite de métodos

    View Slide

  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

    View Slide

  62. O que é o Proguard?

    View Slide

  63. O que é o Proguard?

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  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

    View Slide

  68. View Slide

  69. View Slide

  70. Agora acho que estamos
    mais preparados para
    falar sobre as "novas"
    ferramentas

    View Slide

  71. D8

    View Slide

  72. D8

    View Slide

  73. D8
    → Sucessor do DX

    View Slide

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

    View Slide

  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

    View Slide

  76. R8

    View Slide

  77. R8

    View Slide

  78. R8
    → Sucessor do Proguard

    View Slide

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

    View Slide

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

    View Slide

  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

    View Slide

  82. AAPT2

    View Slide

  83. AAPT2

    View Slide

  84. AAPT2
    → Sucessor do AAPT

    View Slide

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

    View Slide

  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...)

    View Slide

  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

    View Slide

  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

    View Slide

  89. #Partiu ativar as novas
    ferramentas?

    View Slide

  90. View Slide

  91. Só isso?

    View Slide

  92. View Slide

  93. Vamos falar sober alguns
    problemas encontrados e
    seus workarounds

    View Slide

  94. Problemas encontrados - R8

    View Slide

  95. Problemas encontrados - R8
    → Configuração do proguard.cfg precisou ser feita, não utilizáva-mos
    antes
    !

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  101. Problemas encontrados - AAPT2

    View Slide

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

    View Slide

  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 )

    View Slide

  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

    View Slide

  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

    View Slide

  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

    View Slide

  107. Benchmark
    Será que valeu a pena?

    View Slide

  108. Build inicial

    View Slide

  109. Build inicial

    View Slide

  110. Build inicial

    View Slide

  111. Build incremental (sem alterações)

    View Slide

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

    View Slide

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

    View Slide

  114. Isso nos proporcionou
    mais produtividade
    E fez a gente mudar a maneira como medíamos performance...

    View Slide

  115. View Slide

  116. Fim dos builds
    "Faroeste Caboclo"

    View Slide

  117. Recomendações para
    Debug e Release

    View Slide

  118. Recomendações para Debug e Release
    Debug Release
    Shared runtime ✅ ❌
    D8 ✅ ✅
    R8 ❌ ✅
    Linker ❌ ✅
    AOT ❌ ✅
    AAPT2 ✅ ✅
    Multidex ✅ ⚠
    ProduceReferenceAssembly = true ✅ ✅

    View Slide

  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/

    View Slide

  120. Obrigado!
    ⠀Ione Souza Junior
    ⠀ ionixjunior

    View Slide