【HarmonyOS】代码混淆之@Keep 原创 精华
一、背景介绍
最近在社区问答中看到有人提问,请问鸿蒙中有没有@Keep注解。我作为一个从Android开发中转型过来的人,对此问题就产生的特别的兴趣,并激发了我那颗求知欲望极强的好奇心。
经过一番研究,弄懂了Android开发中的@Keep注解来源和原理,已经实验的成功,就产生了这边文章,探索怎么在HarmonyOS应用开发中,使用@Keep注解来管理代码混淆。
二、@Keep注解来源
@Keep注解是Android开发support包中提供的一个注解工具类,这个注解工具类是用纯java annotation特性写的。@Keep因是java注解的一个特性工具类,原则上是只和java相关,不依赖于Android任何东西。
在鸿蒙的java应用开发中,DevEco Studio工具中的代码混淆操作,也是使用的和Android Studio工具一样的代码混淆工具ProGuard,而且都是基于Gradle语法编译。
综合上面所讲,所以我就大胆的预测,Android support下的@Keep注解包,在鸿蒙应用开发中也是可以直接使用的。
三、验证猜测结果
既然有了预测结论,那就大胆实验验证。从Android开发环境中,把androix库中的annotation-1.0.0.jar包拷贝出来。
-
将annotation-1.0.0.jar包文件导入到鸿蒙工程entry的libs目录下面,作为第三方库使用。
-
修改entry工程的build.gralde文件的混淆配置,proguardEnabled属性改为true,开启工程代码混淆功能。
ohos { compileSdkVersion 5 defaultConfig { compatibleSdkVersion 5 } buildTypes { release { proguardOpt { proguardEnabled true rulesFiles 'proguard-rules.pro' } } debug { proguardOpt { proguardEnabled true rulesFiles 'proguard-rules.pro' } } } }
-
修改proguard-rules.pro混淆配置规则文件,添加如下混淆规则。将@Keep注解类加入规则中。
#打印混淆信息 -verbose #代码优化选项,不加该行会将没有用到的类删除,这里为了验证时间结果而使用,在实际生产环境中可根据实际需要选择是否使用 -dontshrink -dontwarn androidx.annotation.Keep #保留注解,如果不添加改行会导致我们的@Keep注解失效 -keepattributes *Annotation* -keep @androidx.annotation.Keep class **{ @androidx.annotation.Keep <fields>; @androidx.annotation.Keep <methods>; }
-
修改代码,使用@Keep注解标记类、属性和方法。
import androidx.annotation.Keep; import ohos.agp.colors.RgbColor; @Keep public class PageInfo { @Keep private String content; private RgbColor color; public String getContent() { return content; } @Keep public void setContent(String content) { this.content = content; } public RgbColor getColor() { return color; } public void setColor(RgbColor color) { this.color = color; } }
-
构建代码,查看编译出来的class文件混淆信息。结果验证了猜测的准确性,被@Keep标记的类、属性和方法都没有被混淆。
四、@Keep分离
尽管使用androidx的annotation包可以达到使用的效果,秉着和Android系统分离的原则(免得又被人抓住证据说是鸿蒙套壳Android),以至于需要依赖Android的库文件,我就自己重写了一下@Keep注解,并做成了开源库,取名ohosx-annotation,并把代码开源到码云Gitee上,这样子就可以独立使用@Keep注解了,也避免了使用androidx库引入一大堆不需要的库文件。
ohosx-annotation库的使用方法很简单,和上述验证步骤一样,只是导入@Keep注解jar包库的方式修改一下就可以了,引入方式如下:
-
在项目根目录的build.gradle添加中央仓库
repositories { //... mavenCentral() }
-
在module(如:entry)的build.gradle引用
dependencies { //... implementation 'io.gitee.binai:ohosx-annotation:1.0.0' }
-
proguard-rules.pro文件中的混淆规则修改一下Keep注解的包名。
#打印混淆信息 -verbose #代码优化选项,不加该行会将没有用到的类删除,这里为了验证时间结果而使用,在实际生产环境中可根据实际需要选择是否使用 -dontshrink -dontwarn com.talkweb.ohosx.annotation.Keep #保留注解,如果不添加改行会导致我们的@Keep注解失效 -keepattributes *Annotation* -keep @com.talkweb.ohosx.annotation.Keep class **{ @com.talkweb.ohosx.annotation.Keep <fields>; @com.talkweb.ohosx.annotation.Keep <methods>; }
五、总结
一次问答,一次探索,就诞生了一个新的鸿蒙开源库。