首页 > 代码库 > Android Proguard 详解

Android Proguard 详解

一般的商业项目都需要对代码进行加密,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

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