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






0 0