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

Размер имеет значение

Размер имеет значение

Доклад про автоматизацию отслеживания изменения размера релизной сборки приложения на каждом Pull Request. Про структуру APK и App Bundle, а также про инструменты для получения разницы в размере между сборками.

Akni Inc.

August 30, 2022
Tweet

Other Decks in Programming

Transcript

  1. Акниет Арысбаев Август 2022 Размер имеет значение 1

  2. Обо мне • Android инженер @ Delivery Hero • Берлин,

    Германия • Производительность приложения • Telegram: @akniet 2
  3. О чем будем говорить • Зачем мониторить размер приложения •

    Из чего состоит apk & app bundle 3 • С чего начать • Способы обнаружения регрессии
  4. Зачем мониторить размер 4

  5. Зачем следить за размером Влияет ли размер apk на конверсию

    установок? https://medium.com/googleplaydev/shrinking-apks-growing-installs 5
  6. Зачем следить за размером Влияет ли размер apk на конверсию

    установок? • Меньший размер апк коррелирует с более высоким коэффициентом 
 конверсий установок https://medium.com/googleplaydev/shrinking-apks-growing-installs 5
  7. Зачем следить за размером Влияет ли размер apk на конверсию

    установок? • Меньший размер апк коррелирует с более высоким коэффициентом 
 конверсий установок https://medium.com/googleplaydev/shrinking-apks-growing-installs • На каждые 6MB увеличения размера апк, видим снижение коэффициента 
 конверсии установок на 1% 5
  8. Зачем следить за размером Влияет ли размер apk на конверсию

    установок? • Меньший размер апк коррелирует с более высоким коэффициентом 
 конверсий установок Ниже коэффициент конверсии Медленнее загрузки Выше риск удаления Реже частота обновления https://medium.com/googleplaydev/shrinking-apks-growing-installs • На каждые 6MB увеличения размера апк, видим снижение коэффициента 
 конверсии установок на 1% 5
  9. Структура apk Директории: Файлы: 6

  10. Структура apk Директории: META-INF/ CERT.SF CERT.RSA Файлы: 6

  11. Структура apk Директории: META-INF/ CERT.SF CERT.RSA assets/ textures/… sounds/… materials/…

    shaders/… licenses.txt Файлы: 6
  12. Структура apk Директории: META-INF/ CERT.SF CERT.RSA assets/ textures/… sounds/… materials/…

    shaders/… licenses.txt res/ drawable/*.png Файлы: 6
  13. Структура apk Директории: META-INF/ CERT.SF CERT.RSA assets/ textures/… sounds/… materials/…

    shaders/… licenses.txt res/ drawable/*.png lib/ x86/native-lib.so x86_64/… armeabi/… armeabi-v7a/… armeabi-v8a/… Файлы: 6
  14. Структура apk Директории: META-INF/ CERT.SF CERT.RSA assets/ textures/… sounds/… materials/…

    shaders/… licenses.txt res/ drawable/*.png lib/ x86/native-lib.so x86_64/… armeabi/… armeabi-v7a/… armeabi-v8a/… Файлы: resources.arsc res/ drawable/… values/… layout/… 6
  15. Структура apk Директории: META-INF/ CERT.SF CERT.RSA assets/ textures/… sounds/… materials/…

    shaders/… licenses.txt res/ drawable/*.png lib/ x86/native-lib.so x86_64/… armeabi/… armeabi-v7a/… armeabi-v8a/… Файлы: resources.arsc res/ drawable/… values/… layout/… classes.dex dex/ classes.dex classes2.dex 6
  16. Структура apk Директории: META-INF/ CERT.SF CERT.RSA assets/ textures/… sounds/… materials/…

    shaders/… licenses.txt res/ drawable/*.png lib/ x86/native-lib.so x86_64/… armeabi/… armeabi-v7a/… armeabi-v8a/… Файлы: resources.arsc res/ drawable/… values/… layout/… classes.dex dex/ classes.dex classes2.dex AndroidManifest.xml 6
  17. Способы сборки apk https://developer.android.com/guide/app-bundle/app-bundle-format 7

  18. Способы сборки apk https://developer.android.com/guide/app-bundle/app-bundle-format 7

  19. Способы сборки apk 1. Legacy apk Универсальный apk - assemble[Debug/Release]

    Содержит ресурсы для всех конфигурации устройств https://developer.android.com/guide/app-bundle/app-bundle-format 7
  20. Способы сборки apk 1. Legacy apk Универсальный apk - assemble[Debug/Release]

    Содержит ресурсы для всех конфигурации устройств 2. Dynamic delivery with App Bundle • Официальный формат публикации приложений • Собирает apk в зависимости от конфигурации устройств • Тем самым уменьшает размер apk ~35% https://developer.android.com/guide/app-bundle/app-bundle-format 7
  21. BUNDLE-METADATA/ BundleCon fi g.pb Android App Bundle (*.aab) https://developer.android.com/guide/app-bundle/app-bundle-format 8

  22. Base module (base/) assets.pb resources.pb native.pb manifest/ AndroidManifest.xml dex/ classes.dex

    classes2.dex root/ com/… … res/ layout/… … drawable/… drawable-hdpi/… drawable-xhdpi/… … values/… values-en/… values-fr/… … assets/ textures/… sounds/… materials/… shaders/… licenses.txt lib/ x86/native-lib.so x86_64/… armeabi/… armeabi-v7a/… armeabi-v8a/… … BUNDLE-METADATA/ BundleCon fi g.pb Android App Bundle (*.aab) https://developer.android.com/guide/app-bundle/app-bundle-format 8
  23. Base module (base/) assets.pb resources.pb native.pb manifest/ AndroidManifest.xml dex/ classes.dex

    classes2.dex root/ com/… … res/ layout/… … drawable/… drawable-hdpi/… drawable-xhdpi/… … values/… values-en/… values-fr/… … assets/ textures/… sounds/… materials/… shaders/… licenses.txt lib/ x86/native-lib.so x86_64/… armeabi/… armeabi-v7a/… armeabi-v8a/… … Dynamic feature 1 (feature1/) … BUNDLE-METADATA/ BundleCon fi g.pb Android App Bundle (*.aab) https://developer.android.com/guide/app-bundle/app-bundle-format 8 Dynamic feature 2 (feature2/) …
  24. Base module (base/) assets.pb resources.pb native.pb manifest/ AndroidManifest.xml dex/ classes.dex

    classes2.dex root/ com/… … res/ layout/… … drawable/… drawable-hdpi/… drawable-xhdpi/… … values/… values-en/… values-fr/… … assets/ textures/… sounds/… materials/… shaders/… licenses.txt lib/ x86/native-lib.so x86_64/… armeabi/… armeabi-v7a/… armeabi-v8a/… … Dynamic feature 1 (feature1/) … Asset pack 1 (asset_pack_1) manifest/ AndroidManifest.xml assets/ textures/… sounds/… materials/… shaders/… licenses.txt Asset pack 2 (asset_pack_2) manifest/ AndroidManifest.xml assets/ textures/… sounds/… materials/… shaders/… licenses.txt BUNDLE-METADATA/ BundleCon fi g.pb Android App Bundle (*.aab) https://developer.android.com/guide/app-bundle/app-bundle-format 8 Dynamic feature 2 (feature2/) …
  25. https://developer.android.com/guide/app-bundle/app-bundle-format 9

  26. Base APK (base-master.apk) Base con f i

  27. Base APK (base-master.apk) Base con (feature1-master.apk) Dynamic feature 2 APK

    (feature1-master.apk) Dynamic feature 3 APK (feature1-master.apk) Feature 1 con f i
  28. Base APK (base-master.apk) Base con (feature1-master.apk) Dynamic feature 2 APK

    (feature1-master.apk) Dynamic feature 3 APK (feature1-master.apk) Feature 1 con fi guration Split APKs: feature2-xxhdpi.apk feature2-xhdpi.apk feature2-hdpi.apk ... ABI con fi guration Split APKs: feature2-x86.apk feature2-x86_64.apk feature2-armeabi.apk ... Language con fi guration Split APKs: feature2-en.apk feature2-fr.apk feature2-de.apk ... Feature 2 con f i
  29. С чего начать 10

  30. Первые шаги 11

  31. Первые шаги Proguard & R8 Shrink Obfuscate Optimize 11

  32. Первые шаги Proguard & R8 png jpg Shrink Obfuscate Optimize

    11
  33. Первые шаги Proguard & R8 Vector Graphics webP png jpg

    Shrink Obfuscate Optimize 11
  34. Первые шаги Proguard & R8 Vector Graphics webP png jpg

    gif Shrink Obfuscate Optimize 11
  35. Первые шаги Proguard & R8 Vector Graphics webP png jpg

    Lottie gif Shrink Obfuscate Optimize 11
  36. Обнаружение размера в development 12

  37. Обнаружение размера в development commit commit commit commit 12

  38. Обнаружение размера в development Сборка release apk 12

  39. Обнаружение размера в development Сборка release apk ./gradlew assembleRelease 12

  40. Обнаружение размера в development Сборка release apk Выгрузка метрики ./gradlew

    assembleRelease 12
  41. Обнаружение размера в development Сборка release apk Выгрузка метрики ./gradlew

    assembleRelease Загрузить в cloud: gsutil 12
  42. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks ./gradlew assembleRelease Загрузить в cloud: gsutil 12
  43. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks ./gradlew assembleRelease Загрузить в cloud: gsutil diffuse tool 12
  44. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks ./gradlew assembleRelease Загрузить в cloud: gsutil diffuse tool java -jar diffuse-binary.jar diff -- - - - a a a a a a 12
  45. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks ./gradlew assembleRelease Загрузить в cloud: gsutil diffuse tool java -jar diffuse-binary.jar diff -- - - - aa a aa a 12
  46. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks ./gradlew assembleRelease Загрузить в cloud: gsutil diffuse tool java -jar diffuse-binary.jar diff -- - - - j j j j j j 12
  47. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks ./gradlew assembleRelease Загрузить в cloud: gsutil diffuse tool java -jar diffuse-binary.jar diff --aar current.aar previous.aar 12
  48. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks ./gradlew assembleRelease Загрузить в cloud: gsutil diffuse tool java -jar diffuse-binary.jar diff diffuse-binary.jar info current.apk --apk current.apk previous.apk 12
  49. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks ./gradlew assembleRelease Загрузить в cloud: gsutil diffuse tool java -jar diffuse-binary.jar diff diffuse-binary.jar info current.apk diffuse-binary.jar members –-methods --fields current.apk --apk current.apk previous.apk 12
  50. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks ./gradlew assembleRelease Загрузить в cloud: gsutil diffuse tool java -jar diffuse-binary.jar diff --apk current.apk previous.apk 12
  51. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks ./gradlew assembleRelease Загрузить в cloud: gsutil diffuse tool java -jar diffuse-binary.jar diff --apk current.apk previous.apk 12
  52. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks ./gradlew assembleRelease Загрузить в cloud: gsutil diffuse tool java -jar diffuse-binary.jar diff --apk current.apk previous.apk 12
  53. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks ./gradlew assembleRelease Загрузить в cloud: gsutil Используя diffuse tool 13
  54. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks ./gradlew assembleRelease Загрузить в cloud: gsutil Используя diffuse tool Проверяем каждые ~3ч 13
  55. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks ./gradlew assembleRelease Загрузить в cloud: gsutil Используя diffuse tool Проверяем каждые ~3ч Назначить workflow 13
  56. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks Проверяем каждые ~3ч 13
  57. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks Проверяем каждые ~3ч Собрать release apk Выгрузить метрики Сравнить текущий и предыдущий apks Проверяем каждые ~3ч 13
  58. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks Проверяем каждые ~3ч Собрать release apk Выгрузить метрики Сравнить текущий и предыдущий apks Проверяем каждые ~3ч ~3ч 13
  59. Обнаружение размера в development Сборка release apk Выгрузка метрики Сравнить

    текущий и предыдущий apks Проверяем каждые ~3ч Собрать release apk Выгрузить метрики Сравнить текущий и предыдущий apks Проверяем каждые ~3ч ~3ч Собрать вовлеченные коммиты 13
  60. Недостатки 14

  61. Недостатки • Позднее обнаружение 14

  62. Недостатки • Позднее обнаружение • Требует ручной работы 14

  63. Недостатки • Позднее обнаружение • Требует ручной работы • Legacy

    apk 14
  64. Обнаружение размера в PR 15

  65. Обнаружение в Pull request: вариант 1 16

  66. Обнаружение в Pull request: вариант 1 commit commit commit commit

    development 16
  67. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    16
  68. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease 16
  69. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease Генерация конкретного apk 16
  70. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease Генерация конкретного apk Используя bundletool 16
  71. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease Генерация конкретного apk Используя bundletool java -jar bundletool.jar build-apks 16
  72. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease Генерация конкретного apk Используя bundletool java -jar bundletool.jar build-apks --device-spec=device-spec.json 16
  73. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease Генерация конкретного apk Используя bundletool java -jar bundletool.jar build-apks --device-spec=device-spec.json { "supportedAbis": ["armeabi-v7a"], "supportedLocales": ["en"], "screenDensity": 640, "sdkVersion": 27 } 16
  74. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease Генерация конкретного apk Используя bundletool java -jar bundletool.jar build-apks --device-spec=device-spec.json --bundle=current.aab 16
  75. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease Генерация конкретного apk Используя bundletool java -jar bundletool.jar build-apks --device-spec=device-spec.json --bundle=current.aab -- - - - - =i i i i i i i 16
  76. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease Генерация конкретного apk Используя bundletool java -jar bundletool.jar build-apks --device-spec=device-spec.json --bundle=current.aab -- - - - - =d d d d d d d 16
  77. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease Генерация конкретного apk Используя bundletool java -jar bundletool.jar build-apks --device-spec=device-spec.json --bundle=current.aab -- - - - - =u u u u u u u u u 16
  78. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease Генерация конкретного apk Используя bundletool java -jar bundletool.jar build-apks --device-spec=device-spec.json --bundle=current.aab --mode=system 16
  79. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease Генерация конкретного apk Используя bundletool java -jar bundletool.jar build-apks --device-spec=device-spec.json --bundle=current.aab --output=current-release.apks --mode=system 16
  80. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease Генерация конкретного apk Используя bundletool java -jar bundletool.jar build-apks --device-spec=device-spec.json --bundle=current.aab --output=current-release.apks --ks=/MyApp/keystore.jks --ks-pass=file:/MyApp/keystore.pwd --ks-key-alias=MyKeyAlias --key-pass=file:/MyApp/key.pwd --mode=system 16
  81. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease Генерация конкретного apk Используя bundletool java -jar bundletool.jar build-apks --device-spec=device-spec.json --bundle=current.aab --output=current-release.apks --ks=/MyApp/keystore.jks --ks-pass=file:/MyApp/keystore.pwd --ks-key-alias=MyKeyAlias --key-pass=file:/MyApp/key.pwd --mode=system https://developer.android.com/studio/command-line/bundletool 16
  82. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease Генерация конкретного apk Используя bundletool Выгрузка метрики gsutil: bundle/apk/etc. 17
  83. Обнаружение в Pull request: вариант 1 development Сборка release bundle

    ./gradlew bundleRelease Генерация конкретного apk Используя bundletool Выгрузка метрики gsutil: bundle/apk/etc. 17
  84. Обнаружение в Pull request: вариант 1 development 17

  85. Обнаружение в Pull request: вариант 1 development feature/task1 18

  86. Обнаружение в Pull request: вариант 1 development feature/task1 18

  87. Обнаружение в Pull request: вариант 1 development feature/task1 Сборка release

    bundle 18
  88. Обнаружение в Pull request: вариант 1 development feature/task1 Сборка release

    bundle Генерация конкретного apk 18
  89. Обнаружение в Pull request: вариант 1 development feature/task1 Сборка release

    bundle Генерация конкретного apk Загрузка development build 18
  90. Обнаружение в Pull request: вариант 1 development feature/task1 Сборка release

    bundle Генерация конкретного apk Загрузка development build git merge-base development feature/task1 18
  91. Обнаружение в Pull request: вариант 1 development feature/task1 Сборка release

    bundle Генерация конкретного apk Загрузка development build git merge-base development feature/task1 Сравнение dev и pr apks 18
  92. Обнаружение в Pull request: вариант 1 development feature/task1 Сборка release

    bundle Генерация конкретного apk Загрузка development build git merge-base development feature/task1 Сравнение dev и pr apks Используя diffuse tool 18
  93. Обнаружение в Pull request: вариант 1 development feature/task1 Сборка release

    bundle Генерация конкретного apk Загрузка development build git merge-base development feature/task1 Сравнение dev и pr apks Используя diffuse tool Уведомление в PR 18
  94. Обнаружение в Pull request: вариант 1 development feature/task1 Сборка release

    bundle Генерация конкретного apk Загрузка development build git merge-base development feature/task1 Сравнение dev и pr apks Используя diffuse tool Уведомление в PR Детальный diffuse report/Блокировка PR 18
  95. Обнаружение в Pull request: вариант 1 development feature/task1 Сборка release

    bundle Генерация конкретного apk Загрузка development build Сравнение dev и pr apks Уведомление в PR Проверка git измененные файлы 18
  96. Обнаружение в Pull request: вариант 1 development feature/task1 Сборка release

    bundle Генерация конкретного apk Загрузка development build Сравнение dev и pr apks Уведомление в PR Проверка git измененные файлы Компиляция release кода 18 ./gradlew app:compileReleaseJavaWithJavac
  97. development feature/task1 Сборка release bundle Генерация конкретного apk Загрузка development

    build Сравнение dev и pr apks Уведомление в PR Проверка git измененные файлы Компиляция release кода Недостатки 18
  98. development feature/task1 Сборка release bundle Генерация конкретного apk Загрузка development

    build Сравнение dev и pr apks Уведомление в PR Проверка git измененные файлы Компиляция release кода Недостатки 18
  99. development feature/task1 Сборка release bundle Генерация конкретного apk Загрузка development

    build Сравнение dev и pr apks Уведомление в PR Проверка git измененные файлы Компиляция release кода Недостатки 18
  100. Обнаружение в Pull request: вариант 2 19

  101. Обнаружение в Pull request: вариант 2 development Сборка release bundle

    Генерация конкретного apk Выгрузка метрики 19
  102. Обнаружение в Pull request: вариант 2 development Сборка release bundle

    Генерация конкретного apk Выгрузка метрики 19
  103. Обнаружение в Pull request: вариант 2 development 19

  104. Обнаружение в Pull request: вариант 2 development 20

  105. Обнаружение в Pull request: вариант 2 development 20

  106. Обнаружение в Pull request: вариант 2 development Сборка release bundle

    20
  107. Обнаружение в Pull request: вариант 2 development Сборка release bundle

    Генерация конкретного apk 20
  108. Обнаружение в Pull request: вариант 2 development Сборка release bundle

    Генерация конкретного apk Checkout development 20
  109. Обнаружение в Pull request: вариант 2 development Сборка release bundle

    Генерация конкретного apk Checkout development head_commit = git merge-base development task1 20
  110. Обнаружение в Pull request: вариант 2 development Сборка release bundle

    Генерация конкретного apk Checkout development head_commit = git merge-base development task1 git checkout $head_commit 20
  111. Обнаружение в Pull request: вариант 2 development Сборка release bundle

    Генерация конкретного apk Checkout development Сборка release bundle 20
  112. Обнаружение в Pull request: вариант 2 development Сборка release bundle

    Генерация конкретного apk Checkout development Сборка release bundle Генерация конкретного apk 20
  113. Обнаружение в Pull request: вариант 2 development Сборка release bundle

    Генерация конкретного apk Checkout development Сравнение PR и development apks Сборка release bundle Генерация конкретного apk 20
  114. Обнаружение в Pull request: вариант 2 development Сборка release bundle

    Генерация конкретного apk Checkout development Сравнение PR и development apks Используя diffuse tool Сборка release bundle Генерация конкретного apk 20
  115. Обнаружение в Pull request: вариант 2 development Сборка release bundle

    Генерация конкретного apk Checkout development Сравнение PR и development apks Используя diffuse tool Уведомление в PR Сборка release bundle Генерация конкретного apk 20
  116. Обнаружение в Pull request: вариант 2 development Сборка release bundle

    Генерация конкретного apk Checkout development Сравнение PR и development apks Используя diffuse tool Уведомление в PR Diffuse report/Блокировка PR Сборка release bundle Генерация конкретного apk 20
  117. Обнаружение в Pull request: вариант 2 development Сборка release bundle

    Генерация конкретного apk Checkout development Сравнение PR и development apks Уведомление в PR Проверка git измененные файлы Сборка release bundle Генерация конкретного apk 20
  118. Что мы имеем • Полная видимость изменении размера приложения •

    Автоматизированное обнаружение регрессии 21
  119. Дополнительные материалы • Spotify ruler plugin • Bundletool 22 https://engineering.atspotify.com/2022/02/introducing-ruler-our-tool-for-measuring-android-app-size/

    https://developer.android.com/studio/command-line/bundletool • Reduce your app size https://developer.android.com/topic/performance/reduce-apk-size