Proguard提示缺失R$raw类,添加-keep无效,如何正确处理?
解决R$raw类缺失的正确方式
核对R类包名引用
确认代码里导入的R类属于当前项目模块,别误引用其他模块的R类。多模块项目里IDE自动导入容易出错,手动检查并修正import语句,确保是import my.package.name.R;。检查raw资源的合法性
确认res/raw目录下存在目标资源文件,文件名必须是小写字母、数字或下划线组合,不能有大写、空格或特殊字符——不符合规则的资源不会被R类收录。修正ProGuard规则
单独写-keep class my.package.name.R$raw不足以保留字段,要针对性保留内部类的静态字段,正确规则如下:-keepclassmembers class my.package.name.R$raw { public static <fields>; }如果需要保留所有资源类的字段,也可以用更通用的规则:
-keep class my.package.name.R { *; } -keepclassmembers class my.package.name.R$* { public static <fields>; }注意包名必须和项目实际包名完全一致,多模块场景下要对应到资源所在模块的包名。
清理缓存并重建项目
执行Build菜单下的Clean Project,再执行Rebuild Project。缓存异常可能导致R类生成不完整,清理后重新构建能解决这类问题。排查混淆规则冲突
若开启了minifyEnabled true,检查所有proguard-rules.pro文件(包括当前模块和依赖模块的),确保没有其他规则误删了R类相关代码。
内容的提问来源于stack exchange,提问作者Daniil
相关产品推荐
相关产品推荐

