跳至主要内容

博文

目前显示的是标签为“Proguard”的博文

Repacking MIDlet class

JavaME的程序要打成Jar包提交,由于移动的限制,Jar的file size越小越好。Proguard无疑是最受青睐的混淆器之一。 混淆打包的时候,经常遇到这样的问题:如何将keep指令保留的class放到default package中?搜寻了很久也没有找到答案,都想利用Proguard的src自己来写个小工具了,又仔细搜了一边help forum,终于看到了 解决方案 。 Quote: Keeping a class name means keeping its fully qualified name. You could try creating a mapping file with the name that you want, and feeding it into ProGuard with -applymapping. In ProGuard 4.0 beta, you can specify -keep,allowobfuscation instead of just -keep. If you use -printmapping, you can then find the obfuscated name in the mapping file. Eric. 可以先用keep执行一次obfuscate,将映射结果用printmapping打印出来,保存为proguard.map文件,再修改其中MIDlet类型的映射,如: com.jlazy.MyMIDlet -> MyMIDlet 然后,在keep选项之后加一个参数allowobfuscation: -keep,allowobfuscation public class * extends javax.microedition.midlet.MIDlet 并在progard中指定使用map文件执行repackage: -applymapping 'proguard.map' 这样就搞定了,所有的class都放到了default package中。 这个解决方法必须要使用 Proguard 4.0 beta 以上版本。而且由于要在第一次生成映射文件,多做了一步,感觉还可以再改进。如果Eric没有时间加入这个feature的话,打算自己写一个并集成到ant脚本中。

Java Obfuscator

不做JavaME的Java程序员一般可能不会去对自己的class文件做混淆处理。做JavaME的大部分都知道Proguard、RetroGuard等用于obfuscate的工具。去年我的Ant Build Script中就已经添加了对于Proguard的支持,不过这次为了做WB2这个游戏,又有几个地方需要调整。 1) 类太多,足足有接近30个class file。 这对于ME程序而言,太多了。Proguard又不太争气,我只好找了以前做Flynn时候用过的JAX再压榨一下。JAX是IBM很早以前在alphaWork上发布的一个混淆器,后来被集成到了WSDD (Websphere Device Developer)中,作为SmartLink组件,就再也没法下到了。 我手头用的JAX版本6.3只能支持JDK1.2 -_-||| 没办法,尝试了诸多方法之后,勉强还是可以用。以下命令可以执行JAX以GUI方式启动: # java -classpath $JAX_HOME/jax63.zip com.ibm.jax.GUI 不过Ant集成的task最好还是在命令行里运行,简洁又清爽: # java -classpath $JAX_HOME/jax63.zip com.ibm.jax.Batch 后来有个朋友给了我一个私房版本,是用JDK5.0重新编译过的JAX,不用替换JVM就能运行,而且META-INF里面也制定了MainClass为Batch,真棒! 折腾了足足两个钟头之后,将JAX加入了ant build: <target name="merge" if="flag.should.jaxmerge" description="Try to merge some classes using JAX"> <java jar="${lib}/${jax.jar}" fork="true"> <arg value="lib/${jax.conf}" /> </java> <delete dir="${classes}"/> <mkdir dir="...