Proguard代码混淆

代码混淆是一件非常繁琐的事情,大量的第三方库和引用代码的混淆设置非常容易错,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 re



aesolve();
}

#对于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.** {*;}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值