【HarmonyOS】代码混淆之@Keep 原创 精华

拓维信息Abin
发布于 2021-8-27 14:53
浏览
5收藏

一、背景介绍

最近在社区问答中看到有人提问,请问鸿蒙中有没有@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目录下面,作为第三方库使用。
    【HarmonyOS】代码混淆之@Keep-鸿蒙开发者社区

  • 修改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标记的类、属性和方法都没有被混淆。
    【HarmonyOS】代码混淆之@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>;
    }
    

五、总结

一次问答,一次探索,就诞生了一个新的鸿蒙开源库。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
已于2021-9-10 08:53:51修改
6
收藏 5
回复
举报
回复
    相关推荐