美文网首页gradle的使用
第三篇:AAR 混淆

第三篇:AAR 混淆

作者: 起了 | 来源:发表于2017-05-08 16:54 被阅读1110次

    【本文由本人原创,转载请注明出处】

    第一篇:Android Studio 打包及引用 AAR(可能是史上最详细的 )
    第二篇:使用 Maven 管理 Android AAR

    通过前面两篇的学习,我们已经知道如何在 Android Studio 建立和引用 AAR,以及通过 Maven 来管理 AAR,这一篇将介绍 AAR 的混淆。

    开启混淆机制


    要开启混淆机制,很简单,只需要将 mykitbuild.gradle 中的 minifyEnabled 设置为 true 即可

        buildTypes {
            release {
                minifyEnabled true
                proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            }
        }
    

    配置混淆规则


    混淆机制开启后,我们打开 mykit 下的 proguard-rules.pro 文件,增加下面的配置

    -keep class com.room.mykit.HCTest {
        public <fields>;
        public <methods>;
    }
    

    这两行的意思是保持 HCTest 类的 public 方法和 public 变量,也就是不进行混淆。

    发布 AAR 新版本

    1. 打开 mykit 下的 build.gradle 文件,修改 versionName
    defaultConfig {
            minSdkVersion 19
            targetSdkVersion 25
            versionCode 1
            versionName "1.2"
    
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    
    1. 然后再次双击 Android studio 右侧的 gradle 侧边栏中的 uploadArchives

    双击 uploadArchiver 时,如果遇到以下错误提示:
    Warning:Exception while processing task java.io.FileNotFoundException: xxx/build/intermediates/proguard-rules/release/aapt_rules.txt (No such file or directory)
    这时点击 Android Stuidio 的 Build -> Clean Project 菜单,再次双击 uploadArchiver 即可。

    1. 打开文件夹 /Users/xxx/Desktop/mykit ,可以看到多了一个 1.2 版本
    2. myKit-1.2.aar 解压,用 JD-GUI 打开 classes.jar,可以看到除 public 方法和 public 变量外,其余代码已经混淆。
    package com.room.mykit;
    
    public class HCTest
    {
      private static final Object a = new Object();
      private static HCTest b;
      
      public static HCTest getInstance()
      {
        synchronized (a)
        {
          if (b == null) {
            b = new HCTest();
          }
          return b;
        }
      }
      
      public String getMsg()
      {
        return "getMsg000";
      }
    }
    

    增加私有类再混淆


    1.在 mykit 下增加一个 HCTestSub 类,代码如下:

    class HCTestSub {
        private static final Object mLock = new Object();
        private static HCTestSub mInstance;
        public static HCTestSub getInstance() {
            synchronized(mLock) {
                if (mInstance == null) {
                    mInstance = new HCTestSub();
                }
                return mInstance;
            }
        }
    
        public String getMsg() {
            return "HCTestSub_getMessage";
        }
    
    }
    

    2.修改 HCTest 的代码如下:

    public class HCTest {
    
        private static final Object mLock = new Object();
        private static HCTest mInstance;
        public static HCTest getInstance() {
            synchronized(mLock) {
                if (mInstance == null) {
                    mInstance = new HCTest();
                }
                return mInstance;
            }
        }
    
        public HCTest() {}
    
        public String getMsg() {
            return getMessage();
        }
    
        private String getMessage() {
            return HCTestSub.getInstance().getMsg();
        }
    }
    

    3.打开 mykit 下的 build.gradle 文件,修改 versionName

    defaultConfig {
            minSdkVersion 19
            targetSdkVersion 25
            versionCode 1
            versionName "1.3"
    
            testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        }
    

    4.然后再次双击 Android studio 右侧的 gradle 侧边栏中的 uploadArchives
    5.打开文件夹 /Users/xxx/Desktop/mykit/1.3,将 myKit-1.3.aar 解压,用 JD-GUI 打开 classes.jar

    • HCTest 的代码:
    package com.room.mykit;
    
    public class HCTest
    {
      private static final Object a = new Object();
      private static HCTest b;
      
      public static HCTest getInstance()
      {
        synchronized (a)
        {
          if (b == null) {
            b = new HCTest();
          }
          return b;
        }
      }
      
      public String getMsg()
      {
        return a();
      }
      
      private String a()
      {
        return a.a().b();
      }
    }
    
    • HCTestSub 的代码:
    package com.room.mykit;
    
    class a
    {
      private static final Object a = new Object();
      private static a b;
      
      public static a a()
      {
        synchronized (a)
        {
          if (b == null) {
            b = new a();
          }
          return b;
        }
      }
      
      public String b()
      {
        return "HCTestSub_getMessage";
      }
    }
    

    混淆成功了。

    参考


    混淆配置的规则可参考这篇文章:
    ProGuard 最全混淆规则说明

    相关文章

      网友评论

      • 18010599fbb4:请问下,如果这个library dependencies了一个其他的library ,在打包成.aar时,dependencies的library中的java文件并没有打包进.aar,该如何处理。
        DoubleQ1312:同问,楼主解决了吗?

      本文标题:第三篇:AAR 混淆

      本文链接:https://www.haomeiwen.com/subject/omamtxtx.html