Jocky提供了Eclipse的插件,從而能夠直接在Eclipse中使用Jocky。先下載一個(gè)Jocky for eclipse的插件,然后放到eclipse的plugin文件夾里,然后右鍵單擊項(xiàng)目,會(huì)看到Jocky的選項(xiàng),Jocky與其它混淆編譯器最大的不同之處在于:它是直接從源碼上做文章,也就是說編譯過程本身就是一個(gè)混淆過程。
1. Jocky插件的安裝:
將Jocky插件安裝至Eclipse中非常簡(jiǎn)單,只需要將eclipse/plugins/org.apusic.jocky_1.0.0目錄 copy 至 Eclipse的 plugins目錄即可;蛘咴贓clipse/links文件夾中,通過link方式指定Jocky的插件目錄。
2. 在Eclipse中使用Jocky:
在Eclipse中使用Jocky也非常簡(jiǎn)單,任何一個(gè)Java工程,選中工程通過右鍵菜單,都可以出現(xiàn)Jocky的快捷菜單:
<Jocky在Eclipse中的右鍵菜單>
<Jocky在Eclipse中的屬性設(shè)置>事實(shí)上,在Eclipse中使用Jocky時(shí),Jocky也是首先針對(duì)所選工程生成Ant的Build文件(默認(rèn)名稱jocky_build.xml),然后再通過Ant完成混淆編譯。
以下是Jocky在Eclipse中自動(dòng)生成的Ant Build 文件示例:<Jocky在Eclipse中自動(dòng)生成的Ant腳本示例
1<project basedir="." default="build" name="jocky.example.jocky">
2<property name="jocky.jar" value="f:\EclipseWTP1.0.8\workspace_jdk5_apusicstudio\org.apusic.jocky\jocky.jar"></property>
3<property name="jocky.output.dir" value="jocky"></property>
4<property name="jocky.scramble.level" value="package"></property>
5<property name="target" value="1.4"></property>
6<path id="project.classpath">
7<pathelement location="bin"></pathelement>
8</path>
9<target name="init">
10<jocky jar="${jocky.jar}" level="${jocky.scramble.level}"></jocky>
11<mkdir dir="${jocky.output.dir}"></mkdir>
12<mkdir dir="${jocky.output.dir}/bin"></mkdir>
13</target>
14<target name="clean">
15<delete dir="${jocky.output.dir}/bin"></delete>
16<delete dir="${jocky.output.dir}"></delete>
17</target>
18<target depends="init" name="build">
19<echo message="${ant.project.name}: ${ant.file}"></echo>
20<jocky enable="true"></jocky>
21<javac destdir="${jocky.output.dir}/bin" target="${target}">
22<src path="src"></src>
23<classpath refid="project.classpath"></classpath>
24</javac>
25</target>
26</project>
注1:只支持Eclipse 3.1.1及以上版本。
注2:如果在Eclipse中找不到Jocky插件,請(qǐng)刪除 Eclipse安裝目錄/configuration/org.eclipse.update 文件夾 (Maybe an eclipse bug?)。
2.4 如何使用符號(hào)保留指令
1/**
2 * This class should preserve.
3 * @preserve
4 */
5public class Foo {
6 /**
7 * You can specify which field should be preserved.
8 * @preserve
9 */
10 private int x;
11
12 /**
13 * This field is not preserved.
14 */
15 private int y;
16
17 /**
18 * You can also preserve methods.
19 * @preserve
20 */
21 public void hello() {}
22
23 /**
24 * This method is not preserved.
25 */
26 private void collect() {}
27}
<使用preserved指令的示例>
如果沒有@preserve指令,則根據(jù)混淆級(jí)別及成員的訪問級(jí)別來確定符號(hào)是否保留。
對(duì)于類的符號(hào)保留指令可以附帶一個(gè)保留級(jí)別參數(shù),來控制類成員的符號(hào)保留,包括:
@preserve 僅對(duì)類名進(jìn)行保留,類成員的保留根據(jù)-scramble命令行參數(shù)決定
@preserve public 保留所有public成員
@preserve protected 保留所有public和protected成員
@preserve package 保留所有public, protected, package private成員
@preserve private 保留所有成員
@preserve all 相當(dāng)于@preserve private
事實(shí)上,即便不加@preserve指令,Jocky對(duì)Java語言特有的一些private級(jí)別的方法不進(jìn)行混淆,譬如,在序列化時(shí)有特殊作用的writeObject及readObject方法等。但筆者強(qiáng)烈建議: 針對(duì)這些有特殊含義不能夠被混淆的 private級(jí)別的方法或者字段,請(qǐng)以@preserve指令予以保護(hù)。
注1:建議通過IDE的JavaDoc設(shè)置,來輔助@preserve指令的書寫。