Pro Yearly is on sale from $80 to $50! »

Dynamic feature moduleの基本 / Cookpad.apk #2

80a3a3857a55f154d23acb705eff72cc?s=47 star_zero
February 18, 2019

Dynamic feature moduleの基本 / Cookpad.apk #2

80a3a3857a55f154d23acb705eff72cc?s=128

star_zero

February 18, 2019
Tweet

Transcript

  1. Dynamic feature module の基本 Cookpad.apk #2

  2. About me •Kenji Abe •メディアプロダクト開発部 •Android cookpadTV •Twitter: @STAR_ZERO

  3. Dynamic feature module (DFM)

  4. 概要 •Android App Bundle(aab)の機能 •アプリインストール後に特定のモジュールを
 後からインストール ‣ インストール時のファイルサイズ削減 ‣ インストール時に含めることもできる

  5. 参考アプリ •Google Santa Tracker

  6. ⚠ 注意 ⚠ •まだ、Beta •製品版として公開するときはBeta Programに参加する 必要がある ‣ https://support.google.com/googleplay/android- developer/answer/9006925#beta

    • (反映されるまで1-2週間かかる)
  7. DFMをつくる

  8. DFMをつくる •File -> New -> New Module
 -> Dynamic Feature

    Module
  9. DFMをつくる

  10. DFMをつくる •Enable on-demand ‣ 動的配信をするかどうか •Fusing ‣ サポートされてない端末(4.4以下)でインストールさせるか ‣ Enable

    on-demandにチェックがあるときのみ
  11. DFMをつくる •Module title ‣ モジュール名 ‣ ダウンロード確認ダイアログで
 使用される ‣ (10M超えると確認が必要)

  12. DFMの中身

  13. DFM/AndroidManifest.xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:dist="http://schemas.android.com/apk/distribution" package="com.star_zero.sample.dfm.feature1"> <dist:module dist:instant="false" dist:onDemand="true" dist:title="@string/title_feature1"> <dist:fusing

    dist:include="true" /> </dist:module> </manifest>
  14. DFM/build.gradle apply plugin: 'com.android.dynamic-feature' android { compileSdkVersion 28 defaultConfig {

    minSdkVersion 21 targetSdkVersion 28 } } dependencies { implementation project(':app') implementation project(':core') }
  15. app/build.gradle apply plugin: 'com.android.application' android { // ... dynamicFeatures =

    [":feature_one", "feature_two"] } dependencies { implementation project(':core') }
  16. モジュールの依存関係

  17. •よくあるマルチモジュールの依存関係 モジュールの依存関係 feature_one feature_two app implementation project(':feature_one') implementation project(':feature_two')

  18. •DFMの依存関係 モジュールの依存関係 feature_one feature_two app dynamicFeatures = [":feature_one", “feature_two"] implementation

    project(':app') implementation project(':app')
  19. Dynamic Delivery

  20. Dynamic Delivery •動的にモジュールをダウンロード •com.google.android.play:core •https://developer.android.com/guide/app-bundle/ playcore

  21. Dynamic Delivery val manager = SplitInstallManagerFactory.create(this) if (manager.installedModules.contains(MODULE_NAME)) { //

    インストール済み return } val request = SplitInstallRequest.newBuilder() .addModule(MODULE_NAME) .build() manager.startInstall(request)
  22. Dynamic Delivery val listener = SplitInstallStateUpdatedListener { state -> when

    (state.status()) { // ... SplitInstallSessionStatus.REQUIRES_USER_CONFIRMATION -> { // ダウロード確認ダイアログを表示 startIntentSender( state.resolutionIntent()?.intentSender, null, 0, 0, 0) } } } // 登録 manager.registerListener(listener) // 登録解除 manager.unregisterListener(listener)
  23. Dynamic Delivery •モジュールダウンロード後にアクセスするには
 SplitCompat Libraryが必要 <application … android:name="com.google.android.play.core.splitcompat.SplitCompatApplication"> </application> class

    FeatureActivity : AppCompatActivity() { override fun attachBaseContext(newBase: Context?) { super.attachBaseContext(newBase) SplitCompat.install(this) } }
  24. Dynamic Delivery •テストがしにくい ‣ デバッグ実行ではモジュールのダウンロードができない ‣ PlayConsoleの内部テストが必要

  25. 実装時のポイント

  26. 実装時のポイント •app側からfeatureモジュールは直接参照できない ‣ 参照するにはリフレクションを使う ‣ DIは工夫が必要
 (dagger.androidは使わないほうが良いかも)

  27. 実装時のポイント •共通処理はcoreモジュールを作っておくと良い ‣ build.gradleでは api でライブラリを追加 ‣ APIアクセスや共通のDI Component ‣

    DataBinding (共通の@BindingAdapterなど)
  28. •coreモジュール 実装時のポイント feature_one app core

  29. デバッグ実行

  30. デバッグ実行 •Run -> Edit Configurations…

  31. bundletool

  32. bundletool •aabからapkを作ってくれる •オプションの指定で、モジュールをすべて含んだapkを 作成できる ‣ DeployGate等でapkを配布したい場合など •https://developer.android.com/studio/command- line/bundletool

  33. bundletool $ bundletool build-apks \ --bundle=app.aab \ --output=app.apks \ --ks=release.keystore

    \ --ks-pass=pass:sample \ --ks-key-alias=sample \ --key-pass=pass:sample \ --mode=universal # モジュールをすべて含めるオプション $ unzip app.apks # universal.apkが作られる ※universalは <dist:fusing dist:include=“false”/> は含めない
  34. まとめ

  35. まとめ •ダウンロードサイズ削減できる ‣ aab自体でも効果的 ‣ DFMによって更に削減できる •マルチモジュールの手法と捉えられる ‣ ビルド時間短縮 ‣

    モジュール分割による設計
  36. まとめ •テストがやりにくい ‣ PlayConsoleの内部テストが必要 •まだまだハマりどころ(バグ?)が多い ‣ DataBinding、Proguard/R8 ‣ 結局やってみないと分からないので色々試す

  37. 参考 •https://developer.android.com/studio/projects/dynamic- delivery •https://developer.android.com/guide/app-bundle/playcore •https://github.com/nickbutcher/plaid •https://medium.com/androiddevelopers/google-santa-tracker- moving-to-an-android-app-bundle-dde180716096 •https://www.youtube.com/watch?v=QdoEcfibG-s

  38. ありがとうございました