Android Proguard 详解

来源:互联网 发布:淘宝怎么看买家评星 编辑:程序博客网 时间:2024/06/04 17:45

一般的商业项目都需要对代码进行加密,Android提供了一种代码混淆方法,介绍如下:

一、简介

1、简介

混淆器通过删除从未用过的代码和使用晦涩名字重命名类、字段和方法,对代码进行压缩,优化和混淆。结果是一个比较小的.apk文件,该文件比较难进行逆向工程。因此,当你的应用程序对安全敏感(要求高),例如当你授权应用程序的时候,混淆器是一种重要的保护手段。

混淆器被集成在android 构建系统中,所以你不必手动调用它。同时混淆器仅在发布模式下进行构建应用程序的时候才会运行起来,所以在调试模式下构建程序时,你不必处理混淆代码。让混淆器运行起来是可选择的,但是推荐选上。

2.注意事项

       在新版本的ADT创建项目时,混码的文件不再是proguard.cfg,而是project.properties和proguard-project.txt。

如果需要对项目进行全局混码,只需要进行一步操作:

将project.properties的中

“#  proguard.config=${sdk.dir}/tools/proguard/proguard-android.txt:proguard-project.txt”的“#”去掉就可以了。


     如果有一些代码不能被混淆,比如需要加入了so文件,需要调用里面的方法,那么调用JNI访问so文件的方法就不能被混码。在导出的时候,可能不会报错。但是在手机上运行的时候,需要调用so文件的时候,就会报某某方法无法找到。这个时候就需要用到proguard-project.txt。

二、在Eclipse中启用ProGuard

1、确定Android SDK目录下是否存在proguard文件夹
例如   D:\Environment\android-sdk-windows\tools\proguard
2、配置
   1)检查项目根目录下是否存在proguard.cfg(或proguard-project.txt)文件,如果不存在(说明的当前的项目是2.3以前的项目),需要新建一个2.3的android项目,从该项目中将proguard.cfg文件拷贝到你的项目根目录中,无需改动(除非你明白如何自定义自己的混淆策略),继续下面步骤。
   2)如果存在,则找到项目根目录下的default.properties[如果你使用的是ADT14或者更高版本,那么项目中没有default.properties文件,只有project.properties文件,找到project.properties文件即可]文件,在文件中增加一项配置:proguard.config=proguard.cfg
这样就完成了配置

3.语法规则

# android 原始混淆模板  # -------------------------------------    # ----------------------------------  #  通过指定数量的优化能执行  #  -optimizationpasses n  # ----------------------------------  -optimizationpasses 5    # ----------------------------------  #   混淆时不会产生形形色色的类名   #   -dontusemixedcaseclassnames  # ----------------------------------  #-dontusemixedcaseclassnames  # ----------------------------------  #      指定不去忽略非公共的库类  #  -dontskipnonpubliclibraryclasses  # ----------------------------------  #-dontskipnonpubliclibraryclasses    # ----------------------------------  #       不预校验  #    -dontpreverify  # ----------------------------------  # -dontpreverify    # ----------------------------------  #      输出生成信息  #       -verbose  # ----------------------------------  -verbose    # ----------------------------------  #        优化选项  #   optimizations  {optimization_filter}   # ----------------------------------  -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*    -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 com.android.vending.licensing.ILicensingService    -keepclasseswithmembernames class * {      native <methods>;  }  # -----------------  # modify 修改合并  # -----------------  -keep public class * extends android.view.View {      public <init>(android.content.Context);      public <init>(android.content.Context, android.util.AttributeSet);      public <init>(android.content.Context, android.util.AttributeSet, int);      public void set*(...);  }    -keepclassmembers enum * {      public static **[] values();      public static ** valueOf(java.lang.String);  }    -keep class * implements android.os.Parcelable {    public static final android.os.Parcelable$Creator *;  }    #--------------------------  # 保护类型   -keepattributes 说明  # Exceptions, Signature, Deprecated, SourceFile, SourceDir, LineNumberTable, LocalVariableTable,   # LocalVariableTypeTable, Synthetic, EnclosingMethod, RuntimeVisibleAnnotations, RuntimeInvisibleAnnotations,   # RuntimeVisibleParameterAnnotations, RuntimeInvisibleParameterAnnotations, and AnnotationDefault  # --------------------  -keepattributes **  -libraryjars <java.home>/lib/rt.jar    # ----------------------  #  不压缩指定的文件  #  -dontshrink  # ----------------------  -dontshrink    # ----------------------  #  不优化指定的文件  #  -dontoptimize  # -----------------------  -dontoptimize    # -----------------------  #  不混淆指定的文件  #  -dontobfuscate  # -----------------------    # ----- 混淆包路径 -------  -repackageclasses ''  -flattenpackagehierarchy ''  -target 1.6    # -------- 以下是使用了 roboguice-1.1.2.jar 以及 guice-2.0-no_app.jar 功能需要保护的字段及类相关 --------  -keep class com.google.inject.Binder  -keepclassmembers class * {      @com.google.inject.Inject <init>(...);  }  -keepclassmembers class * {      void *(**On*Event);   }  -keepclassmembers class **.R$* {      public static <fields>;  }    # ------ 编译时需要用到的 jar 包  -libraryjars D:/dev_rc/android-sdk-windows/add-ons/addon_google_apis_google_inc_11/libs/maps.jar    # ------ 保护 谷歌第三方 jar 包,界面特效 ----------  -keep class android.support.v4.**  -dontwarn android.support.v4.**    # ------ 保护百度地址jar包 --------  -keep class com.baidu.mapapi.** { *; }  -dontwarn com.baidu.mapapi.**    # --- 打包时忽略以下类的警告 --  -dontwarn com.classpackage.AA    #-keepnames class * implements java.io.Serializable  # ---------保护所有实体中的字段名称----------  -keepclassmembers class * implements java.io.Serializable {      <fields>;  }    # --------- 保护类中的所有方法名 ------------  -keepclassmembers class * {      public <methods>;  }  

参考:http://huangyuan.iteye.com/blog/1472732

如有问题请留言,转载注明出处。

2 1
原创粉丝点击