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

应用重启后Dynamic Feature模块崩溃:资源未找到异常

解决Dynamic Feature模块重启后Resources$NotFoundException崩溃问题

我最近碰到一个棘手的问题:按需下载的Dynamic Feature模块首次运行完全正常,但重启应用后直接崩溃,抛出Resources$NotFoundException。我已经照搬了Google Dynamic Features示例里的模块启动逻辑,还在Application和所有Activity的基类里集成了SplitCompat,但问题依然没解决。

先贴一下我的相关代码和崩溃日志,方便大家定位问题:

我的代码实现

模块加载成功后的启动逻辑

private fun onSuccessfulLoad(moduleName: String, launch: Boolean) {
    if (launch) {
        when (moduleName) {
            pagesfeatures -> launchActivity(mainActivity)
        }
    }
}

BaseActivity中集成SplitCompat

open class BaseActivity: AppCompatActivity() {
    override fun attachBaseContext(newBase: Context?) {
        super.attachBaseContext(newBase)
        SplitCompat.install(this)
    }
}

Application类中集成SplitCompat

public class App extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        SplitCompat.install(base);
    }
}

崩溃日志

Fatal Exception: java.lang.RuntimeException: Unable to start activity ComponentInfo{com.qp.readquranoffline.holybookreading/com.mycode.pagesfeature.activities.MainActivity}: android.content.res.Resources$NotFoundException: Resource ID #0x7e010000
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3621)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3866)
    at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
    at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
    at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2190)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:268)
    at android.app.ActivityThread.main(ActivityThread.java:8004)
    at java.lang.reflect.Method.invoke(Method.java)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:627)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:997)
Caused by android.content.res.Resources$NotFoundException: Resource ID #0x7e010000
    at android.content.res.ResourcesImpl.getValue(ResourcesImpl.java:248)
    at android.content.res.Resources.loadXmlResourceParser(Resources.java:2400)
    at android.content.res.Resources.getAnimation(Resources.java:1277)
    at android.view.animation.AnimationUtils.loadAnimation(AnimationUtils.java:138)
    at com.mycode.quranpagesfeature.activities.MainActivity.onCreate(MainActivity.kt:158)
    at android.app.Activity.performCreate(Activity.java:8058)
    at android.app.Activity.performCreate(Activity.java:8042)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1315)
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3594)
    ... 11 more

经过一番排查,我找到了几个可能的问题点和对应的解决方案,分享给大家:

问题排查与解决步骤

1. 资源访问必须使用模块自身的Context

从日志看,崩溃发生在模块内MainActivity加载动画资源的地方。很多人会犯的错误是用全局的ApplicationContext去加载模块资源,但SplitCompat只会为模块内的Activity提供包含模块资源的Context,全局Context无法访问模块资源。

  • ❌ 错误写法:
AnimationUtils.loadAnimation(applicationContext, R.anim.your_anim)
  • ✅ 正确写法:
AnimationUtils.loadAnimation(this, R.anim.your_anim) // this是模块内Activity的实例

2. 修正SplitCompat在Application中的初始化

你在Application里调用SplitCompat.install(base)是错的,应该传this(即初始化后的Application实例),因为base是未被SplitCompat处理的原始Context。修正后的代码:

public class App extends Application {
    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        SplitCompat.install(this); // 这里改成传this
    }
}

另外要确保模块内的所有Activity都继承了你写的BaseActivity,这样才能保证每个Activity都能正确初始化SplitCompat。

3. 用显式Intent启动模块Activity

启动模块内的Activity时,一定要用显式Intent,避免使用隐式Intent。重启后系统可能无法正确解析隐式Intent对应的模块组件。比如:

private fun launchActivity(activityClass: Class<*>) {
    val intent = Intent(this, activityClass)
    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
    startActivity(intent)
}

4. 重启后先验证模块是否已安装

有时候重启后系统可能无法正确识别已安装的模块,这时候可以在启动Activity前先检查模块状态:

private fun isModuleInstalled(moduleName: String): Boolean {
    val splitInstallManager = SplitInstallManagerFactory.create(this)
    return splitInstallManager.installedModules.contains(moduleName)
}

如果模块不在已安装列表里,就需要重新触发模块下载流程。

5. 检查Gradle配置是否正确

最后确认一下主应用和模块的Gradle配置:

  • 主应用的build.gradle要声明Dynamic Feature模块:
android {
    // 其他配置...
    dynamicFeatures = [":pagesfeature"] // 替换成你的模块名称
}
  • 模块的build.gradle要应用com.android.dynamic-feature插件:
plugins {
    id 'com.android.dynamic-feature'
}

android {
    compileSdkVersion 34 // 保持和主应用一致
    minSdkVersion 21 // 按需调整,最低支持21
}

按照这些步骤调整后,我重启应用就不再崩溃了,模块资源也能正常加载。希望这些方案能帮到碰到同样问题的开发者!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 18:12:31