You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android动态按需模块assets文件无法通过原有方法访问

Android动态按需(On Demand)模块Assets访问方案

动态按需模块的assets无法通过主模块Context的context.getAssets().open(fileName)直接读取,和主app模块的访问逻辑存在区别:动态模块以独立split APK形式安装后,主模块默认持有的Context不会自动挂载该split的资源索引,所以会出现文件找不到的问题。不存在单独的专用Assets访问API,只需要切换到对应动态模块的Context操作即可。

具体实现代码

Java写法:

// 填入动态功能模块在AndroidManifest中声明的package名称
Context splitContext = context.createPackageContext(
        "your.dynamic.module.package.name",
        Context.CONTEXT_IGNORE_SECURITY
);
// 通过split模块的Context获取AssetManager,按原有逻辑读取文件即可
InputStream is = splitContext.getAssets().open(fileName);

Kotlin写法:

val splitContext = context.createPackageContext(
    "your.dynamic.module.package.name",
    Context.CONTEXT_IGNORE_SECURITY
)
val inputStream = splitContext.assets.open(fileName)

注意事项

  • 访问时机要求:必须等SplitInstallManager回调对应模块安装成功的状态后,再执行资源读取操作,否则会抛出NameNotFoundException或者文件不存在异常
  • 包名校验:如果动态模块没有单独配置package属性,会默认复用主app的包名,若复用包名后依然无法读取,可以先调用SplitInstallManager.getInstalledModules()打印已加载的模块列表,确认目标模块确实已经完成安装挂载
  • 路径规则不变:open()方法传入的fileName参数,和之前主模块的规则一致,直接填文件在动态模块assets目录下的相对路径即可,不需要加额外前缀
  • 测试渠道说明:Google Play内部应用分享渠道对动态模块的分发逻辑和正式环境一致,不需要额外做特殊配置,只要确认模块下载安装完成即可正常访问

你已经通过Android Studio的AAB分析工具确认assets文件已经正确打包进动态模块,按上述方式切换Context访问即可解决问题。

内容的提问来源于stack exchange,提问作者Shihab Uddin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:57:23