Play Asset Delivery多文件夹场景下,如何仅按需安装指定子文件夹内容
如何在Play Asset Delivery中仅按需安装指定子文件夹的资源
当然可以实现只安装folder1而跳过folder2的需求!不过你需要调整一下Asset Pack的配置方式——默认情况下,单个on-demand类型的Asset Pack会被作为一个整体交付,无法拆分其中的子文件夹单独下载。下面是具体的实现步骤:
1. 拆分独立的Asset Pack
把你现有的on_demand文件夹拆分成两个独立的Asset Pack模块,比如分别命名为on_demand_folder1和on_demand_folder2:
你的项目根目录 ├─ app ├─ on_demand_folder1 │ └─ src/main/assets │ └─ folder1 // 原来的folder1资源 └─ on_demand_folder2 └─ src/main/assets └─ folder2 // 原来的folder2资源
2. 配置Asset Pack的交付类型
在每个Asset Pack模块的build.gradle(或build.gradle.kts)中,设置它们的交付类型为on-demand:
对于on_demand_folder1/build.gradle:
plugins { id 'com.android.asset-pack' } assetPack { packName = "on_demand_folder1" dynamicDelivery { deliveryType = "on-demand" } }
对于on_demand_folder2/build.gradle:
plugins { id 'com.android.asset-pack' } assetPack { packName = "on_demand_folder2" dynamicDelivery { deliveryType = "on-demand" } }
然后在你的app模块的build.gradle中,声明这两个Asset Pack依赖:
android { // ...其他配置 } assetPacks = [":on_demand_folder1", ":on_demand_folder2"]
3. 在代码中按需请求指定的Asset Pack
当你需要使用folder1的资源时,只需要请求安装on_demand_folder1这个Asset Pack即可,folder2不会被自动下载:
Kotlin示例:
import com.google.android.play.core.assetpacks.AssetPackRequest import com.google.android.play.core.assetpacks.PlayAssetDelivery // 请求安装on_demand_folder1 val assetPackRequest = AssetPackRequest.newInstance("on_demand_folder1") PlayAssetDelivery.getInstance(applicationContext).fetch(assetPackRequest) .addOnSuccessListener { // 资源下载安装完成,现在可以访问folder1中的内容 // 比如通过AssetManager访问:assets.open("folder1/your_resource.file") } .addOnFailureListener { exception -> // 处理下载失败的情况,比如提示用户重试 }
关键说明
- 如果你不拆分Asset Pack,是无法单独下载其中的子文件夹的——因为Play Asset Delivery的最小交付单位是整个Asset Pack,只有当整个包下载完成后,你才能访问里面的任何资源。
- 拆分后,你可以根据业务需求,在不同时机分别请求
on_demand_folder1或on_demand_folder2,完全控制哪些资源被下载。
内容的提问来源于stack exchange,提问作者Sriram




