启用严格收缩器后MotionLayout报Resources$NotFoundException崩溃如何解决?
解决启用严格收缩器后MotionLayout引发的Resources$NotFoundException崩溃问题
启用严格代码收缩后出现这个崩溃,核心原因是严格收缩器的静态资源分析无法识别MotionLayout在运行时动态加载的资源,这些资源会被误判为未使用而被移除,最终导致MotionScene加载时找不到对应资源ID。
解决步骤:
定位缺失的资源
先找到报错里的资源ID#0x7f0a03f0对应的具体资源:- 执行项目的R文件生成任务(比如
./gradlew app:generateReleaseRFile),在build/generated/not_namespaced_r_class_sources/release/r/[你的包名]/R.java里搜索该ID,找到对应的资源名称(比如可能是某个motion scene里的transition、constraintSet资源)。
- 执行项目的R文件生成任务(比如
配置资源保留规则
根据定位到的资源类型,选择以下一种方式添加保留规则:方式一:通过ProGuard/R8规则保留
在
proguard-rules.pro文件中添加:# 保留单个资源ID -keepresourceids id/[你的资源名称] # 如果是整个motion scene文件,保留所有motion相关xml -keepresources xml/motion_scene_*.xml方式二:通过build.gradle配置保留
在app模块的
build.gradle中,给对应的buildType添加资源保留:android { buildTypes { release { shrinkResources true // 保留指定的motion资源文件 keepResources { include "xml/motion_scene_main.xml" // 或者批量保留:include "xml/motion_*.xml" } } } }验证修复效果
重新构建release包,安装后测试包含MotionLayout的页面,确认崩溃不再出现。
内容的提问来源于stack exchange,提问作者kartollika
相关产品推荐
相关产品推荐

