第一章. Polish的功能介绍
1. 支持CSS,创建手机UI
2. 支持多国语言
3. 拥有自己的API
4. 打包、混淆、编译
5. 预编译功能
6.具有Antenna的相关功能。
7.基于Ant
第二章. Polish工具
第一节 Build 预处理,资源整合,本地化,编译,预审,混淆和打包。你可以同时为多个设备,语言或地区优化你的程序,Polish还可以为你调用模拟器
第二节 设备数据库,一个基于 XML的数据库方便调整你程序适应不同设备需要。利用强大的预处理功能你可以将这些数据直接应用于你的程序
第三节 日志框架,通过修改build.xml你可以为类或者整个包启动或者关闭日志层,你通过System.out.println()打印的消息可以同时在真机上显示,当然你可以完全的关闭日志层,这样的话没有任何内容会留在程序,同时节省了运行时内存
第四节 自动资源整合,所有资源像图片和声音都将实现自动整合,你可以为特定的开发商,或者支持某种特定格式的设备,使用有针对性的资源。你甚至可以根据条件来包含资源
第五节 本地化,创建本地化应用程序将更加简单,如果提供文本翻译,如果有必要,也可以提供针对不同地区的相关资源,Polish会自动将它们集成进入应用程序,与其他本地化方案不同的是,本地化应用程序并不比非本地化应用程序花费更多的开销。因为翻译过程是整合在源代码层次的。
第六节 GUI:标准的J2ME组件不能被设计,利用polish你既可使用标准MIDP/1.0组件,有可以使用MIDP/2.0组件,并且使用一个css来设计它
第七节 工具:如ArrayList,TextUtil
第八节 游戏引擎
第九节 独立工具:二进制数据编辑器管理数据文件,位图字体编辑器创建位图字体
第三章. Polish配置目录结构
1. Apis.xml—描述一些常用的设备JCP规范支持的库,比如MMAPI的描述等
2. custom-css-attributes.xml—描述可以为自己的GUI程序定制的CSS样式
3. devices.xml—定义所有已知的设备,可以定义或者修改这些已存在的规范和使用改变过的配置用在你的代码中。Device数据库
4. J2mepolish存储了超过 230种 J2ME 设备和相应的J2ME 参数,如 Canvas的大小, APIs, 支持格式等。其中,所有的数据都定义在device.xml文件中(安装过程,需选中External Device Database)。当然,可以随时更新device.xml数据库。事实上,device数据库对于j2me开发非常重要。在本人的开发经历中,很多次都无奈难于获得某类机型的具体信息,如:堆栈大小,是否支持特定的扩展包等。即使有的公司拥有这样一套数据集合,也多半是以excel的形式保存,却无法与程序结合起来使用。这点,也为j2me程序的机型适配工作带来了繁重的工作量。J2mepolish在这方面对j2me开发做出重大贡献,以至于想antenna这样的开源项目已经支持j2mepolish提供的device数据库。在开发过程中,结合j2mepolish的预处理机制,我们可以很便捷的使用该数据库。
5. custom-devices.xml—自定义驱动,补充官方没有提供的驱动
6. groups.xml—定义驱动组,每一个驱动可以在任意一个组下面
7. vendors.xml—可自定义的厂家J2ME规范
第四章. 创建活动
第一节 选择支持设备 à资源整合à预处理源代码,为设备优化à编译应用程序à混淆编译后的代码à预审à创建JAR和JAD文件
第二节 任务定义
<taskdef name="j2mepolish" classname="de.enough.polish.ant.PolishTask"
classpath="import/enough-j2mepolishbuild.
jar:import/jdom.jar:import/proguard.jar"/>
第五章. 完整示例
<project name="example" default="j2mepolish">
<property name="wtk.home" value="D:/JBuilder2005/j2mewtk2.1">
<taskdef name="j2mepolish"
classname="de.enough.polish.ant.PolishTask"
classpath="import/enough-j2mepolish-build.jar:import/jdom.jar:import/proguard.jar"/>
<target name="j2mepolish">
<j2mepolish>
<info
name="SimpleMenu"
version="1.0.0"
description="A test project"
jarName="${polish.vendor}-${polish.name}-example.jar"
jarUrl="${polish.jarName}"/>
</info>
<deviceRequirements>
<requirement name="JavaPackage" value="nokia-ui"/>
</deviceRequirements>
<build
fullscreen="menu"
usePolishGui="true"
<midlet class="MenuMidlet" name="Example"/>
</build>
</j2mepolish>
</target>
</project>
第六章. 分析
第一节 J2me Polish任务有三个主要字段:<info>,<deviceRequirements>和<build>
第二节 Info元素制定了工程的主要信息,例如工程的名字和版本
第三节 DeviceRequirement元素用于应为哪些设备创建应用程序
第四节 Build元素是控制创建过程的核心,这个元素控制了是否使用J2mepolish GUI,使用什么样的MIDlets,使用什么样的混淆器等等,同样可以定义用于预定处理阶段的附加变量和记号
1. 可以使用附加的元素<emulator>来启动任何基于WTK的模拟器
2. 当build元素中的usePolishGUI设置为true将会自动在程序中组织必要的代码和APIS,为了创建或者改变你的设计,“resources“目录中的”polish.css”将会被创建或者修改
第七章. 使用样式表
第一节 示例
colors{
bgColor: rgb(132,143,96);
brightBgColor: rgb(238,241,229);
brightFontColor: rgb(238,241,229);
fontColor: rgb(30,85,86);
}
title{
padding:2 ; margin-bottom:5;
font-face:proportional; font-size:large;
font-style:bold; font-color:brightFontColor;
background:none; border:none ;
layout:center | expand;
}
focused{
padding:5;
background {
type: round-rect; arc: 8; color: brightBgColor; border-color: fontColor; border-width: 2;
}
font {
style: bold; color: fontColor;
size: small;
}
layout: expand | center;
}
list {
padding: 5; padding-left: 15; padding- right: 15;
background {
color: transparent;
image: url( bg.png );
}
layout: expand | center | vertical-center;
columns: 2;
}
listitem {
margin: 2; padding: 5; background: none; font-color: fontColor; font- style: bold; font-size: small;
layout: center;
icon-image: url( icon%INDEX%.png );
icon-image-align: top;
}
第八章. 静态样式表
第一节 在编辑阶段被添加的,为了更快更高的内存效能。然而静态样式需要 更改源代码,
第二节 使用静态样式表,需要用到#style预处理指令。这个指令将被用于任何代码的screen和item的构造函数之前
第九章. 调试和日志
第一节 日志和调试是J2ME复杂和困难的任务,一方面需要额外的计算和内存开销,另一方面J2ME领域并不存在log4j这样的日志框架
第二节 Polish引入如下日志框架
1. 分层次的日志如debug,info,warn,error等被定义在单独的类或者包中
2. 支持用户自定义层次
3. 日志信息可以在真实设备上显示
4. 没有被激活的日志信息将不会被编译和使用,因此没有多余的资源使用
5. 整个日志功能无效
6. 简单的System.out.println()将被用于书写日志
第三节 日志由build.xml的<debug>元素控制
1. enable属性定义了日志功能能否被激活
2. showLogOnError属性用于在一个error被记录时是否自动的显示它,但这一个功能仅仅当polish gui被使用时有效
3. verbose为true,在每个日志消息之后将添加当前的时间和源代码的位置。当使用混淆时候,这将使错误定位更加容易
4. level指定默认的日志层次,它在当没有一个class指定日志层次时起作用
a) debug<info<warn<error<fatal<user-definiert
b) 例如,当一个类被赋予”info”日志层次后,所有的warn,error等的层次的日志将被记录,当不记录debug层次的日志
c) 在源代码中日志可以通过#debug预处理指令被记录
第一零章. 通过预处理和设备数据库来进行设备优化,更简单
1. Polish的设备用户接口会自动适配设备
2. 预处理指令“#ifdef”,“#if”,“#=”被用于优化
3. 当某个api需要特定的功能才能使用的时候,可以使用”polish.api.[api-name]”记号
4. 可以利用polish.midp1和polish.midp2记号来区分MIDP的版本
5. 可以利用polish.cldc1.0和polish.cldc.1.1来区分CLDC/1.0和1.1标准
6. 定义并使用变量
a) 定义
<variables>
<variable name=”update-url” value=http://www.enough.de/update./>
</variable>
b) 使用
/#ifdef update-url:defined
//#= public static final String UPDATE_URL=”${update-url}”;
//#else
//没有变量定义,使用缺省值
public static final String UPDATE_URL=http://default.com/update;
//#endif
第一一章. 存在问题
- <!--[if !supportLists]-->j2mepolish在build功能上面,其实就是ant扩展。当然,其本身也是支持其他ant扩展,如,打包完成后,自动将jar文件上传到服务器上。但是功能强大的同时,却带来的是自由度的下降。例如,在存在以下需求时,用j2mepolish来实现打包,可能就比较繁琐了:在一份源码的基础上,对不同的资源目录进行打包。如,A版本使用的资源目录为res1,B版本使用的资源目录为res2;不同版本,jad属性不同。本人认为,j2mepolish中,选择不同的设备是在处指定,这样一来,不同版本之间区别就很难在一个build.xml文件中或者一次build过程中定义清楚。当然,并非说j2mepolish不能实现以上需求,这就是仁者见仁,智者见智了。
- <!--[if !supportLists]-->j2mepolish编译使用的库,如: midp2.0.jar、cldc1.0.jar等,都是来自于polish_home/import目录下,这样不方便相关库的升级和使用。
第一二章. 使用devices.xml示例,使用device数据库和预处理
本节重点讨论如何使用指定设备的相关数据。首先,在build.xml中指定设备,在此我们以Nokia/6600和Motorola/E680为例,定义如下:
xml 代码
- <deviceRequirements>
- <requirement name="Identifier" value="Nokia/6600,Motorola/E680" />
- </deviceRequirements>
下面按照以下几点目标来设计代码:
1、6600版本使用FullCanvas,E680版本使用SetFullScreenMode
2、6600版本使用Nokia的翻转方法,E680版本使用Midp2.0的
3、获取设备自身的堆栈大小,屏幕大小等信息
源代码片段如下:
java 代码
- 源代码片段如下:
- public class MyCanvas
- // #if polish.api.nokia-ui
- // # extends com.nokia.mid.ui.FullCanvas
- // #else
- extends Canvas
- // #endif
- {
- public MyCanvas()
- {
- // #ifndef polish.api.nokia-ui
- // # setFullScreenMode(true);
- // #endif
- // #ifdef polish.ScreenSize:defined
- // #= String screensize = "${ polish.ScreenSize }";
- // #else
- String screensize = "128*128";
- // #endif
- // #ifdef polish.HeapSize:defined
- // #= int heapSize = ${ bytes(polish.HeapSize) };
- // #else
- int heapSize = 1000;
- // #endif
- }
- protected void paint (Graphics g)
- {
- }
- public void drawClip (Graphics g, int x, int y, Image image, int clipX,
- int clipY, int clipWidth, int clipHeight, int mode)
- {
- // #if polish.api.nokia-ui
- // # ...
- // # nokia的切片绘制方法,具体代码省略
- // # ...
- // #else
- ...
- midp2.0的切片绘制方法,具体代码省略
- ...
- // #endif
- }
- }