应用重启后Dynamic Feature模块崩溃:资源未找到异常
我最近碰到一个棘手的问题:按需下载的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

