Android添加混淆规则

2018-05-31  本文已影响0人  X_sky_B

前言

前段时间有用户反馈下载的App有广告的弹窗,但是我们的项目并没有插入广告的功能的。考虑到可能是因为我们上线的项目并没有做混淆的处理,就被有心人植入了广告。所以当务之急就是添加混淆,顺便复习一下混淆。

混淆简介

  1. Android代码混淆是一种应用源代码保护技术,用来防止别人对apk进行逆向分析;
  2. Android2.3开始,Google就在SDK中加入了ProGuard的工具,使用它来进行代码的混淆。
  3. ProGuard是一个压缩、优化和混淆Java字节码文件的免费工具, 其作用有以下几点:
  1. 在实际项目中,有些Java类不能进行混淆,需要配置混淆规则;
  2. 在实际项目中,打包apk时一般都需要进行混淆处理;
  3. 混淆后会生成mapping.txt文件,该文件需要存档以便用来还原和查看混淆后的出错日志;

开启混淆

在项目的build.gradle文件中打开混淆的开关,然后在proguard-rules.pro文件中添加混淆规则即可

buildTypes {
        debug {
            //是否进行混淆
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        release {
            minifyEnabled true          //开启混淆只需要设置为true即可
            //添加混淆规则的位置
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

添加混淆规则

首先介绍一下添加混淆规则中常用到的一些命令的含义,方便我们理解并能够自行添加属于我们项目中的一些混淆规则,然后再介绍一下项目中一些通用的混淆规则。

1. 混淆规则常用到的命令含义:
-keep class packageName.*
-keep class packageName.**
-keep class packageName.* {*;}
-keepclassmembers class packageName.*{*;}
-keep public class * extends android.app.Activity
-keepclassmembers class packageName$内部类名 {         //"$"的含义是保留某类的内部类不会被混淆
   public *;                                        
}
<init>;                //匹配所有的构造器
<fields>;              //匹配所有的域
<methods>;             //匹配所有的方法
//可以在以上的命令前加上public、private、native等来进一步指定不被混淆的内容
//也可以在以上的命令后面加上参数,来指定含有特定的参数构造方法或者方法名不会被混淆

-keep class packageName{
    public <init>;                                  //保留所有的public的构造方法不会被混淆
}

-keep class packageName{
    public <init>(java.lang.String);              //保留所有的public的构造方法并且参数是String对象,不会被混淆
}

-keep class packageName{                              //保留所有的private的方法名不会被混淆
    private <methods>;
}
保留 防止被移除或者被重命名 防止被重命名
类和类成员 -keep -keepnames
仅类成员 -keepclassmembers -keepclassmembernames
如果拥有某成员,保留类和类成员 -keepclasseswithmembers -keepclasseswithmembernames
2. 通用的一些混淆规则:

注:四大组件、Fragment、自定义控件不需要添加混淆规则,因为这些默认是不会被混淆的,所以网上很多四大组件的混淆规则是没必要添加的。

-keepattributes *Annotation*
-keep class **.R$* {*;}
-keepclasseswithmembernames class * {
    native <methods>;
}
-keep class packageName{*;}
-keepattributes Signature
-keep class packageName**
-keep class packageName**{*;}
# 保留枚举类不被混淆
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}
-keep class * implements android.os.Parcelable {
    public static final android.os.Parcelable$Creator *;
}
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    !static !transient <fields>;
    !private <fields>;
    !private <methods>;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}
-keepclassmembers class fqcn.of.javascript.interface.for.webview {
    public *;
}
-keepclassmembers class * extends android.webkit.webViewClient {
    public void *(android.webkit.WebView, java.lang.String, android.graphics.Bitmap);
    public boolean *(android.webkit.WebView, java.lang.String);
}
-keepclassmembers class * extends android.webkit.webViewClient {
    public void *(android.webkit.webView, jav.lang.String);
}
#Android4.2以上需要添加以下的两个混淆配置
-keepattributes *Annotation*
-keepattributes *JavascriptInterface*
-keepclassmembers class packageName$内部类名 {
    public *;
}
上一篇 下一篇

猜你喜欢

热点阅读