Android的代码混淆只需要在AS的build.gradle中配置开启即可。
示例代码如下:
buildTypes {
release {
minifyEnabled true // true - 打开混淆
shrinkResources false // true - 打开资源压缩
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro',
'../libModule/proguard-rules.pro' // 用于设置Proguard的规划路径;
}
}
minifyEnabled 为是否打开混淆
shrinkResources 为是否打开资源压缩。即删除APK中多余的资源。
但如果不是对包体大小很敏感,不建议开启,很容易踩坑。因为如果开启了只有在程序中使用了R.xx.xx的资源才不会被删除。而没有被引用或者通过文件名搜索等方法引用的资源,将会被优化掉。
如果一定要使用,注意要把没有被R.xx.xx引用的资源添加到 res–raw—keep.xml。
keep.xml的示例代码:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools"
tools:keep="@drawable/photo1,@drawable/photo2"
proguard-android.txt 是系统默认的混淆文件,具体在…/sdk/tools/proguard/ 目录下,其中包含了 android 最基本的混淆,一般不需要改动.
proguard-rules.pro 是我们需要配置的规则。如果要配置多个Module的混淆文件,只需要后面添加逗号跟混淆文件路径即可。
基本规则:
keep关键字, 保留类和类中的成员,防止它们被混淆或移除。
示例:如果不想某个类中的代码被混淆
-keep public class com.ftsdk.sdk.XSDK {
public static <fields>;
public <methods>;
}
注意如果XSDK类中的方法含有回调,也需要把该回调方法的类也添加到keep中。
例如:XSDK下的floatWindow含有floatWindowListener回调,即:
public void floatWindow(Activity activity, floatWindowListener listener) {
}
那如果想外界正常调用floatWindow方法,则需要把floatWindowListener也添加到keep当中。
示例:
-keep public class com.ftsdk.sdk.XSDK {
<fields>;
<methods>;
}
-keep public class com.ftsdk.sdk.suspendbox.floatWindowListener {
<fields>;
<methods>;
}
其他keep的关键字还有:
keepnames:保留类和类中的成员,防止它们被混淆,但当成员没有被引用时会被移除。
keepclassmembers:只保留类中的成员,防止它们被混淆或移除。
keepclassmembernames:只保留类中的成员,防止它们被混淆,但当成员没有被引用时会被移除。
keepclasseswithmembers:保留类和类中的成员,防止它们被混淆或移除,前提是指名的类中的成员必须存在,如果不存在则还是会混淆。
keepclasseswithmembernames:保留类和类中的成员,防止它们被混淆,但当成员没有被引用时会被移除,前提是指名的类中的成员必须存在,如果不存在则还是会混淆。
通配符:
<field>
匹配类中的所有字段
<method>
匹配类中的所有方法
<init>
匹配类中的所有构造函数
*
匹配任意长度字符,但不含包名分隔符(.)。
比如说我们的完整类名是com.example.test.MyActivity,使用com.*,或者com.exmaple.*都是无法匹配的,因为*无法匹配包名中的分隔符,正确的匹配方式是com.exmaple.*.*,或者com.exmaple.test.*,这些都是可以的。但如果你不写任何其它内容,只有一个*,那就表示匹配所有的东西。
**
匹配任意长度字符,并且包含包名分隔符(.)
***
匹配任意参数类型。
比如void set*(***)就能匹配任意传入的参数类型,*** get*()就能匹配任意返回值的类型。
…
匹配任意长度的任意类型参数。
比如void test(…)就能匹配任意void test(String a)或者是void test(int a, String b)这些方法。