在一个J2ME项目中干了半年的CM (Configuration Management)/BM (Build Management),学习到了很多普通开发人员较少机会接触, 但是对项目本身又十分重要的知识,写出来与大家分享。
前言
手机应用软件的开发越来越流行,其中又以J2ME开发为甚。放眼当前 各品牌手机,大多数都支持J2ME,而Java中的“一次编写,到处运行” 的概念也极大的吸引了开发者。但是,手机开发平台与PC比仍然有很大 的差距,J2ME的开放性也造成了各个手机J2ME程序的不兼容性,各大厂商都极力的推自己的特性开发包,而不注重与其他手机兼容。因此, 我们在开发J2ME程序的时候,不但要注意程序本身的开发,更要注意为不同品牌、型号的手机进行特定构建,特别是开发人员人数在10-20的 开发团队中。
1. 关于JDK/WTK的选择
JDK属于基础设施,选择的版本越新越好。通常,高版本的JDK可以设置 按照低版本的语法进行编译,可以指定生成低版本的class文件格式。
WTK也是同样的道理,高版本的通常具有较好的兼容性,这里给一个提示, 如果你需要将你的程序再多种品牌的手机上运行,你可以同时安装特定手机品牌放出的J2ME WTK,通过在这类特定的WTK上进行测试,可以较早于真机发现问题。在J2ME的开发过程中,JSR包的选择十分重要,当使用某些 特定JSR时,一定要调研清楚,所需要支持的手机中是否都支持该JSR包。
2. 编译脚本的编写
如同开发C/C++程序一样编译的时候需要写Makefile,开发J2ME程序的时候也需要有类似的脚本来完成整个编译和构建的过程,这里面有一些 选择,简单的构建过程,Windows平台上可以考虑编写bat脚本,基本能够满足需求。对于较为负责的构建过程,推荐选择Ant。Ant是一个 用于简单或复杂Java工程的自动化构建、部署工具,它对于那些具有分布式开发团队或者相信通过频繁的构建来进行不间断集成的公司尤 其有用。在J2ME开发上,同样可用。同时Ant有丰富的插件,帮助完成 Ant本身无法完成的功能,对于特定的需求,构建管理者可以自己编写 插件,集成到Ant中。
用Ant来构建应用通常是编写一个build.xml文件,将该文件传给Ant, Ant根据build.xml文件中的指示进行编译和构建,在使用Eclipse+EclipseMe 开发J2ME应用时,可以从Eclipse导出build.xml,不过还是推荐大家自己编写build.xml文件。编写build.xml时,也建议进行良好的设计, 越是复杂的构建过程,对build.xml要求也越高。
3. Antenna
Antenna是Ant的扩展包,它是专用来构建、编译、打包、部署J2ME 应用的辅助工具。
Antenna中非常实用的工具就是WtkPreprocess,它给Java开发添加 了类似C/C++中的宏定义和代码预处理的功能。Antenna支持的宏定义 包括:
#ifdef
#ifndef
#elifdef
#elifndef
#if
#elif
#else
#endif
#condition
#debug
#mdebug
#enddebug
#define
#undefine
#expand
可以从 http://antenna.sourceforge.net/wtkpreprocess.php 获得 详细的说明。
使用Antenna的过程中,会有一些缺陷。例如,在开发过程中,我们 通过定义宏来代表某个功能,对于不同的手机,当我们需要支持该功能时,在编译的过程中,打开这个宏即可,反之则关闭这个宏。如果该功能只与代码有关系,情况就十分简单,Antenna的WtkPreprocess 可以完成我们需要的功能。但是如果该功能同时与资源有关系,当 我们选择不支持该功能时,我们不但想在编译的过程中,通过预处理,去掉相关的代码,也希望该功能相关的资源也不被放入JAR包中, 而WtkPreprocess除了处理源代码,其他都无能为力。因此在构建脚本的编写过程中,需要特别注意这类问题。
4. Proguard
ProGuard是一款免费的Java类文件压缩器、优化器和混淆器。它能发现并删除无用类、字段(field)、方法和属性值(attribute)。 它也能优化字节码并删除无用的指令。最后,它使用简单无意义的名字来重命名你的类名、字段名和方法名。经过以上操作的jar文件 会变得更小,并很难进行逆向工程。
在J2ME开发中,通常都会使用到该工具,并且该工具是开源的, 很容易获取。
5. Preverify
Preverify是WTK带的一个验证class文件的工具,通过了Preverify的 class文件,在手机上运行前仅需要做一些二次验证的工作。
6. Size Control
编写J2ME程序的时候,JAR包的大小是个大问题,手机上的存储空间 和程序运行空间都十分珍贵,因此我们需要尽最大的能力减小 JAR包 的大小。
6.1 kjar/kzip
在制作JAR包时,有很多方法。JDK本身提供了jar命令,可以制作JAR包, JAR包其实可以理解为标准的ZIP包。
此处,我们推荐使用一个称为kjar的工具,可以从 http://supremej2me.bambalam.se/guides/optimization-tools/kjar/
下载到,他是通过改写压缩算法,使制作的JAR包能比普通JAR包减小10% 左右的大小。同时,由于kjar只能运行于Windows平台,并且通常被病毒 防火墙误认为病毒,用起来并不方便,因此你可以从 http://advsys.net/ken/utils.htm
下载kzip,包括Windows和Linux版本,能实现同样的功能。
6.2 BamFS
BamFS是另一个减少JAR包大小的工具,可以从 http://supremej2me.bambalam.se/guides/optimization-tools/bamfs/
下载。该工具可以将所有资源文件,包括图片、文本等,打成一个大 的二进制文件,并且提供了一个java类,方便开发人员从这个大的二 进制文件中读取所有资源。通过减少JAR包中文件的数目(或者文件夹 的层次),同样也可以减少JAR包的大小。
6.3 mbooster
mbooster是一个很强的工具,但同时,也是个收费的工具,开发者 可以向该公司申请trial的license,网址是 http://www.innaworks.com/mBooster.html , mbooster可以减小JAR包的大小,同时也能提高程序的运行速度, 它可以优化class文件,PNG文件,普通情况小可以减小30-40%左右的 大小。
7. 自动构建工具
选择一个自动构建的工具,会极大的减少构建管理者的工作量, 在这里推荐 CruiseControl ,该工具被广泛的用于Java项目和 极限开发之中。CruiseControl内建支持各类的版本管理工具, 支持Ant、Maven等多种构建工具,支持定时构建,支持多种发布 方式。
构建管理者所需要做的事情就是,将自己制作的构建环境放入 CruiseControl之中,对其进行适当的配置,接下来的事情就十分简单了,每次需要构建时,只需要登陆到CruiseControl提供的 Web界面,鼠标点击某链接来trigger构建,后台会自动完成构建、发布,并发邮件通知相关人员,一旦编译出错,也会以邮件的 方式通知大家。
8. 需要遵守的一些原则
1. 整个Build Environment需要有良好的结构,可以参考一些开源 项目的结构。为目标构建人员(例如开发人员、测试人员等) 提供简单的接口,即通过简单的设置,就能构建出想要得东西。 对于提供的接口,一定要有详细的文档描述。
2. 要求开发人员尽量使用标准的构建环境进行构建。J2ME的开发,通常都会在Eclipse/NetBeans里面完成,但一定要求开发人员 在提交代码到版本控制系统中之前,至少需要使用标准构建环境构建一次JAR包,并验证。这样可以帮助尽早发现问题,因为IDE 与自订制的构建环境总是存在差别的。
3. 建议将所有用到的第三方库/代码/程序都放入Build Environment中, 而整个Build Environment是应该放入版本控制系统中的。对于 JDK/WTK/Ant等基础设施工具,可以要求开发人员自己安装,并设置好环境变量。可以编写适当的脚本,对环境以及版本进行判断。 每次构建之前,先判断,若不满足,则不予构建。
9. 结束语
J2ME开发看似简单,里面还是有很多东西需要注意的,特别是面对 众多品牌手机的情况下,希望我的经验也能对你有所帮助。