Android Java混淆(ProGuard)

系统 2099 0

 

ProGuard 简介

       ProGuard 是一个 SourceForge 上非常知名的开源项目。官网网址是: http://proguard.sourceforge.net/

       Java 的字节码一般是非常容易反编译的。为了很好的保护 Java 源代码,我们往往会对编译好的 class 文件进行混淆处理。 ProGuard 的主要作用就是混淆。当然它还能对字节码进行缩减体积、优化等,但那些对于我们来说都算是次要的功能。

        引用 ProGuard 官方的一段话来介绍就是:

       ProGuard is a free Java class file shrinker, optimizer, obfuscator, and preverifier. It detects and removes unused classes, fields, methods, and attributes. It optimizes bytecode and removes unused instructions. It renames the remaining classes, fields, and methods using short meaningless names. Finally, it preverifies the processed code for Java 6 or for Java Micro Edition.


Android Eclipse
开发环境与ProGuard

        Android 2.3 以前,混淆 Android 代码只能手动添 proguard 来实现代码混淆,非常不方便。而 2.3 以后, Google 已经将这个工具加入到了 SDK 的工具集里。具体路径: SDK\tools\proguard 。当创建一个新的 Android 工程时,在工程目录的根路径下,会出现一个 proguard 的配置文件 proguard.cfg 。也就是说,我们可以通过简单的配置,在我们的 elipse 工程中直接使用 ProGuard 混淆 Android 工程。

        具体混淆的步骤非常简单。首先,我们需要在工程描述文件 default.properties 中,添加一句话,启用 ProGuard 。如下所示:

 

 

 1  # This file is automatically generated by Android Tools.
 2  # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
 3  # 
 4  # This file must be checked in Version Control Systems.
 5  # 
 6  # To customize properties used by the Ant build system use,
 7  # "build.properties", and override values to adapt the script to your
 8  # project structure.
 9  # Indicates whether an apk should be generated for each density.
10  split.density=false
11  # Project target.
12  target=android-10
13  proguard.config=proguard.cfg
14  


        这样, Proguard 就可以使用了。当我们正常通过 Android Tools 导出 Application Package 时, Proguard 就会自动启用,优化混淆你的代码。

 

 

 

      
    导出成功后,你可以反编译看看混淆的效果。一些类名、方法名和变量名等,都变成了一些无意义的字母或者数字。证明混淆成功!


proguard.cfg
配置

        稍微深入想一下混淆后的结果,你就会发现,如果一些提供给外部的类、方法、变量等名字被改变了,那么程序本身的功能就无法正常实现。那么 Proguard 如何知道哪些东西是可以改名,而哪些是不能改变的呢?

        这个是靠 proguard.cfg 文件来进行配置的。 Android 工程中默认自动生成的 proguard.cfg 已经针对 Android 的一般情况进行了配置,我们打开这个配置文件。内容大概如下:

 

 

 1  -optimizationpasses 5
 2  -dontusemixedcaseclassnames
 3  -dontskipnonpubliclibraryclasses
 4  -dontpreverify
 5  -verbose
 6  -optimizations !code/simplification/arithmetic,!field/*,!class/merging/*
 7  -keep public class * extends android.app.Activity
 8  -keep public class * extends android.app.Application
 9  -keep public class * extends android.app.Service
10  -keep public class * extends android.content.BroadcastReceiver
11  -keep public class * extends android.content.ContentProvider
12  -keep public class * extends android.app.backup.BackupAgentHelper
13  -keep public class * extends android.preference.Preference
14  -keep public class com.android.vending.licensing.ILicensingService
15  
16  -keepclasseswithmembernames class * {
17      native <methods> ;
18  }
19  
20  -keepclasseswithmembernames class * {
21      public <init>(android.content.Context, android.util.AttributeSet) ;
22  }
23  
24  -keepclasseswithmembernames class * {
25      public <init>(android.content.Context, android.util.AttributeSet, int) ;
26  }
27  
28  -keepclassmembers enum * {
29      public static ** []  values() ;
30      public static ** valueOf(java.lang.String) ;
31  }
32  
33  -keep class * implements android.os.Parcelable {
34    public static final android.os.Parcelable$Creator * ;
35  }
36  


    它主要保留了继承自 Activity Application Service BroadcastReceiver ContentProvider BackupAgentHelper Preference ILicensingService 的子类。因为这些子类,都是可能被外部调用的。

另外,它还保留了含有 native 方法的类、构造函数从 xml 构造的类(一般为 View 的子类)、枚举类型中的 values valueOf 静态方法、继承 Parcelable 的跨进程数据类。

        在实际的一个工程项目中,可能 Google 自动生成的配置不能胜任我们的混淆工作。所以,我们往往需要自己编写一些 ProGuard 配置。这方面的资料在官网的 Manual -> Usage 里有详细说明。大家可以研究一下。

 

  转载: http://www.blogjava.net/zh-weir/archive/2011/07/12/354190.html  

 

Android Java混淆(ProGuard)


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论