Android ProGuard技术
来源:互联网 发布:网络平台营业执照 编辑:程序博客网 时间:2024/06/11 03:25
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
- Android ProGuard技术详解
- Android ProGuard技术
- Android 2.3 代码混淆proguard技术介绍
- Android 2.3 代码混淆proguard技术介绍
- Android 2.3 代码混淆proguard技术介绍
- Android 2.3 代码混淆proguard技术介绍
- Android 2.3 代码混淆proguard技术介绍
- Android 2.3 代码混淆proguard技术介绍
- Android 4.0 ProGuard 代码混淆技术
- Android 2.3 代码混淆proguard技术介绍
- Android & proguard
- android proguard
- android proguard
- android proguard
- Android ProGuard
- Android Proguard
- android proguard
- android proguard
- 微信测试号Scope参数列表错误或没有Scope权限
- Android Studio 插件
- hdu 3303(线段树+抽屉原理)
- 一个jdbc工具类和批处理的例子
- centos系统中perl进程病毒占用大量网络流量导致网络瘫痪的问题分析及解决方案
- Android ProGuard技术
- windows 内存管理方式及其优缺点
- 【HDU2222】Keywords Search——AC自动机基础
- [自动机与树]
- 关于堆栈、内存分配
- Java集合框架:TreeMap
- 修改IP的脚本
- Maximum GCD
- nrf51822 --- ancs(1)