Kotlin混淆踩坑记录

你以为你的代码已经开启了混淆,但其实却并没有。

最近项目组里发现这么一个有趣的事情,而且已经存在了好长一段时间。

如果不是应用市场审核马甲包的事情被拒了,也想不起来这档子事。

反编译自己的项目代码发现,不对劲啊,这么没有混淆的迹象?项目组内还一度以为是混淆配置的问题(最近新增了马甲包,以为有影响),所以安排我进行排查。不排查不知道,一排查吓一跳。

过程曲折,略....

最后抓出了如下两个看着人畜无害的小崽子~

-keep @kotlin.Metadata class *
-keepclasseswithmembers @kotlin.Metadata class * { *; }

其广泛分布在内部的不同基础组件模块中,追其历史,已1年有余。究其原因,引用新配置不够严谨,对其影响理解不够深刻。

这配置有什么问题?

它将导致所有的Kotlin代码都不会被编译。

@kotlin.Metadata注解广泛存在于Kotlin代码编译产生的Java文件中,无一幸免,看示例:

image.png

@Metadata是Kotlin反射所使用的注解,具体作用请百度。

建议

如无添加的必要,删除。如必须添加则修改为小范围的匹配规则。例如

-keep @kotlin.Metadata class com.tencent.**
-keepclasseswithmembers @kotlin.Metadata class com.tencent.** { *; }
Ending

经过测试, 批量删除了基础组件模块中的consumer-rules.pro混淆配置后, 混淆就正常了。

附注

截图中所示文件可以查看所编译项目中使用的全部混淆配置规则, 包括app依赖第三方库中的混淆配置和注释等。用于排查混淆规则问题非常有用。

image.png

你可能感兴趣的:(Kotlin混淆踩坑记录)