Android性能优化Android开发Android开发经验谈

Android 混淆简单入门

2017-09-29  本文已影响85人  AntDream

为什么要进行混淆

混淆是一种安全措施,防止在App发布以后被人反编译出来直接看到源码。做了混淆处理以后即使反编译出来一些类名也变成了Class a,Class b之类的,增加了阅读难度。

混淆以后就一定安全了嘛?

答案显然是否定的。混淆只是增加了反编译App的难度和成本,人家还是能看出你用了哪些开源库,甚至一些业务逻辑。所以,其他的安全措施还是不能少,比如加密与服务端之前的数据请求等

用Android Studio怎么设置混淆

buildTypes {
    release {
        //开启混淆
        minifyEnabled true
        //Zipalign优化
        zipAlignEnabled true
        // 移除无用的resource文件
        shrinkResources true
        //前一部分代表系统默认的android程序的混淆文件,该文件已经包含了基本的混淆声明
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }

    debug {
        minifyEnabled false
        zipAlignEnabled true
        shrinkResources false
    }
}

哪些情况需要添加混淆规则

1.添加了一些有混淆规则要求的三方库

#Glide
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public class * extends com.bumptech.glide.AppGlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
  **[] $VALUES;
  public *;
}
#okhttp
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**

2.实现Parcelable和Serializable接口的类,比如一些需要持久化的实体类,不能混淆,需要添加混淆规则

-keep class * implements Android.os.Parcelable { # 保持Parcelable不被混淆            
    public static final Android.os.Parcelable$Creator *;
}
#保持所有实现 Serializable 接口的类成员
-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
    public <fields>;
}

3.与服务端交互,利用Gson、fastjson等框架解析所用的实体数据类不能混淆

-keep class com.myApp.test.bean.** { *; }

这里需要解释一下上面的命令,表示该包下面的类,*表示该包下面的类和子类,{ *; }表示类里面的内容。所以上面的命令的意思就是保持com.myApp.test.bean包下面的类和子类不混淆,且类里面的方法和变量也不混淆

4.jni方法不能混淆

-keepclasseswithmembernames class * { # 保持native方法不被混淆    
    native <methods>;
}

keepclasseswithmembernames命令的意思是如果拥有某成员,保留类和类成员。以上的命令的意思就是说保留拥有native方法的类和类里面的native方法不混淆

5.WebView的JS调用也需要保证写的接口方法不混淆

# 保持MyWebView的内部类MyJavaScriptInterface不被混淆
-keep public class com..xxx.activity.MyWebView$MyJavaScriptInterface

# 保持MyWebView的内部类MyJavaScriptInterface中的所有public内容不被混淆 
-keep public class com..xxx.activity.MyWebView$MyJavaScriptInterface {
    public *;
}

6.enum类型的2个特殊方法不能被混淆

-keepclassmembers enum  * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

7.反射用的类不能被混淆


ProGuard常用的一些设置选项

#指定压缩级别
-optimizationpasses 5
#不跳过非公共的库的类成员
-dontskipnonpubliclibraryclassmembers
#输出详细日志
-verbose
#保留一些属性,如行号LineNumberTable
-keepattributes LineNumberTable
#优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification
#忽略警告,一般有警告会编译失败,如果是一些无关紧要的警告可以忽略从而顺利打包,否则要修复那些有问题的地方,以免App不能正常使用
-ignorewarnings
#混淆时采用的算法
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#优化时允许访问并修改有修饰符的类和类的成员
-allowaccessmodification

其他的一些设置及信息,可以参考官网---ProGuard

上一篇 下一篇

猜你喜欢

热点阅读