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
相关产品推荐
相关产品推荐

