Slide 1

Slide 1 text

Dynamic feature module の基本 Cookpad.apk #2

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

Dynamic feature module (DFM)

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

参考アプリ •Google Santa Tracker

Slide 6

Slide 6 text

⚠ 注意 ⚠ •まだ、Beta •製品版として公開するときはBeta Programに参加する 必要がある ‣ https://support.google.com/googleplay/android- developer/answer/9006925#beta • (反映されるまで1-2週間かかる)

Slide 7

Slide 7 text

DFMをつくる

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

DFMをつくる

Slide 10

Slide 10 text

DFMをつくる •Enable on-demand ‣ 動的配信をするかどうか •Fusing ‣ サポートされてない端末(4.4以下)でインストールさせるか ‣ Enable on-demandにチェックがあるときのみ

Slide 11

Slide 11 text

DFMをつくる •Module title ‣ モジュール名 ‣ ダウンロード確認ダイアログで
 使用される ‣ (10M超えると確認が必要)

Slide 12

Slide 12 text

DFMの中身

Slide 13

Slide 13 text

DFM/AndroidManifest.xml

Slide 14

Slide 14 text

DFM/build.gradle apply plugin: 'com.android.dynamic-feature' android { compileSdkVersion 28 defaultConfig { minSdkVersion 21 targetSdkVersion 28 } } dependencies { implementation project(':app') implementation project(':core') }

Slide 15

Slide 15 text

app/build.gradle apply plugin: 'com.android.application' android { // ... dynamicFeatures = [":feature_one", "feature_two"] } dependencies { implementation project(':core') }

Slide 16

Slide 16 text

モジュールの依存関係

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Dynamic Delivery

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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)

Slide 22

Slide 22 text

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)

Slide 23

Slide 23 text

Dynamic Delivery •モジュールダウンロード後にアクセスするには
 SplitCompat Libraryが必要 class FeatureActivity : AppCompatActivity() { override fun attachBaseContext(newBase: Context?) { super.attachBaseContext(newBase) SplitCompat.install(this) } }

Slide 24

Slide 24 text

Dynamic Delivery •テストがしにくい ‣ デバッグ実行ではモジュールのダウンロードができない ‣ PlayConsoleの内部テストが必要

Slide 25

Slide 25 text

実装時のポイント

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

•coreモジュール 実装時のポイント feature_one app core

Slide 29

Slide 29 text

デバッグ実行

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

bundletool

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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は は含めない

Slide 34

Slide 34 text

まとめ

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

参考 •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

Slide 38

Slide 38 text

ありがとうございました