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

App size regression detection on CI

App size regression detection on CI

About how to automate process of detecting app size regression on your CI

Avatar for Akni Inc.

Akni Inc.

June 02, 2023

Other Decks in Programming

Transcript

  1. Agenda • Reason to care • apk & app bundle

    2 • Regression detection options
  2. Install conversion rate Does app size impact install conversion rate?

    https://medium.com/googleplaydev/shrinking-apks-growing-installs 4
  3. Install conversion rate Does app size impact install conversion rate?

    • smaller APK sizes correlate with higher install conversion rates https://medium.com/googleplaydev/shrinking-apks-growing-installs 4
  4. Install conversion rate Does app size impact install conversion rate?

    • smaller APK sizes correlate with higher install conversion rates Lower conversion rate Slower downloads Higher uninstall Lower update rates https://medium.com/googleplaydev/shrinking-apks-growing-installs • For every 6 MB increase to an APK’s size, we see a decrease in the install conversion rate of 1%. 4
  5. Apk structure Directories: 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/… Files: 6
  6. Apk structure Directories: 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/… Files: resources.arsc res/ drawable/… values/… layout/… classes.dex dex/ classes.dex classes2.dex AndroidManifest.xml 6
  7. Generate an apk 1. Legacy apk Build universal apk via

    assemble[Debug/Release] Contains files for all device configurations https://developer.android.com/guide/app-bundle/app-bundle-format 7
  8. Generate an apk 1. Legacy apk Build universal apk via

    assemble[Debug/Release] Contains files for all device configurations 2. Dynamic delivery with App Bundle • Of fi cial android app publishing format • Allows to build an apk for speci fi c device
 Decreases the apk size by ~35% https://developer.android.com/guide/app-bundle/app-bundle-format 7
  9. 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
  10. 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/) … Dynamic feature 2 (feature2/) … BUNDLE-METADATA/ BundleCon fi g.pb Android App Bundle (*.aab) https://developer.android.com/guide/app-bundle/app-bundle-format 8
  11. 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/) … Dynamic feature 2 (feature2/) … 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
  12. Base APK (base-master.apk) Base con (feature1-master.apk) Dynamic feature 2 APK

    (feature1-master.apk) Dynamic feature 3 APK (feature1-master.apk) https://developer.android.com/guide/app-bundle/app-bundle-format
  13. 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 fi
  14. Development size detection Build release apk Store size metrics Compare

    current and previous apks ./gradlew assembleRelease Upload to gcloud: gsutil Compare with diffuse tool java -jar diffuse-binary.jar diff --apk current.apk previous.apk 11
  15. Development size detection Build release apk Store size metrics Compare

    current and previous apks ./gradlew assembleRelease Upload to gcloud: gsutil Compare with diffuse tool java -jar diffuse-binary.jar diff --apk current.apk previous.apk 11
  16. Development size detection Build release apk Store size metrics Compare

    current and previous apks ./gradlew assembleRelease Upload to gcloud: gsutil Compare with diffuse tool 12
  17. Development size detection Build release apk Store size metrics Compare

    current and previous apks ./gradlew assembleRelease Upload to gcloud: gsutil Compare with diffuse tool Run every 3 hours 12
  18. Development size detection Build release apk Store size metrics Compare

    current and previous apks ./gradlew assembleRelease Upload to gcloud: gsutil Compare with diffuse tool Run every 3 hours Schedule a workflow 12
  19. Development size detection Build release apk Store size metrics Compare

    current and previous apks Run every 3 hours 12
  20. Development size detection Build release apk Store size metrics Compare

    current and previous apks Run every 3 hours Build release apk Store size metrics Compare current and previous apks Run every 3 hours 12
  21. Development size detection Build release apk Store size metrics Compare

    current and previous apks Run every 3 hours Build release apk Store size metrics Compare current and previous apks Run every 3 hours ~3h 12
  22. Development size detection Build release apk Store size metrics Compare

    current and previous apks Run every 3 hours Build release apk Store size metrics Compare current and previous apks Run every 3 hours ~3h Collect involved commits 12
  23. Pull request size detection: option 1 development Build bundle release

    ./gradlew bundleRelease Generate device speci fi c apk Using bundletool 15
  24. Pull request size detection: option 1 development Build bundle release

    ./gradlew bundleRelease Generate device speci fi c apk Using bundletool java -jar bundletool.jar build-apks 15
  25. Pull request size detection: option 1 development Build bundle release

    ./gradlew bundleRelease Generate device speci fi c apk Using bundletool java -jar bundletool.jar build-apks --device-spec=device-spec.json { "supportedAbis": ["armeabi-v7a"], "supportedLocales": ["en"], "screenDensity": 640, "sdkVersion": 27 } 15
  26. Pull request size detection: option 1 development Build bundle release

    ./gradlew bundleRelease Generate device speci fi c apk Using bundletool java -jar bundletool.jar build-apks --device-spec=device-spec.json --bundle=current.aab --output=current-release.apks --mode=system 15
  27. Pull request size detection: option 1 development Build bundle release

    ./gradlew bundleRelease Generate device speci fi c apk Using 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 15
  28. Pull request size detection: option 1 development Build bundle release

    ./gradlew bundleRelease Generate device speci fi c apk Using bundletool Store the metrics gsutil: bundle/apk/etc. 16
  29. Pull request size detection: option 1 development Build bundle release

    ./gradlew bundleRelease Generate device speci fi c apk Using bundletool Store the metrics gsutil: bundle/apk/etc. 16
  30. Pull request size detection: option 1 development feature/task1 Build bundle

    release Generate device speci fi c apk Download development build 17
  31. Pull request size detection: option 1 development feature/task1 Build bundle

    release Generate device speci fi c apk Download development build git merge-base development feature/task1 17
  32. Pull request size detection: option 1 development feature/task1 Build bundle

    release Generate device speci fi c apk Download development build git merge-base development feature/task1 Compare dev and pr apks Using diffuse tool 17
  33. Pull request size detection: option 1 development feature/task1 Build bundle

    release Generate device speci fi c apk Download development build git merge-base development feature/task1 Compare dev and pr apks Using diffuse tool Report on PR Detailed diffuse report/Block PR 17
  34. Pull request size detection: option 1 development feature/task1 Build bundle

    release Generate device speci fi c apk Download development build Compare dev and pr apks Report on PR Check git changed fi les 17
  35. Pull request size detection: option 1 development feature/task1 Build bundle

    release Generate device speci fi c apk Download development build Compare dev and pr apks Report on PR Check git changed fi les Compile release code ./gradlew app:compileReleaseJavaWithJavac 17
  36. Pull request size detection: option 2 development Build bundle release

    Generate device speci fi c apk Store the metrics 18
  37. Pull request size detection: option 2 development Build bundle release

    Generate device speci fi c apk Store the metrics 18
  38. Pull request size detection: option 2 development Build bundle release

    Generate device speci fi c apk Checkout development 19
  39. Pull request size detection: option 2 development Build bundle release

    Generate device speci fi c apk Checkout development head_commit = git merge-base development task1 git checkout $head_commit 19
  40. Pull request size detection: option 2 development Build bundle release

    Generate device speci fi c apk Checkout development Build bundle release 19
  41. Pull request size detection: option 2 development Build bundle release

    Generate device speci fi c apk Checkout development Build bundle release Generate device speci fi c apk 19
  42. Pull request size detection: option 2 development Build bundle release

    Generate device speci fi c apk Checkout development Compare PR and development apks Using diffuse tool Report on PR Diffuse report/Block PR Build bundle release Generate device speci fi c apk 19
  43. Pull request size detection: option 2 development Build bundle release

    Generate device speci fi c apk Checkout development Compare PR and development apks Report on PR Check git changed fi les Build bundle release Generate device speci fi c apk 19