采取oob扩展文件已经过时了
现在采取aab 方式
需要我们拆分出部分资源,使用以下三种分发模式中的一种来解决:
install-time 资源包在用户安装应用时分发。这些资源包以拆分 APK(APK 集的一部分)的形式提供。它们也称为“预先”资源包;您可以在应用启动时立即使用这些资源包。这些资源包会增加 Google Play 商店上列出的应用大小。用户无法修改或删除这些资源包。
fast-follow 资源包会在用户安装应用后立即自动下载;用户无需打开应用即可开始 fast-follow 下载。此类下载不会阻止用户访问应用。这些资源包会增加 Google Play 商店上列出的应用大小。
on-demand 资源包会在应用运行时下载。
扩展文件和apk都集合在一个aab里面
Gradle 会为每个 Asset Pack 生成清单,并为您输出 assets/ 目录。
所以调试的时候把文件复制到app/main/assets/ 目录
发布的时候将assets/ 目录复制到install_time_pack/src/main/assets/
bundletool build-apks --bundle='app-release.aab' --output='pep.apks'
bundletool install-apks --apks='pep.apks'
针对 Java 构建
您可以按照以下步骤将 Play Asset Delivery 内置到项目的 Android App Bundle 中。您无需使用 Android Studio 即可执行这些步骤。
-
在项目的
build.gradle
文件中将 Android Gradle 插件的版本更新为4.0.0
或更高版本。 -
在项目的顶级目录中,为 Asset Pack 创建一个目录。此目录名称将用作 Asset Pack 名称。Asset Pack 名称必须以字母开头,并且只能包含字母、数字和下划线。
-
在 Asset Pack 目录中,创建一个
build.gradle
文件并添加以下代码。请务必指定 Asset Pack 的名称,并且仅指定一种分发类型:// In the asset pack’s build.gradle file: apply plugin: 'com.android.asset-pack' assetPack { packName = "asset-pack-name" // Directory name for the asset pack dynamicDelivery { deliveryType = "[ install-time | fast-follow | on-demand ]" } }
-
在项目的应用
build.gradle
文件中,添加项目中每个 Asset Pack 的名称,如下所示:// In the app build.gradle file: android { ... assetPacks = [":asset-pack-name", ":asset-pack2-name"] }
-
在项目的
settings.gradle
文件中,添加项目中的所有 Asset Pack,如下所示:// In the settings.gradle file: include ':app' include ':asset-pack-name' include ':asset-pack2-name'
-
在 Asset Pack 目录中,创建以下子目录:
src/main/assets
。 -
将资产放置在
src/main/assets
目录中。您也可以在此处创建子目录。应用的目录结构现在应如下所示:build.gradle
settings.gradle
app/
asset-pack-name/build.gradle
asset-pack-name/src/main/assets/your-asset-directories
-
在生成的 app bundle 中,根级目录现在包含以下内容:
asset-pack-name/manifest/AndroidManifest.xml
:配置 Asset Pack 的标识符和分发模式asset-pack-name/assets/your-asset-directories
:此目录包含作为 Asset Pack 的一部分分发的所有资产
Gradle 会为每个 Asset Pack 生成清单,并为您输出
assets/
目录。
读取文件
import android.content.res.AssetManager; ... Context context = createPackageContext("com.example.app", 0); AssetManager assetManager = context.getAssets(); InputStream is = assetManager.open("asset-name");