`
gjhappyyy
  • 浏览: 255639 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

如何混淆Android项目代码(ProGuard)

 
阅读更多

ProGuard简介

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

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

 

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。如下所示:

[java] view plaincopy
  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  

 

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


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

 

proguard.cfg配置

 

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

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

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

 

 它主要保留了继承自ActivityApplicationServiceBroadcastReceiverContentProviderBackupAgentHelperPreferenceILicensingService的子类。因为这些子类,都是可能被外部调用的。

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

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

【转】http://blog.csdn.net/hustpzb/article/details/6837785

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics