Proguard代码混淆

来源:互联网 发布:和女生网络聊天用语 编辑:程序博客网 时间:2024/05/16 11:01

代码混淆是一件非常繁琐的事情,大量的第三方库和引用代码的混淆设置非常容易错,http://proguard.herokuapp.com/这可以帮助开发者快速地生成第三方库可以使用的混淆代码设置

Proguard原理:
java代码编译成二进制的class文件,这个class也可以反编译成源代码,除了注解外原来的code基本都可以看到。为了防止代码code被泄露,我们往往需要混淆–把方法、字段、包和类这些java元素改成无意义的abc等表示。这样代码结构没有变化,还可以运行,但要弄懂代码很难,而且可以删除无效的代码和代码优化。
缺省的情况下,Proguard会混淆所有代码,但是有一些情况是不能混淆的,否则系统找不到会奔溃,如下代码混淆的规则:
1.用到反射的地方
2.接口,比如带有回掉方法的,这种情况较为复杂,不混淆
3.枚举不混淆
4.实体类不混淆
5.内嵌类不混淆
6.自定义控件不混淆
7.android Resource文件引用不混淆
8.android序列化也不混淆
9.数据库驱动不混淆
10.android R文件不混淆
11.引用的第三方库针对性不混淆

下面是Proguard文件的构建
基本的配置

################# 基本指令 #######################代码的压缩级别, 0~7之间,默认为5-optimizationpasses 5#包名不混合大小写,混淆后的类名为小写(主要针对windows用户的配置)-dontusemixedcaseclassnames#不去忽略非公共的库类-dontskipnonpubliclibraryclasses#不去忽略非公共的库的类的成员-dontskipnonpubliclibraryclassmembers#优化 不优化输入的类文件-dontoptimize#不做预校验(Android不需要此步骤,跳过可加快混淆速度)-dontpreverify#混淆后生成映射文件-->(包含有类名->混淆后类名的映射关系)-verbose#指定映射文件的名称-printmapping proguardMapping.txt#-applymapping proguardMapping.txt#混淆时所采用的算法,谷歌推荐,一般不改变-optimizations !code/simplification/arithmetic,!field/,!class/merging/#保护代码中的Annotation不被混淆,在使用如fastJSON时的实体映射-keepattributes *Annotation*#避免混淆泛型,在使用如fastJSON时的实体映射-keepattributes Signature#抛出异常时保留代码行号-keepattributes SourceFile,LineNumberTable#忽略警告-ignorewarning#记录生成的日志数据,gradle build时在本项目根目录输出#apk 包内所有 class 的内部结构-dump class_files.txt#未混淆的类和成员-printseeds seeds.txt#列出从 apk 中删除的代码-printusage unused.txt################# 需要保留的东西 #######################保留所有的本地native方法不被混淆-keepclasseswithmembernames class * {    native <methods>;}#保持哪些类不被混淆-keep public class * extends android.app.Fragment-keep public class * extends android.app.Activity-keep public class * extends android.app.Application-keep public class * extends android.app.Service-keep public class * extends android.content.BroadcastReceiver-keep public class * extends android.content.ContentProvider-keep public class * extends android.app.backup.BackupAgentHelper-keep public class * extends android.preference.Preference-keep public class * extends android.view.View-keep public class com.android.vending.licensing.ILicensingService#如果有引用v4包可以添加下面这行-keep public class * extends android.support.v4.app.Fragment#保留在Activity中的方法参数是view的方法,从而在layout里编写的onClick不会被影响-keepclassmembers class * extends android.app.Activity{    public void *(android.view.View);}#枚举类不能被混淆-keepclassmembers enum * {    public static **[] values();    public static ** valueOf(java.lang.String);}#保留自定义控件(继承自view)不被混淆-keep public class * extends android.view.View{    ** get*();    void set*(***);    public <init>(android.content.Context);    public <init>(android.content.Context, android.util,AttributeSet);    public <init>(android.content.Context, android.util,AttributeSet, int);}#保留Parcelable序列final android.os.Parcelable$Creator *;}#保留Serialable序列化的类不被混淆-keepclassmembers class * implements java.io.Serializable{    static final long serialVersionUID;    private static final java.io.ObjectStreamField[] serialPersistenFields;    private void writeObject(java.io.ObjectOutputStream);    private void readObject(java.io.ObjectInputStream);    java.lang.Object writeReplace();    java.lang.Object reaesolve();}#对于R(被混淆-keep class **.R$* {    *;}

针对自己的app的代码混淆

############## 针对app定制 ###########1. 保护实体类和成员-keep public class com.msqsoft.hodicloud.model.** {*;}#2. 很重要,内嵌类要保留-keep class com.msqsoft.hodicloud.activity.IndicatorActivity$*{    *;}#3. 数据库驱动不被混淆#-keep class com.msqsoft.hodicloud.database.** {*;}#3. 对webView的处理(webview设计复杂操作情况的话,必不可少)-keepclassmembers class * extends anroid.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, java.lang.String);}# 4. 请求包不被混淆-keep class cn.hodi.hodicloudnetworkservice.** {*;}# 5. adapter不被混淆-keep class com.msqsoft.hodicloud.adapter.** {*;}#6. 第三方SDK的混淆处理# butterknife:7.0.1-keep class butterknife.** {*;}#-dontwarn butterknife.internal.**  -keep class **$$ViewBinder {*;}#-keepclasseswithmembernames class *{#    @butterknife.* <fields>;#}#-keepclasseswithmembernames class *{#    @butterknife.* <methods>;#}-keep public class cn.jpush.** {*;}-keep public class com.google.** {*;}-keep public class com.readystatesoftware.viewbadger.** {*;}
0 0
原创粉丝点击