第三篇:AAR 混淆
【本文由本人原创,转载请注明出处】
第一篇:Android Studio 打包及引用 AAR(可能是史上最详细的 )
第二篇:使用 Maven 管理 Android AAR
通过前面两篇的学习,我们已经知道如何在 Android Studio 建立和引用 AAR,以及通过 Maven 来管理 AAR,这一篇将介绍 AAR 的混淆。
开启混淆机制
要开启混淆机制,很简单,只需要将 mykit
的 build.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 新版本
- 打开
mykit
下的build.gradle
文件,修改versionName
defaultConfig {
minSdkVersion 19
targetSdkVersion 25
versionCode 1
versionName "1.2"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
- 然后再次双击 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
即可。
- 打开文件夹
/Users/xxx/Desktop/mykit
,可以看到多了一个 1.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 最全混淆规则说明