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

Tips for implementing Android Dynamic Feature Module

Tips for implementing Android Dynamic Feature Module

At CA.apk#9, I have talked about the merit for implementing features with Dynamic Feature Module (DFM), and shared some tips for implementing features with DFM.

---

Official Docs
* Android App Bundles | Android Developers
https://developer.android.com/guide/app-bundle

* About Dynamic Delivery  |  Android Developers
https://developer.android.com/guide/app-bundle/dynamic-delivery

* About Conditional Delivery | Android Developers
https://developer.android.com/guide/app-bundle/conditional-delivery

---

Other Presentations regarding DFM(JP)
* Dynamic Feature Module in Practice
https://speakerdeck.com/star_zero/droidkaigi-2020

---

Other Links
* R8 & DataBinding with DFM
https://stackoverflow.com/questions/54404492/proguard-with-appbundle-and-data-binding-illegalstateexception
https://issuetracker.google.com/issues/139046605

* Delivery Config - Apk
https://stackoverflow.com/questions/54844007/how-to-generate-full-apk-file-including-dynamic-feature-module

* Jacoco Config
https://github.com/arturdm/jacoco-android-gradle-plugin/issues/80
https://github.com/vanniktech/gradle-android-junit-jacoco-plugin/pull/158

Shohei Kawano

July 14, 2020
Tweet

More Decks by Shohei Kawano

Other Decks in Technology

