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

求助:Google Play已部署Android动态模块应用出现资源找不到异常

解决方案:Android 6.0及以下动态模块资源NotFound异常

针对你遇到的**仅Android 6.0及以下版本触发、动态模块启动Activity时setContentView抛出Resources$NotFoundException**的问题,结合动态模块在低版本系统的资源加载特性,给你以下几个可行的解决方向:

1. 排查并解决资源ID冲突

Android 6.0及以下的资源管理系统未完全适配App Bundle动态模块的资源隔离机制,容易出现基础模块与动态模块的资源ID重复。你可以:

  • 为动态模块设置独立资源前缀:在动态模块的build.gradle中添加resourcePrefix "dynamic_"(替换为自定义前缀),强制模块内所有资源ID带上专属前缀,从根源避免ID冲突。
  • 重新构建项目生成全新资源ID,确保动态模块与基础模块的资源ID完全不重叠。

2. 手动关联动态模块的Resources对象

低版本系统中,动态模块的Resources可能未被正确绑定到Activity的Context中,导致资源加载失败。你可以在动态模块的Activity中手动替换Context的Resources:

@Override
protected void attachBaseContext(Context newBase) {
    super.attachBaseContext(newBase);
    try {
        ModuleManager moduleManager = ModuleManager.getInstance();
        ModuleInfo moduleInfo = moduleManager.getModuleInfo("你的动态模块名称");
        if (moduleInfo != null && moduleInfo.isInstalled()) {
            Resources moduleResources = moduleManager.getModuleResources(moduleInfo);
            Context wrappedContext = new ContextWrapper(newBase) {
                @Override
                public Resources getResources() {
                    return moduleResources;
                }
            };
            attachBaseContext(wrappedContext);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}

记得替换代码中的"你的动态模块名称"为实际模块名,这个方法能确保Activity优先使用动态模块自身的Resources加载资源。

3. 临时迁移关键资源到基础模块

如果某些drawable资源是动态模块Activity的核心依赖,可临时将这些资源复制到基础模块中。这样即使动态模块资源加载失败,系统也能从基础模块找到对应资源——这是临时 workaround,建议优先解决资源ID或加载机制的核心问题。

4. 确保动态模块完全安装后再启动Activity

低版本系统中,动态模块的安装回调可能存在延迟,若在模块未完全安装时启动Activity,会导致资源未被正确加载。你可以通过监听模块安装状态,确认完成后再跳转:

ModuleInstallRequest request = ModuleInstallRequest.newBuilder()
        .addModule("你的动态模块名称")
        .build();
ModuleInstall.getInstance(this).installModules(request)
        .addOnSuccessListener(listener -> {
            if (listener.isAlreadyInstalled()) {
                startActivity(new Intent(this, DynamicActivity.class));
            } else {
                listener.registerListener(new ModuleInstallListener() {
                    @Override
                    public void onInstallCompleted(InstallSession session) {
                        if (session.getStatus() == InstallSessionStatus.COMPLETED) {
                            startActivity(new Intent(this, DynamicActivity.class));
                        }
                    }
                });
            }
        })
        .addOnFailureListener(e -> {
            // 处理安装失败逻辑
        });

5. 调整资源混淆规则

若你使用了资源混淆工具(如AndResGuard),需确保动态模块的混淆规则与基础模块兼容,且低版本系统中不会错误混淆必要的drawable资源ID。可为动态模块单独配置混淆规则,保留关键资源的ID不被修改。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:07:43