Android Java混淆(ProGuard)

本文介绍ProGuard的基本概念及其在Android开发环境中的使用方法,包括混淆步骤、配置文件proguard.cfg的定制以及如何通过简单的配置实现对Android工程的混淆。此外,文章还提供了ProGuard配置文件中关键部分的解释,以及如何根据实际情况调整配置以满足特定需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文转载别人博客,转载请注明出处:http://www.blogjava.net/zh-weir/archive/2011/07/12/354190.html 

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 -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里有详细说明。大家可以研究一下。


参考资料

ProGuard 官方

Android 2.3 代码混淆proguard技术介绍》

 

 转载请注明出处:http://www.blogjava.net/zh-weir/archive/2011/07/12/354190.html 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值