一.J2ME体系结构――Configuration和Profiles
针对消费电子和嵌入式设备领域丰富多样的设备和彼此相差极大的计算能力及各种硬件条件,J2ME首先根据最基本的一些特征把它们划分为两类。
具备间断网络通讯能力的个人移动信息设备:如手机,双向呼机,PDA(Personal Digital Assistant,个人数字助理,也称掌上电脑)等等。
有固定的不间断网络连接的共享连接信息设备:如置顶盒(set-top boxes),Web-TV,支持Internet的有屏幕电话,汽车娱乐/导航系统等等。
Sun的J2ME FAQ(常见问题集)里有一个很好的概括:J2ME技术有两个设计中心――手持的设备,和可以插到墙上插座的设备。第一类设备往往是个人化的,移动的,使用电池,体积和功耗都有限制,因此功能和计算能力有限。第二类设备一般是固定的,因此体积没有太大限制。由于固定,可以有持续电源供应,因此功耗没有太大问题,计算能力相对充裕。
计算能力是这两类设备的主要区别,对其上可能的应用和环境显然有着本质影响,不同类别的设备不可能采用同样的Java平台,必须分别定义。针对这两大类设备的平台规范就是Configuration(有译为配置的,不过我认为最好不译)。第一类设备的Configuration称为CLDC(Connected, Limited Device Configuration),第二类称为CDC(Connected Device Configuration)。
属于同一类的设备计算能力是相似的,但是其他功能和条件还有非常大的区别。作为Java平台必须保证相容性,这就必须舍弃所有的设备特殊性。因此,Configuration就是支持一组通用设备的最小Java平台,作为这些设备的最小公分母来保证不同设备间的平台相容性。这里的Java平台主要是指Java虚拟机(JVM)和核心库。
在Configuration中舍弃了设备的特殊性来保证Java平台的相容性,但是仅仅有Configuration显然是不够的,特殊的具体设备其独有的功能和硬件条件都没有得到支持。为此,在Configuration的基础上,根据设备具体功能再进行一次划分,比如智能手机,PDA等等。功能的划分也就是其他硬件条件的划分,比如屏幕大小,内存,计算能力,电力供应等等都是从属于功能的,因此同功能的设备的硬件条件都是非常相似的。Profile(译为简表或者简档)就是针对每一类功能设备的特殊性定义的与设备特性相关的API,建筑于Configuration之上,作为Configuration的扩展和补充。例如MIDP(Mobile Information Device Profile,移动信息设备Profile)就定义了关于移动信息设备(主要指智能手机和一部分具有无线通信功能的PDA)的图形界面,输入和时间处理,持久性存储,短消息等等的API,并且考虑到了移动信息设备的屏幕和内存限制。而正在制定中的PDA Profile则定义了针对PDA的API,其屏幕,内存条件都要大于MIDP,但是网络方面的要求则显然和手机有所不同。如下图所示,同属于一个Configuration的设备根据功能不同由不同的Profile来支持,Profile体现设备的特殊性,但是都建筑在一个共同的基础Configuration平台之上。
关于J2ME的体系结构,我们可以这样总结:
Configuration的分类是根据计算能力的不同来划分的,同类设备的计算能力相近。Configuration是一个规范,定义了这类设备的共同Java平台,定义与设备无关的Java虚拟机和核心库,是平台相容性的基础。Profile的分类是根据设备功能划分的,同类功能的设备其他各种硬件条件和需求也相近。Profile是一组API,在某一Configuration的基础上扩展了针对设备特定功能的API,使得标准能够完全适应特殊的设备,彻底发挥设备的功能。
J2ME体系的一般结构是:由Configuration定义的Java虚拟机运行于设备的宿主操作系统之上,构成整个平台的基础。Configuration提供了基本的语言特性,Profile提供针对设备的特殊功能API和扩展类库。应用程序的运行环境需要一个Configuration和至少一个Profile,多个Profile可以共存,也可以叠加。
我们用两个具体设备的实现作为例子说明。在一个运行Palm OS的PDA上,Configuration采用CLDC,虚拟机采用KVM(虚拟机和Configuration是紧密相连的,KVM只是CLDC定义的一个参考实现(reference implementation),并不是唯一的选择),然后采用PDA Profile的Profile。在另一个运行Symbian的智能手机上,则可以采用KVM,CLDC,MIDP。
注:在JCP(Java Community Process,J2ME标准在这里制定)的网站上已经提出了JSR 68(Java Specification Request,标准提案),将在下一代J2ME标准中用Building Block概念来取代Configuration。其原因是,Profile经常需要提供J2SE中已有的功能,为了能够利用已有的J2SE API而不是重新制定新API,引入了Building Block概念。一个Building Block定义一个来自J2SE或者J2EE的API以用于J2ME。这样,Profile就可以通过Building Block来利用已有的API。
二 J2ME的几个概念
1 内存
我们一直在强调,移动信息设备的内存非常小,使用起来应该加倍的珍惜,但是我们却很少知道这些内存是如何分类的,下面将做详细的介绍。事实上MIDP设备的内存分为三种,Programme Memory、Heap、persistent Storage。
Programme Memory是移动信息设备分配给MIDlet suite的空间,因为MIDlet suite是以jar文件进行发布的,所以这个文件的大小可以认为是Programme Memory的大小。一些厂商对Programme Memory的最大值是有限制的,例如我的Nokia 6108的最大值是 64k,超过的话将不能进行安装。减小MIDlet suite的大小非常重要,一个便捷的方法就是使用混淆器对应用程序进行混淆,这样可以减小jar文件的大小。在以后的文章中我会谈到如何使用Proguard。
Heap是应用程序在运行过程中存放所创建的对象的存储空间,本地变量和成员变量也是放在Heap上的,MIDP设备中提供的Heap空间大概在几十k到几百K。
Persistent Storage的空间是用来实现MIDP应用程序的本地数据持久性存储的
2. Connected Limited Device Configuration
CLDC包括一个Java虚拟机和一系列的基础类,J2ME的专家组经过对移动信息设备进行硬件抽象后得到他们的特点,然后设计并实现了在移动信息设备上运行的java虚拟机,通常我们把它叫做KVM。在CLDC1.0还同时提供了由java.io、java.lang、javax.microediton.io、java.util组成的基础类。在CLDC1.1里面添加了java.lang.ref。
3. Mobile Infomation Device Profile
MIDP是运行在CLDC基础之上的,在MIDP中定义了应用程序的生命周期、用户图形界面、数据管理系统等子集,从而构建起了J2ME平台。通常,J2ME平台由一个CLDC和一个或者多个Profile构成。
CDC
4.CDC(Connected Device Configuration)针对有固定的不间断网络连接的共享连接信息设备,如置顶盒(set-top boxes),Web-TV,支持Internet的有屏幕电话,汽车娱乐/导航系统等等。
CDC要求为Java提供至少2M的内存,这可以是ROM加上RAM,也就是说,Java虚拟机和核心类库很有可能放在ROM或者Flash里。事实上,下一代无线手持设备完全可以满足CDC的需求。
CDC是CLDC的完整超集,包含了所有的CLDC规范。另外,在相对充裕的条件下,它支持J2SE的标准 Java 虚拟机和一部分核心类库。对于这一点,几乎所有的文章都这么说,却很少有文章彻底分清彼此之间的兼容性关系,甚至还有文章错误地说CDC支持Java语言的完整实现,这是很容易引起混淆的。
首先可以肯定,既然CDC是CLDC的超集,基于CLDC的程序在CDC内是完全兼容的。不过这里的CLDC程序必须只用到CLDC的部分,一旦采用了某一个Profile,显然也就不能在CDC内兼容了。
其次,CDC支持标准的J2SE虚拟机,这只是Java平台的基础,并不包括建筑于平台基础之上的各种类库。特定设备需要的特定类库由相应的Profile来定义。这一点随后就会提到。还是那个关键:Configuration定义的是一类设备的与设备无关的最小平台,因此,诸如用户界面之类的类都被分离,留在Profile中定义。
虽然CDC支持标准的J2SE虚拟机,但是标准的Java虚拟机显然无法适应有限的资源环境。为此需要专门定义一个虚拟机,称为CVM(开始的时候,CVM代表Compact Virtual Machine,但是后来Sun的工程师认为这有可能与KVM相混淆,因此现在C并不代表特定的含义)。CVM除了支持标准J2SE虚拟机的所有特性外,还支持许多嵌入系统需要的特性,更适合于在资源限制条件下运行,移植性很强。目前Sun提供了Linux和VxWorks之上的CVM参考实现(reference implementation)。
5.Foundation Profile
Foundation Profile提供除了用户界面以外CDC所缺少的几乎所有标准J2SE核心类库,作为其他所有Profiles的基础(我们看到,多个Profile可以共存,也可以叠加)。
6.Personal Profile
Personal Profile针对那些资源相对有限,但是需要高度的Internet和WEB连接支持的设备,例如Web-TV,汽车导航系统等等。它在Foundation Profile的基础上提供了网络特性以及支持Java applets的 GUI。
Personal Profile的前身是Personal Java,Personal Java是Sun为资源限制设备创建 Java 平台版本的早期尝试。Personal Profile将与Personal Java 1.1和1.2向后兼容。
7.RMI Profile
RMI Profile在Foundation Profile的基础上提供RMI支持,将允许网络设备与其它系统应用程序(不一定是J2ME的)交互操作。
针对消费电子和嵌入式设备领域丰富多样的设备和彼此相差极大的计算能力及各种硬件条件,J2ME首先根据最基本的一些特征把它们划分为两类。
具备间断网络通讯能力的个人移动信息设备:如手机,双向呼机,PDA(Personal Digital Assistant,个人数字助理,也称掌上电脑)等等。
有固定的不间断网络连接的共享连接信息设备:如置顶盒(set-top boxes),Web-TV,支持Internet的有屏幕电话,汽车娱乐/导航系统等等。
Sun的J2ME FAQ(常见问题集)里有一个很好的概括:J2ME技术有两个设计中心――手持的设备,和可以插到墙上插座的设备。第一类设备往往是个人化的,移动的,使用电池,体积和功耗都有限制,因此功能和计算能力有限。第二类设备一般是固定的,因此体积没有太大限制。由于固定,可以有持续电源供应,因此功耗没有太大问题,计算能力相对充裕。
计算能力是这两类设备的主要区别,对其上可能的应用和环境显然有着本质影响,不同类别的设备不可能采用同样的Java平台,必须分别定义。针对这两大类设备的平台规范就是Configuration(有译为配置的,不过我认为最好不译)。第一类设备的Configuration称为CLDC(Connected, Limited Device Configuration),第二类称为CDC(Connected Device Configuration)。
属于同一类的设备计算能力是相似的,但是其他功能和条件还有非常大的区别。作为Java平台必须保证相容性,这就必须舍弃所有的设备特殊性。因此,Configuration就是支持一组通用设备的最小Java平台,作为这些设备的最小公分母来保证不同设备间的平台相容性。这里的Java平台主要是指Java虚拟机(JVM)和核心库。
在Configuration中舍弃了设备的特殊性来保证Java平台的相容性,但是仅仅有Configuration显然是不够的,特殊的具体设备其独有的功能和硬件条件都没有得到支持。为此,在Configuration的基础上,根据设备具体功能再进行一次划分,比如智能手机,PDA等等。功能的划分也就是其他硬件条件的划分,比如屏幕大小,内存,计算能力,电力供应等等都是从属于功能的,因此同功能的设备的硬件条件都是非常相似的。Profile(译为简表或者简档)就是针对每一类功能设备的特殊性定义的与设备特性相关的API,建筑于Configuration之上,作为Configuration的扩展和补充。例如MIDP(Mobile Information Device Profile,移动信息设备Profile)就定义了关于移动信息设备(主要指智能手机和一部分具有无线通信功能的PDA)的图形界面,输入和时间处理,持久性存储,短消息等等的API,并且考虑到了移动信息设备的屏幕和内存限制。而正在制定中的PDA Profile则定义了针对PDA的API,其屏幕,内存条件都要大于MIDP,但是网络方面的要求则显然和手机有所不同。如下图所示,同属于一个Configuration的设备根据功能不同由不同的Profile来支持,Profile体现设备的特殊性,但是都建筑在一个共同的基础Configuration平台之上。
关于J2ME的体系结构,我们可以这样总结:
Configuration的分类是根据计算能力的不同来划分的,同类设备的计算能力相近。Configuration是一个规范,定义了这类设备的共同Java平台,定义与设备无关的Java虚拟机和核心库,是平台相容性的基础。Profile的分类是根据设备功能划分的,同类功能的设备其他各种硬件条件和需求也相近。Profile是一组API,在某一Configuration的基础上扩展了针对设备特定功能的API,使得标准能够完全适应特殊的设备,彻底发挥设备的功能。
J2ME体系的一般结构是:由Configuration定义的Java虚拟机运行于设备的宿主操作系统之上,构成整个平台的基础。Configuration提供了基本的语言特性,Profile提供针对设备的特殊功能API和扩展类库。应用程序的运行环境需要一个Configuration和至少一个Profile,多个Profile可以共存,也可以叠加。
我们用两个具体设备的实现作为例子说明。在一个运行Palm OS的PDA上,Configuration采用CLDC,虚拟机采用KVM(虚拟机和Configuration是紧密相连的,KVM只是CLDC定义的一个参考实现(reference implementation),并不是唯一的选择),然后采用PDA Profile的Profile。在另一个运行Symbian的智能手机上,则可以采用KVM,CLDC,MIDP。
注:在JCP(Java Community Process,J2ME标准在这里制定)的网站上已经提出了JSR 68(Java Specification Request,标准提案),将在下一代J2ME标准中用Building Block概念来取代Configuration。其原因是,Profile经常需要提供J2SE中已有的功能,为了能够利用已有的J2SE API而不是重新制定新API,引入了Building Block概念。一个Building Block定义一个来自J2SE或者J2EE的API以用于J2ME。这样,Profile就可以通过Building Block来利用已有的API。
二 J2ME的几个概念
1 内存
我们一直在强调,移动信息设备的内存非常小,使用起来应该加倍的珍惜,但是我们却很少知道这些内存是如何分类的,下面将做详细的介绍。事实上MIDP设备的内存分为三种,Programme Memory、Heap、persistent Storage。
Programme Memory是移动信息设备分配给MIDlet suite的空间,因为MIDlet suite是以jar文件进行发布的,所以这个文件的大小可以认为是Programme Memory的大小。一些厂商对Programme Memory的最大值是有限制的,例如我的Nokia 6108的最大值是 64k,超过的话将不能进行安装。减小MIDlet suite的大小非常重要,一个便捷的方法就是使用混淆器对应用程序进行混淆,这样可以减小jar文件的大小。在以后的文章中我会谈到如何使用Proguard。
Heap是应用程序在运行过程中存放所创建的对象的存储空间,本地变量和成员变量也是放在Heap上的,MIDP设备中提供的Heap空间大概在几十k到几百K。
Persistent Storage的空间是用来实现MIDP应用程序的本地数据持久性存储的
2. Connected Limited Device Configuration
CLDC包括一个Java虚拟机和一系列的基础类,J2ME的专家组经过对移动信息设备进行硬件抽象后得到他们的特点,然后设计并实现了在移动信息设备上运行的java虚拟机,通常我们把它叫做KVM。在CLDC1.0还同时提供了由java.io、java.lang、javax.microediton.io、java.util组成的基础类。在CLDC1.1里面添加了java.lang.ref。
3. Mobile Infomation Device Profile
MIDP是运行在CLDC基础之上的,在MIDP中定义了应用程序的生命周期、用户图形界面、数据管理系统等子集,从而构建起了J2ME平台。通常,J2ME平台由一个CLDC和一个或者多个Profile构成。
CDC
4.CDC(Connected Device Configuration)针对有固定的不间断网络连接的共享连接信息设备,如置顶盒(set-top boxes),Web-TV,支持Internet的有屏幕电话,汽车娱乐/导航系统等等。
CDC要求为Java提供至少2M的内存,这可以是ROM加上RAM,也就是说,Java虚拟机和核心类库很有可能放在ROM或者Flash里。事实上,下一代无线手持设备完全可以满足CDC的需求。
CDC是CLDC的完整超集,包含了所有的CLDC规范。另外,在相对充裕的条件下,它支持J2SE的标准 Java 虚拟机和一部分核心类库。对于这一点,几乎所有的文章都这么说,却很少有文章彻底分清彼此之间的兼容性关系,甚至还有文章错误地说CDC支持Java语言的完整实现,这是很容易引起混淆的。
首先可以肯定,既然CDC是CLDC的超集,基于CLDC的程序在CDC内是完全兼容的。不过这里的CLDC程序必须只用到CLDC的部分,一旦采用了某一个Profile,显然也就不能在CDC内兼容了。
其次,CDC支持标准的J2SE虚拟机,这只是Java平台的基础,并不包括建筑于平台基础之上的各种类库。特定设备需要的特定类库由相应的Profile来定义。这一点随后就会提到。还是那个关键:Configuration定义的是一类设备的与设备无关的最小平台,因此,诸如用户界面之类的类都被分离,留在Profile中定义。
虽然CDC支持标准的J2SE虚拟机,但是标准的Java虚拟机显然无法适应有限的资源环境。为此需要专门定义一个虚拟机,称为CVM(开始的时候,CVM代表Compact Virtual Machine,但是后来Sun的工程师认为这有可能与KVM相混淆,因此现在C并不代表特定的含义)。CVM除了支持标准J2SE虚拟机的所有特性外,还支持许多嵌入系统需要的特性,更适合于在资源限制条件下运行,移植性很强。目前Sun提供了Linux和VxWorks之上的CVM参考实现(reference implementation)。
5.Foundation Profile
Foundation Profile提供除了用户界面以外CDC所缺少的几乎所有标准J2SE核心类库,作为其他所有Profiles的基础(我们看到,多个Profile可以共存,也可以叠加)。
6.Personal Profile
Personal Profile针对那些资源相对有限,但是需要高度的Internet和WEB连接支持的设备,例如Web-TV,汽车导航系统等等。它在Foundation Profile的基础上提供了网络特性以及支持Java applets的 GUI。
Personal Profile的前身是Personal Java,Personal Java是Sun为资源限制设备创建 Java 平台版本的早期尝试。Personal Profile将与Personal Java 1.1和1.2向后兼容。
7.RMI Profile
RMI Profile在Foundation Profile的基础上提供RMI支持,将允许网络设备与其它系统应用程序(不一定是J2ME的)交互操作。
回复Comments
作者:
{commentrecontent}