版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/z740852294/article/details/80757598
ProGuard简介
主要功能:
压缩(shrink):删除无用的类、方法
优化(optimize):对字节码优化,删除无用指令
混淆(obfuscate):对类、方法进行重命名
预检(preveify):代码预检
ProGuard 开源地址:https://sourceforge.net/projects/proguard/
模板
#-------------------------------------------基本不用动区域--------------------------------------------
#---------------------------------基本指令区----------------------------------
#代码混淆压缩比,0-7之间,默认为5,一般不需要修改
-optimizationpasses 5
#混小时不使用大小写混合,混淆后的类名为小写
-dontusemixedcaseclassnames
#指定不去忽略非公共的库的类
-dontskipnonpubliclibraryclasses
#指定不去忽略非公共的库的类的成员
-dontskipnonpubliclibraryclassmembers
#不做预校验,preverify是混淆的4个步骤之一
#android不需要这步骤,去掉可以加快混淆速度
-dontpreverify
#有了verbose这句话,混淆后就会生成映射文件
#包含有类名->混淆后类名的映射关系
#然后使用proguardMapping指定映射文件的名称
-verbose
-printmapping proguardMapping.txt
#指定混淆时采用的算法,后面的参数是一个过滤器
#这个过滤器是谷歌推荐的算法,一般不改变
-optimizations !code/simplification/cast,!field/*,!class/merging/*
#保护代码中的Annotation不被混淆
#这在json实体映射是非常重要,比如fastjson
-keepattributes *Annotation*,InnerClasses
#避免混淆泛型
#这在json实体映射是非常重要,比如fastjson
-keepattributes Signature
#抛出异常是保留代码行号
-keepattributes SourceFile,LineNumberTable
#如果用到了反射需要加入
-keepattributes EnclosingMethod
#----------------------------------------------------------------------------
#---------------------------------默认保留区---------------------------------
#保留了继承自activity、application这些类的子类
#因为这些子类都可能被外部调用
#比如说,第一行就保证了所有的activity的子类不要被混淆
-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
-keep class android.support.** {*;}
#如果有引用android-support-v4.jar包,可以添加下面这行
-keep public class com.tuniu.app.ui.fragment.** {*;}
#保留所有的本地native方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
#保留在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);
}
-keepclasseswithmembers class * {
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
}
#保留Parcelable序列化的类不能被混淆
-keep class * implements android.os.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();
}
#对于R(资源)下所有类机器方法,都不能被混淆
-keep class **.R$* {
*;
}
#对于带有回调函数onXXEvent的,不能被混淆
-keepclassmembers class * {
void *(**On*Event);
}
#----------------------------------------------------------------------------
#---------------------------------webview------------------------------------
-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);
}
#----------------------------------------------------------------------------
#---------------------------------------------------------------------------------------------------
保留区
#---------------------------------1.实体类---------------------------------
#实体类由于涉及到与服务端的交互,各种gson的交互如此等等,是要保留的
-keepclassmembers class com.test.example.activity.** {*;}
-keepclassmembers class com.test.example.fragment.** {*;}
-keepclassmembers class com.test.example.model.** {*;}
-keep class com.test.example.model.** {
public <fields>;
public <methods>;
}
-keep public class com.test.example.R$*{
public static final int *;
}
#-------------------------------------------------------------------------
!!!!!!!!!!!!这里的com.test.example要换成自己的包名!!!!!!!!
#---------------------------------2.第三方包-------------------------------
# -------------------- other ------------------
-keep class org.apache.http.** { *; }
-dontwarn org.apache.http.**
-dontwarn android.net.**
# -------------------- 高德 ------------------
-dontwarn com.amap.api.**
-dontwarn com.a.a.**
-dontwarn com.autonavi.**
-keep class com.amap.api.** {*;}
-keep class com.autonavi.** {*;}
-keep class com.a.a.** {*;}
# -------------------- 百度 ------------------
-keep class com.baidu.** {*;}
-keep class vi.com.** {*;}
-dontwarn com.baidu.**
# -------------------- 支付宝 ------------------
-keep class com.alipay.android.app.IAlixPay{*;}
-keep class com.alipay.android.app.IAlixPay$Stub{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback{*;}
-keep class com.alipay.android.app.IRemoteServiceCallback$Stub{*;}
-keep class com.alipay.sdk.app.PayTask{ public *;}
-keep class com.alipay.sdk.app.AuthTask{ public *;}
-keep class com.alipay.sdk.app.H5PayCallback {
<fields>;
<methods>;
}
-keep class com.alipay.android.phone.mrpc.core.** { *; }
-keep class com.alipay.apmobilesecuritysdk.** { *; }
-keep class com.alipay.mobile.framework.service.annotation.** { *; }
-keep class com.alipay.mobilesecuritysdk.face.** { *; }
-keep class com.alipay.tscenter.biz.rpc.** { *; }
-keep class org.json.alipay.** { *; }
-keep class com.alipay.tscenter.** { *; }
-keep class com.ta.utdid2.** { *;}
-keep class com.ut.device.** { *;}
#==================gson==========================
-keep class sun.misc.Unsafe { *; }
#-keep class com.google.gson.stream.** { *; }
# Application classes that will be serialized/deserialized over Gson
-keep class com.google.gson.examples.android.model.** { *; }
#==================微信==========================
-keep class com.tencent.mm.sdk.** { *;}
#==================imageloader==========================
-keep class com.nostra13.universalimageloader.** { *; }
-keepclassmembers class com.nostra13.universalimageloader.** {*;}
#==================picasso==========================
-keep class com.parse.*{ *; }
-dontwarn com.parse.**
-dontwarn com.squareup.picasso.**
-keepclasseswithmembernames class * {
native <methods>;
}
#==================友盟==========================
-keepclassmembers class * {
public <init> (org.json.JSONObject);
}
-keep public class com.zshy.pwb.R$*{
public static final int *;
}
-keepclassmembers enum * {
public static **[] values();
public static ** valueOf(java.lang.String);
}
-keep class com.umeng.socialize**{*;}
-keep public class * implements com.bumptech.glide.module.GlideModule
-keep public enum com.bumptech.glide.load.resource.bitmap.ImageHeaderParser$** {
**[] $VALUES;
public *;
}
#-------------------------------------------------------------------------
#---------------------------------3.与js互相调用的类------------------------
#-------------------------------------------------------------------------
-keepclassmembers
class com.test.example.activity.MainActivity$JSInterface1{
<methods>;
}
######################## JSInterface1 是js方法所在的类名!!!!!! 没有这里就空着
#---------------------------------4.反射相关的类和方法-----------------------
#----------------------------------------------------------------------------