Transcript

  1. DFM Tips

    @shoheikawano
    @_shoheikawano

    View Slide

  2. Content
    ・Why DFM?
    ・Tips for adding feature with DFM
    ・Conclusion


    View Slide

  3. Why DFM?

    View Slide

  4. Why DFM?
    ・”Ability to customize how and when the feature
    to be downloaded onto devices running Android
    5.0”
     ・Reduce initial App install size
    https://developer.android.com/guide/app-bundle/dynamic-delivery

    View Slide

  5. Why DFM?
    0
    17
    34
    Without DFM with DFM
    Initial App Intall Size ※Estimate

    View Slide

  6. Tips

    View Slide

  7. Tips Delivery Config
    Jacoco Config
    R8 & DataBinding

    View Slide

  8. Tips
    R8 & DataBinding
    Delivery Config
    Jacoco Config

    View Slide

  9. R8 & DataBinding

    View Slide

  10. R8 & DataBinding
    // app/build.gradle
    release {
    minifyEnabled = true
    }

    View Slide

  11. R8 & DataBinding
    // dynamic-feature-module/build.gradle
    buildFeatures {
    dataBinding = true
    }
    // app/build.gradle
    release {
    minifyEnabled = true
    }

    View Slide

  12. R8 & DataBinding
    // dynamic-feature-module/build.gradle
    buildFeatures {
    dataBinding = true
    }
    // dynamic-feature-module/DynamicActivity.kt
    DataBindingUtil.setContentView(this, layoutId)
    // app/build.gradle
    release {
    minifyEnabled = true
    }

    View Slide

  13. R8 & DataBinding
    // dynamic-feature-module/build.gradle
    buildFeatures {
    dataBinding = true
    }
    // dynamic-feature-module/DynamicActivity.kt
    DataBindingUtil.setContentView(this, layoutId)
    Release Build
    // app/build.gradle
    release {
    minifyEnabled = true
    }

    View Slide

  14. R8 & DataBinding
    //dynamic-feature-module/build.gradle
    buildFeatures {
    dataBinding = true
    }
    // DynamicActivity.kt
    DataBindingUtil.setContentView(this, layoutId)
    Release Build
    //app/build.gradle
    release {
    minifyEnabled = true
    } RuntimeException

    java.lang.RuntimeException: Unable to start activity
    ComponentInfo{...DynamicActivity}: java.lang.IllegalStateException:
    DataBindingUtil.setConte… R.layout.dynamic_activity) must not be null
    Caused by: java.lang.IllegalStateException: DataBindingUtil.setConte…
    R.layout.dynamic_activity) must not be null
    at DynamicActivity.onCreate(DynamicActivity.kt:38)

    View Slide

  15. # dynamic-feature-module/proguard-rules-dynamic-features.pro
    -keep class your.dfm.package.name.DataBinderMapperImpl { *; }
    https://issuetracker.google.com/issues/139046605
    R8 & DataBinding
    https://stackoverflow.com/questions/54404492/proguard-with-appbundle-and-data-binding-illegalstateexception
    // dynamic-feature-module/build.gradle
    buildTypes {
    release {
    proguardFiles 'proguard-rules-dynamic-features.pro'
    }
    }

    View Slide

  16. Tips Delivery Config
    Jacoco Config
    R8 & DataBinding

    View Slide

  17. Tips Delivery Config
    Jacoco Config
    R8 & DataBinding

    View Slide

  18. Delivery Config - Install

    View Slide

  19. View Slide

  20. View Slide

  21. View Slide

  22. View Slide

  23. View Slide

  24. Delivery Config - Apk

    View Slide

  25. View Slide

  26. View Slide

  27. View Slide

  28. View Slide

  29. View Slide

  30. View Slide

  31. View Slide

  32. View Slide

  33. View Slide

  34. Delivery Config - Apk

    View Slide

  35. View Slide

  36. Delivery Config - Apk

    View Slide

  37. View Slide

  38. View Slide

  39. View Slide

  40. View Slide

  41. View Slide

  42. // dynamic-feature-module/build.gradle
    productFlavors {
    flavor1 {
    manifestPlaceholders = [include_fusing: true, exclude_install_time: false]
    }
    flavor2 {
    manifestPlaceholders = [include_fusing: false, exclude_install_time: true]
    }
    }
    ...
    Delivery Config - Apk

    View Slide

  43. Tips Delivery Config
    Jacoco Config
    R8 & DataBinding

    View Slide

  44. Tips Delivery Config
    Jacoco Config
    R8 & DataBinding

    View Slide

  45. Jacoco Config
    // root/build.gradle
    dependencies {
    classpath ‘com.dicedmelon.gradle:jacoco-android:0.1.4'
    }
    // dynamic-feature-module/build.gradle
    apply plugin: 'jacoco-android'

    View Slide

  46. Jacoco Config
    // root/build.gradle
    dependencies {
    classpath ‘com.dicedmelon.gradle:jacoco-android:0.1.4'
    }
    // dfm/build.gradle
    apply plugin: 'jacoco-android'
    * What went wrong:
    A problem occurred evaluating script.
    > Failed to apply plugin [id 'jacoco-android']
    > You must apply the Android plugin or the Android library plugin before
    using the jacoco-android plugin

    View Slide

  47. Jacoco Config
    // root/build.gradle
    dependencies {
    classpath ‘com.dicedmelon.gradle:jacoco-android:0.1.4'
    }
    // dynamic-feature-module/build.gradle
    apply plugin: 'jacoco-android'

    View Slide

  48. Jacoco Config
    // root/build.gradle
    dependencies {
    classpath ‘com.dicedmelon.gradle:jacoco-android:0.1.4'
    }
    // dynamic-feature-module/build.gradle
    apply plugin: 'jacoco-android'

    View Slide

  49. Jacoco Config
    // root/build.gradle
    dependencies {
    classpath ‘com.dicedmelon.gradle:jacoco-android:0.1.4'
    }
    // dynamic-feature-module/build.gradle
    apply plugin: 'jacoco-android'

    View Slide

  50. Jacoco Config .. Alternative?

    View Slide

  51. Conclusion

    View Slide

  52. Tips
    Why DFM?
    — To reduce App Install Size — Keep DataBinderMapperImpl
    — Configure delivery options Carefully
    — Use fusing / include option for APK
    — Use manifest placeholder if necessary
    — Some Jacoco android gradle plugin(s)
    just do not work with DFM
    Conclusion

    View Slide

  53. DFM Tips

    @shoheikawano
    @_shoheikawano
    Thank you!

    View Slide