|
|
——打包与混淆
by Blue Wanderer
这章并非看不看两可,只是现在看不看两可而已。
打包和混淆是商业开发必须要做的两个步骤。
为什么要打包?因为我们那样的class文件是不能放到手机上运行的。
为什么要混淆?混淆不只是给类和成员改名增加认读的难度,更重要的是混淆后的程序尺寸会缩小很多(因为名字都短了嘛)。另外,混淆器还会对程序进行一定程度的优化(主要是删除没用过的成员,还有各种无意义的代码。)来进一步减小程序尺寸(尤其是删除常量会大大减小尺寸),并能对程序运行速度进行少许提高(可以忽略,别放在心上)。
操作上,我们先要进行的是混淆。我用的混淆器是proguard,同样不介绍下载安装。
好,现在proguard已经存在于我的X:\proguard3.5目录下了!
现在,在env.bat中加上set PRODir=X:\proguard3.5。同样proguard的位置因人而异。
首先我们要按照第一章的步骤把源码编译好。就是说执行到preverify之前。
因为混淆的命令行太长,我们得写一部分到文件里:
-injars 'work'
-outjars 'obfuscated'
-overloadaggressively
-defaultpackage ''
-allowaccessmodification
-keep public class * extends javax.microedition.midlet.MIDlet
-verbose
起名叫proguard.pro
然后写一个批处理文件:
java -jar %PRODir%\lib\proguard.jar @proguard.pro -libraryjars '%WTKDir%\lib\cldcapi10.jar' -libraryjars '%WTKDir%\lib\midpapi10.jar'
起名叫obfuscate.bat
还是说参数:
-injars 指定输入,不一定是jar文件,我们这里用的就是目录
-outjars 指定输出
-overloadaggressively 只要知道这样可以让文件更小就好了。实际效果参数不同的方法会被分配相同的名字,大大提高比较短的名字的利用率。
-defaultpackage 指定默认包的位置
-allowaccessmodification proguard会更改访问权,具体有什么好处我也不明白,这个是WTK会用的参数,我就搬过来了。
-keep 这个比较关键,指定哪些类是不可以动的。我们指定所有实现了MIDlet的公共类。也就是我们的那个M。这也就是我为什么起M这么个怪名字的原因,因为它是不能被混淆的,所以就人为把名字弄短了。
-verbose 输出明细
-libraryjars 指定库的位置
运行obfuscate.bat
X:\Tut1\obfuscated>dir
Volume in drive X is Misc
Volume Serial Number is B4E3-32BE
Directory of X:\Tut1\obfuscated
06/15/2006 02:07 AM <DIR> .
06/15/2006 02:07 AM <DIR> ..
06/15/2006 02:07 AM 930 a.class
06/15/2006 02:07 AM 772 M.class
2 File(s) 1,702 bytes
2 Dir(s) 1,187,627,008 bytes free
在obfuscated目录中Main.class已经变成了a.class。这里因为我已经在M.java里使用了Main类,所以会有两个类。对于第一章的程序,Main.class会被彻底删除。这里只会有一个M.class。
在打包之前我们需要验证我们的类。这里把prev.bat改一下:
preverify -cldc1.0 -classpath "%WTKDir%\lib\cldcapi10.jar;%WTKDir%\lib\midpapi10.jar" -d "verified" %1
把最后的work改成%1。因为混淆前后需要验证的路径不同。
执行prev obfuscated。就会验证obfuscated目录。
接下来我们需要打包。每个jar包都需要在/META-INF目录下有一个MANIFEST.MF文件,我们现在把这个搞定。
Manifest-Version: 1.0
MicroEdition-Configuration: CLDC-1.0
MicroEdition-Profile: MIDP-1.0
MIDlet-Name: Tutorial SP
MIDlet-Vendor: BlueWanderer
MIDlet-Version: 1.0
MIDlet-1: Tutorial SP, ,M
这是MANIFEST.MF文件的内容。注意编码格式必须是UTF-8,当然如果只有ASCII字符就无所谓了。还有就是千万不要把UTF-8的文件头加上。
说下都是些什么:
Manifest-Version: 1.0 这个MANIFEST.MF格式版本
MicroEdition-Configuration: CLDC-1.0 这个程序运行于什么配置下
MicroEdition-Profile: MIDP-1.0 这个程序运行于什么简表下
MIDlet-Name: Tutorial SP 程序的名称
MIDlet-Vendor: BlueWanderer 程序的发行者
MIDlet-Version: 1.0 程序的版本
MIDlet-1: Tutorial SP, ,M 第一章已经说过了
然后就可以打包了。怎么打包呢?
……
把verified目录下所有文件用WinRAR压成zip文件,然后把扩展名改成jar。搞定!
很轻松不是?还是有几点注意。WinRAR这类压缩工具会以本地编码生成压缩包里的文件名,但是手机上需要UTF-8的文件名。这意味着文件夹和类的名字只能用ASCII字符。(有一个压缩工具例外,自己发掘吧。当然绝对不是说jar.exe。)另外可能不会有人犯这种错误:把verified这级目录也给一起打进去……
把那个jar文件改名为tut1.jar,并以动到上一级目录下。不为什么,这样以后可能省点口水。
接下来就是要为它写jad了,因为和运行class文件需要的jad不一样。
首先,
……
把MANIFEST.MF复制一个过来改名为tut1.jad。然后修改一下:
MIDlet-Jar-URL: tut1.jar
MIDlet-Jar-Size: 1625
MicroEdition-Configuration: CLDC-1.0
MicroEdition-Profile: MIDP-1.0
MIDlet-Name: Tutorial SP
MIDlet-Vendor: BlueWanderer
MIDlet-Version: 1.0
MIDlet-1: Tutorial SP, ,M
注意到区别了?
Manifest-Version: 1.0 这一行没有了,因为是MANIFEST.MF文件自身的描述,jad文件自然不需要了。
MIDlet-Jar-URL: tut1.jar 这行是jar文件的位置,这里因为和jad文件在同一目录下所以用简单的相对路径就可以了。
MIDlet-Jar-Size: 1625 这个是jar文件的大小,我这里是1625字节,一定要自己看文件属性再写在这里!
现在双击tut1.jad就可以直接运行程序了。
把tut1.jad和tut1.jar放在http服务器上,然后用手机下载tut1.jad就可以安装你的程序。(当然一定要这么做的前提是你的手机红外、蓝牙、数据线样样不支持…… 还有,有些手机可以直接下载jar文件安装,因为jar文件本身就带描述的,只不过那样只有下载好才知道究竟可不可以装了。)
再说点容易被误会的东西,jad文件和jar文件的名字不需要相同,只要jad文件里面指定的文件没问题就好了。
就到这里,水窖驱鸟。 |
|