您的位置:首页 > 移动开发 > Android开发

Android ProGuard技术

2016-03-17 19:37 447 查看
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混淆