http://huangyuanmu.iteye.com/blog/493149
Jocky提供了Eclipse的插件,从而能够直接在Eclipse中使用Jocky。
<Jocky在Eclipse中的右键菜单> |
<Jocky在Eclipse中的属性设置> |
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 > |
<Jocky在Eclipse中自动生成的Ant脚本示例> |
2.4 如何使用符号保留指令
除了在命令行用 -scramble 参数控制符号混淆级别外,还可以在源代码中使用符号保留指令来控制那些符号需要保留。符号保留指令是一个Java文档注释指令,可以插入在类和类成员的文档注释中,例如:
1
/**
2 * This class should preserve. 3 * @preserve 4 */ 5 public 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指令,则根据混淆级别及成员的访问级别来确定符号是否保留。
对于类的符号保留指令可以附带一个保留级别参数,来控制类成员的符号保留,包括:
@preserve 仅对类名进行保留,类成员的保留根据-scramble命令行参数决定 @preserve public 保留所有public成员 @preserve protected 保留所有public和protected成员 @preserve package 保留所有public, protected, package private成员 @preserve private 保留所有成员 @preserve all 相当于@preserve private
事实上,即便不加@preserve指令,Jocky对Java语言特有的一些private级别的方法不进行混淆,譬如,在序列化时有特殊作用的writeObject及readObject方法等。但笔者强烈建议: 针对这些有特殊含义不能够被混淆的 private级别的方法或者字段,请以@preserve指令予以保护。
注1:建议通过IDE的JavaDoc设置,来辅助@preserve指令的书写。
三、Jocky的限制
正如前文所说,Jocky是基于源代码的混淆编译器,因此,Jocky不支持分别编译,必须对所有的源文件同时进行混淆编译。但事实上,倘若混淆级别控制在private级别上,该限制便不复存在。