Android 混淆

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)这些方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值