Android ProGuard技术


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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值