工作的时候遇到了要给其他公司提供词典的功能接口,写完java类文件后要打成jar包(打jar包可以把.java文件变成.class文件),属于提供第三方jar包给其他公司。为保护劳动成果,于是接触到了“代码混淆”概念。
-------------------------------------------------------------------------------------------------
java文件编译后会变成 .class的字节码文件,但是通过反编译可以打开.class看到源代码,为了保护代码不被其他人看到,有一种叫做“代码混淆”的技术,通过代码混淆,把代码中有意义的名字换成了无意义的名字,还有设置一些控制上的混乱之类的,最终目的就是叫人看不懂。下面我来记录两种混淆器的使用方法。
(一)Proguard
(android中的Proguard只在产生apk时才会自动发挥作用,只把某些类打成jar包时,并不能自动混淆)
(要想单独使用,在SDK\tools\proguard\lib中有个proguardGUI.jar 双击可直接运行,
(二)Jocky
(据说jocky混淆后的.class不容易被反编译,我用起来感觉还是很方便的,混淆后的文件用反编译软件DJ java decompiler 打开后,还是会看到部分源码,但是有些源码的确是有些混乱)
(如何给混淆后的.class文件打jar包呢~ 经过本人的研究,终于得出了一种简单的方法,将在下面的(三)中说明)
(一)Proguard
在android中 sdk2.3以上的版本自带了 Progurad,可以对代码进行混淆优化等,下面是转自
http://blog.csdn.net/huangbiao86/article/details/6939060
中的一些说明:
在Android 2.3以前,混淆Android代码只能手动添加proguard来实现代码混淆,非常不方便。而2.3以后,Google已经将这个工具加入到了SDK的工具集里。具体路径:SDK\tools\proguard
在eclipse中创建一个新的Android工程时,在工程目录的根路径下,会出现一个proguard的配置文件proguard.cfg。也就是说,我们可以通过简单的配置,在我们的elipse工程中直接使用ProGuard混淆Android工程。
具体混淆的步骤非常简单。首先,我们需要在工程描述文件default.properties中,添加一句话,启用ProGuard。如下所示:
- # This file is automatically generated by Android Tools.
- # Do not modify this file -- YOUR CHANGES WILL BE ERASED!
- #
- # This file must be checked in Version Control Systems.
- #
- # To customize properties used by the Ant build system use,
- # "ant.properties", and override values to adapt the script to your
- # project structure.
- # Project target.
- target=android-8
- proguard.config=proguard.cfg
这样,Proguard就可以使用了。当我们正常通过Android Tools导出Application Package时,Proguard就会自动启用,优化混淆你的代码。
导出成功后,你可以反编译看看混淆的效果。一些类名、方法名和变量名等,都变成了一些无意义的字母或者数字。证明混淆成功!
proguard.cfg配置
稍微深入想一下混淆后的结果,你就会发现,如果一些提供给外部的类、方法、变量等名字被改变了,那么程序本身的功能就无法正常实现。那么Proguard如何知道哪些东西是可以改名,而哪些是不能改变的呢?
这个是靠proguard.cfg文件来进行配置的。Android工程中默认自动生成的proguard.cfg已经针对Android的一般情况进行了配置,我们打开这个配置文件。内容大概如下:
- -optimizationpasses 5
- -dontusemixedcaseclassnam
es - -dontskipnonpubliclibrary
classes - -dontpreverify
- -verbose
- -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
- -keepclasseswithmembernam
es class * { - native <methods>;
- }
- -keepclasseswithmembers class * {
- public <init>(android.content.Context, android.util.AttributeSet);
- }
- -keepclasseswithmembers class * {
- public <init>(android.content.Context, android.util.AttributeSet, int);
- }
- -keepclassmembers class * extends android.app.Activity {
- public void *(android.view.View);
- }
- -keepclassmembers enum * {
- public static **[] values();
- public static ** valueOf(java.lang.String);
- }
- -keep class * implements android.os.Parcelable {
- public static final android.os.Parcelable$Creator *;
- }
它主要保留了继承自Activity、Application、Service、BroadcastReceiver、ContentProvider、BackupAgentHelper、Preference和ILicensingService的子类。因为这些子类,都是可能被外部调用的。
另外,它还保留了含有native方法的类、构造函数从xml构造的类(一般为View的子类)、枚举类型中的values和valueOf静态方法、继承Parcelable的跨进程数据类。
在实际的一个工程项目中,可能Google自动生成的配置不能胜任我们的混淆工作。所以,我们往往需要自己编写一些ProGuard配置。这方面的资料在官网的Manual -> Usage里有详细说明,大家可以研究一下。http://proguard.sourceforge.net/
(二)Jocky
以下转自
jocky配置使用
2、重启Eclipse,在项目上点右键,如果出现jocky菜单,则安装成功。