代码混淆 以及给.class文件打jar包的方法

工作的时候遇到了要给其他公司提供词典的功能接口,写完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。如下所示:

  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. # "ant.properties", and override values to adapt the script to your
  8. # project structure.
  9. # Project target.
  10. target=android-8
  11. proguard.config=proguard.cfg


这样,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. -keepclasseswithmembernames class * {
  16. native <methods>;
  17. }
  18. -keepclasseswithmembers class * {
  19. public <init>(android.content.Context, android.util.AttributeSet);
  20. }
  21. -keepclasseswithmembers class * {
  22. public <init>(android.content.Context, android.util.AttributeSet, int);
  23. }
  24. -keepclassmembers class * extends android.app.Activity {
  25. public void *(android.view.View);
  26. }
  27. -keepclassmembers enum * {
  28. public static **[] values();
  29. public static ** valueOf(java.lang.String);
  30. }
  31. -keep class * implements android.os.Parcelable {
  32. public static final android.os.Parcelable$Creator *;
  33. }

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

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

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

 

(二)Jocky

以下转自 http://63542424.blog.163.com/blog/static/188839002010111322837761/

jocky配置使用

 

1、下载jocky,解压后把整个文件夹复制到Eclipse的plugin目录。
2、重启Eclipse,在项目上点右键,如果出现jocky菜单,则安装成功。
3、在项目上点右键,选菜单jocky->jocky setting,弹出菜单后设置如图
  代码混淆 <wbr>以及给.class文件打jar包的方法

4、点ok后,将在项目的根目录下生成一个jocky_build.xml文件,事实上是一个ant build文件。打开这个文件,作适当修改
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- WARNING: Jocky autogenerated file.
Any modifications will be overwritten.
-->
<project basedir="." default="build" name="iSzmap.Android.public.jocky">
<property name="jocky.jar" value="D:\eclipse-jee-galileo-SR1-win32-2\eclipse\plugins\org.apusic.jocky_1.0.3\jocky.jar"/>
<property name="jocky.output.dir" value="jocky"/>
<property name="jocky.scramble.level" value="package"/>
<property name="target" value="1.5"/>
<path id="project.classpath"><path>
<pathelement location="bin/classes"/>
<pathelement location=""D:\eclipse\android-sdk-windows\platforms\android-7\android.jar""/>
</path>
<target name="init">
<jocky jar="${jocky.jar}" level="${jocky.scramble.level}"/>
<mkdir dir="${jocky.output.dir}"/>
<mkdir dir="${jocky.output.dir}/bin"/>
</target>
<target name="clean">
<delete dir="${jocky.output.dir}/bin"/>
<delete dir="${jocky.output.dir}"/>
</target>
<target depends="init" name="build">
<echo message="${ant.project.name}: ${ant.file}"/>
<jocky enable="true"/>
<javac destdir="${jocky.output.dir}/bin" target="${target}" encoding="UTF-8">
<src path="src/com/miracle"/>
<classpath refid="project.classpath"/>
</javac>
</target>
</project>
注意红色的部分第一部分是添加编译时需要的额外的类包(android项目都要写上sdk中android.jar的路径);第二部分是设定java源文件的编码,如果您的文件中有中文的话,须设定编码( lee我的项目有中文,但是没写encoding=‘UTF-8’也混淆成功了); 第三部分是设定要混淆的源文件的目录(必须是包,而不是单个的java类文件),因为有时候我们只想输出src目录下的部分 而不是全部。
5、保存后选jocky-jocky Now就可以进行混码了。混码成功则会显示  BUILD SUCCESSFUL
 
混淆后的文件位置:
在wordkspace的当前项目的文件夹中有一个jocky文件夹,在jocky/bin/classes下是混淆后的 .class文件
 
然后就到了打jar包的环节了~~,以下是lee我自己发现滴,呦嘻~ :)
 
(三)用eclipse将.class文件打成jar包
 
首先要注意一个很重要的问题!!:
 
“类名”:类名都是要带上它所在的包名,才算是全名!
  所以要把.class文件打成jar包时,必须放在与当初.java类的包相同名的文件夹层次下才行!
(接着上边jocky“混淆后的文件位置”说:)按以下步骤做即可:
(1)  将jocky/bin/classes下的整个文件夹复制,
(2) 将复制的文件夹粘贴到 eclipse中的某个项目下
        (任何一个项目都可,或新建一个项目也行,只为打jar包而已了),
(3) 在粘贴后的这个文件夹上点右键 选择 Export --> Java --> JAR file -->
                                                                              Next-->选择项目下的这个文件夹-->在jar file确定输出路径
                                                                              ---> finish 完成!
 
 
【最后强调一次,一定要注意包名的问题!否则jar包中的类在程序中会找不到的!因为系统是按着源文件的包名类名来找的!】
 
  代码混淆 <wbr>以及给.class文件打jar包的方法

 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值