「apk + 拡張ファイル」でアプリを公開していたのですが、aab対応が必要になり拡張ファイルは使えないので代替機能として何かないか確認したらPlay Asset Deliveryが該当したので試してみました。
150MBを超えるアプリを公開することは稀だと思いますが、参考にする記事がかなり少なかったのでこれから使ってみようと考えている人の助けになれば幸いです。
動作確認環境
Macbook Pro macOS Catarina 10.15.7
Android Gradle Plugin 4.1.3
AndroidStudio 4.1.3
Pixel3 Android OS 11
#1 PlayCoreLibraryの導入
// In your app’s build.gradle file:
...
dependencies {
// For Kotlin users also import the Kotlin extensions library for Play Core:
implementation("com.google.android.play:core-ktx:1.8.1")
...
}
#2 プロジェクトに必要なファイルと設定を追加
- プロジェクトのルートディレクトリに Asset Pack のディレクトリを作成。
- 今回は拡張ファイルの代替機能として用意するのでディレクトリ名を asset_expansion としています。
- Asset Pack のディレクトリに build.gradle ファイルを作成して、下記のコードを入力します。
- 配信タイプは [install-time], [fast-follow], [on-demand] の3種類ありますが今回はインストール時に一緒に取得したいので install-time を指定しています。
apply plugin: 'com.android.asset-pack'
assetPack {
packName = "asset_expansion" // Directory name for the asset pack
dynamicDelivery {
deliveryType = "install-time"
}
}
- プロジェクトのアプリの build.gradle ファイルで、下記のように、プロジェクト内の各 Asset Pack の名前を追加します。
// In the app build.gradle file:
android {
...
assetPacks = [":asset_expansion"]
}
- プロジェクトの settings.gradle ファイルに、下記のように、プロジェクト内のすべての Asset Pack をインクルードします。
// In the settings.gradle file:
include ':app'
include ':asset_expansion'
-
Asset Pack のディレクトリにサブディレクトリ src/main/assets を作成します。
-
アセットを src/main/assets ディレクトリに配置します。ここでもサブディレクトリを作成できます。アプリのディレクトリ構造は次のようになります。
- build.gradle
- settings.gradle
- app/ ←これは必須ではないようです。
- asset_expansion/build.gradle
- asset_expansion/src/main/assets/アセットファイルを配置
-
今回はサンプルとしてasset_expansion/src/main/assets/配下にmovie/sample.mp4を配置しておきます。
-
以上で前準備は完了になりますのでビルドしてコンパイルエラーにならないことの確認をお願いします。
メディアファイルを読み込んでみる
適当なActivityやFragmentからasset_expansionが保持しているメディアファイルを読み込んでみます。
val packageContext = createPackageContext(applicationId, 0)
val assetManager = packageContext.getAssets()
val inputStream = assetManager.open("movie/sample.mp4")
上記ではInpurStreamを取得しているだけなのでExoPlayerやVideoViewで読み込めるように path を取得するようにします。
inputStream.buffered().use {
it.copyTo(context.openFileOutput("tmp.mp4", Context.MODE_PRIVATE))
}
context.getFileStreamPath("tmp.mp4").absolutePath
あとはメディアプレイヤーに上記の absolutePath を渡してやればOKです。
AndroidStudioのrunの設定を変更
Android Studioのタブメニューから run -> Edit Configurations を選択して、
General -> Installation Options -> Deploy を APK from app bundle へ変更すれば実行時に asset_expansion のデータもインストールしてくれます。
あとがき
最初公式を見た時は断片的な情報だと思ってうまく動いてくれるか!?なんて思いましたが、コード組んでみたら公式通りであっさり動いてくれました😇
コードを組んだあとは最初、bundletoolをhomebrewを使ってインストールしてコマンドでちまちまaabファイルからapksファイルを生成してインストールなんてやっていましたが、AndroidStudioの設定を変更すればコマンドの操作が必要なかったことが分かってだいぶ時間無駄にしたな〜なんて密かに思ったりしていました。
#公式
https://developer.android.com/guide/playcore/asset-delivery?hl=ja