ProgGuard简介
1.一共包括四个功能
- 压缩(Shrink):侦测并移除代码中无用的类,字段,方法,特性。
- 优化(Optimize):对字节码进行优化,移除无用的指令
- 混淆(Obfuscate):使用a,b,c,d这样简短而无意义的名称,对,类,字段,方法进行重命名
- 预检(Preveirfy):在java平台上对处理后的代码进行预检。
Studio中混淆文件的配置
1.只需要在 build.grade 的配置文件中配置如下即可:
buildTypes {
debug {
versionNameSuffix ".dev"
}
release {
debuggable false
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
signingConfig signingConfigs.release
}
}
2.AndroidStudio默认生成了proguard-rules.pro 文件
如何写一个ProGuard文件
1.基本混淆
#代码混淆压缩比,在0 - 7 之间,默认为5,一般不需要修改
-optimizationpasses 5
#混淆时不使用大小写混合,混淆后的类名为小写
-dontusemixedcaseclassnames
#指定不去忽略非公共的库的类
-dontskipnonpubliclibraryclasses
#不需要校验,去掉这步可以加快混淆速度
-dontpreverify
#混淆后会生成映射文件,包含类名->混淆后类名的映射关系,然后使用printmapping指定映射文件的名称
-verbose
-printmapping proguardMapping.txt
#指定混淆时采用的算法,Google默认推荐的算法,一般不改变
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
#保护代码中的Annotation不被混淆,这在JSON实体映射时非常的重要,比如fastJson
-keepattributes *Annotation*
#避免混淆泛型
-keepattributes Signature
#抛出异常时,保留代码行号
-keepattributes SourceFile,LineNumberTable
#项目中用到的jar都声明进来
-libraryjars libs/apns_1.0.6.jar
-libraryjars libs/armeabi/libBaiduMapSDK_v2_3_1.so
-libraryjars libs/armeabi/liblocSDK4.so
-libraryjars libs/baidumapapi_v2_3_1.jar
-libraryjars libs/core.jar
-libraryjars libs/gesture-imageview.jar
-libraryjars libs/gson-2.0.jar
-libraryjars libs/infogracesound.jar
-libraryjars libs/locSDK_4.0.jar
-libraryjars libs/ormlite-android-4.48.jar
-libraryjars libs/ormlite-core-4.48.jar
-libraryjars libs/universal-image-loader-1.9.0.jar
#百度地图需要添加如下声明
-keep class com.baidu.** { *; }
-keep class vi.com.gdi.bgl.android.**{*;}
#保留四大组件的子类,Application,Fragment等,因为这些子类都有可能被外部调用
-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.support.v4.**
-keep public class com.android.vending.licensing.ILicensingService
-keep class com.google.gson.stream.** { *; }
-keep class com.google.gson.examples.android.model.** { *; }
-keep class com.uuhelper.Application.** { *; }
-keep class net.sourceforge.zbar.** { *; }
-keep class com.google.android.gms.** { *; }
-keep class com.bank.pingan.model.** { *; }
-keep public class * extends com.j256.ormlite.android.apptools.OrmLiteSqliteOpenHelper
-keep public class * extends com.j256.ormlite.android.apptools.OpenHelperManager
-keep class com.android.vending.licensing.ILicensingService
-keep class android.support.v4.** { *; }
-keep class org.apache.commons.net.** { *; }
-keep class com.tencent.** { *; }
-keep class com.umeng.** { *; }
-keep class com.umeng.analytics.** { *; }
-keep class com.umeng.common.** { *; }
-keep class com.umeng.newxp.** { *; }
-keep class com.j256.ormlite.** { *; }
-keep class com.j256.ormlite.android.** { *; }
-keep class com.j256.ormlite.field.** { *; }
-keep class com.j256.ormlite.stmt.** { *; }
#保留本地的native方法不被混淆
-keepclasseswithmembernames class * {
native <methods>;
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet);
}
-keepclasseswithmembernames class * {
public <init>(android.content.Context, android.util.AttributeSet, int);
} <span>
</span><span></span><pre name="code" class="java"><span>#所有View的子类及其子类的get、set方法都不进行混淆
</span>
-keepclassmembers public class * extends android.view.View {
void set*(***);
*** get*();
}
#枚举类不能被混淆 -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); }
#保留Parcelable序列化的类不被混淆-keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } # 对于R下的所有类及其方法都不能被混淆 -keep public class **.R$*{ *; }
#如果有引用android-support-v4.jar包,可以添加下面
-dontwarm android.support.v4.**
-keep class android.support.v4.** { *; }
-keep interface android.support.v4.app.** { *; }
-keep public class * extends android.support.v4.**
-keep public class * extends android.app.Fragment
针对App的量身定制
1.保留实体类和成员不被混淆
-keep public class com.youndheart.entity.**{
public void set * (***);
public *** get*();
public *** is*();
}
2.内嵌类
比如,MainActivity的所有内嵌类:
-keep class com.example.youngheart.MainActivity$* { *;}
3.对WebView,如何项目中使用的比较复杂的话的处理
-keepclassmembers class * extends android.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.对JavaScript的处理
html调用android的方法,例如,JSInterface是MainActivity的子类,所以保留指令要这么写:
-keepclassmembers class com.example.youngheart.MainActivity$JSInterface1 {
<methods>;
}
5.对于自定View的解决方案
但凡是在layout目录下的xml布局文件中配置的自定义View,都不鞥进行混淆
6.对于第三方SDK,一般是参考其官方文档
官方文档:
http://proguard.sourceforge.net/index.html#manual/usage.html
其他参考文档:
http://blog.csdn.net/lovexjyong/article/details/24652085