umeda.apk #4 で発表した、Dynamic Feature Modulesについての資料です
Dynamic Feature Moduleを使ってみた@punchdrunker
View Slide
自己紹介● @punchdrunker / 七尾 貴史● 普段は、Android > iOS > Rails● 株式会社ミクシィで、みてねというアプリを作っています● DroidKaigiでも働いてます● shibuya.apkではライブ配信係
今日話すことAndroid App Bundleの中の目玉機能の1つである、Dynamic Feature Modulesを使ったアプリを実際にリリースして、どのような使い心地になるかを体験してみようというお話しです。aabの作り方とか、その他の詳しい話は割愛します。前回の里山さんの資料に色々まとまっています。https://www.slideshare.net/nsface/app-bundle
Android App Bundle概要アプリをいままでよりスマートに配信する事が出来る機能群の総称● Multiple APKの代替(何らかの理由で端末別にapkを用意できる仕組み)● APKサイズの最適化(aab)● 必要になった時に追加でモジュールをインストールできる○ Dynamic Feature Moduleとしてベータ公開中● アプリをインストールしていなくてもモジュール単位で利用可能になる○ instant enableとして近日公開予定(AndroidStudio 3.2 RC14以降でしか使えない)
aabの構造
今日のテーマ
Dynamic Feature Module?アプリのインストール後に、必要になった時に機能やリソースを事後的にインストール(Dynamic Delivery)する事ができる仕組みのこと。一部の端末やユーザー向けのものはアプリインストール後に必要になったときにインストールできるようにする事で、その機能が必要の無いユーザーに対してはストレージ使用量を抑えられる。また回線速度に依存するが、モジュールのインストールには数秒以上かかると思った方がよい。必要なくなったらuninstallすることも出来る。
Dynamic Feature Moduleの使い道- 有料コンテンツやプレミアム機能- 有料登録時にインストールできれば良い- ゲームのステージ情報- ステージが進んだ時にインストールすれば良い- とにかく大きな画像などのリソースをたまに使う- 必要だとわかったらインストールすれば良い- 利用者が少なく、ある程度分離された機能- 他サービスとの連携する機能など(あくまで自分の妄想です)
どんな対応が必要か● play coreライブラリを利用○ com.google.android.play.core.splitinstall.*● SplitInstallManager を使って、利用可能なモジュールの確認やインストールを行う○ 確認: SplitInstallManager.getInstalledModules()○ 追加: SplitInstallManager.startInstall(module)○ 削除: SplitInstallManager.deferredUninstall(modules)● インストール完了したら(SplitInstallStateUpdatedListener)、使うだけ○ パッケージ名を指定して、startActivity()やcreatePackageContext()するだけ
デモ1. 設定アプリでhochoアプリのストレージ使用量を確認2. hochoアプリを起動3. メニューからDynamic Feature Moduleを選択4. 写真一覧が表示されるまで待機5. 写真一覧が表示されたら再度設定アプリでhochoのストレージ使用量を確認サンプルアプリインストールURL →
aab的にはどうなるのか(時間があれば)bundletoolでどんなapkが生成されるか手元で確認できますhttps://github.com/google/bundletool/releases具体的な手順はcodelabがわかりやすいですhttps://codelabs.developers.google.com/codelabs/your-first-dynamic-app/index.html?index=..%2F..%2Fio2018#4
ハマりどころ(1)Modules 'base' and 'gallery' contain entry 'res/layout/activity_main.xml' with different content.→ 別モジュールでも同じリソース名は不可オンデマンド モジュールのタイトルのリソース ID には、ベース モジュールで定義された文字列を指定する必要があります。無効なモジュールは「gallery」です→ベースとなるアプリ側でリソースIDを定義しておく必要がある(feature_names.xml)implementationで利用するライブラリを定義すると、dynamic feature module側から使えない→ apiでロードするようにしたら使えた
ハマりどころ(2)ベータ機能なので、申請フォームに記入が必要→半日くらい待つと使えるようになっていたaabでリリースしたらminSdkVersion21なのに、hdpi端末でベクターがぼやけた(伝聞)→VectorDrawableCompatのissueが上がっているので、その内直りそう
参考資料● codelab○ https://goo.gl/h17V6Y● sample app○ https://github.com/googlesamples/android-dynamic-features● hochoでの実装○ https://github.com/punchdrunker/hocho/pull/33/files