资源描述
J2ME程序远程安装和自动升级
目录
J2ME程序自动升级 1
1. JAD和JAR、Manifest.mf 1
2. JAD和程序安装 3
2.1 远程安装 3
2.2 扩展知识:MIME 4
3. 程序自动升级实现 4
1. JAD和JAR、Manifest.mf
一个Java程序包括两个文件:一个JAR文件,一个JAD文件。JAR文件是安装的数据文件,JAD文件是安装的信息文件。
JAD文件里面包含了程序的大小、名称、类型、安装路径、版权等等信息,我们可以通过修改JAD文件,改变Java程序的安装路径。在实际的安装过程中JAR文件是必不可少的,JAD文件要不要都没关系,但是如果没有JAD文件的话,那么你的Java程序就只能装在“应用程序”里面了。
JAR文件是Java的一种文档格式,JAR文件非常类似ZIP文件,也是一个压缩文件。JAR文件与ZIP文件惟一的区别就是在JAR文件的内容中,它包含了一个meta-inf/manifest.mf文件,这个文件是在生成JAR文件的时候自动创建的。需要注意的是,JAR文件不需要进行解压缩,如果把文件解开反而会造成错误。
JAD(Java Application Descriptor)文件是一个外部(相对JAR文件)描述文件,而Manifest.mf是一个内部列表文件。他们对于AMS的运行都起着至关重要的作用。
虽然它们的命名或者说文件类型都比较让人费解,不过,实际上它们也不过是单纯的文本文件,形式上非常相似,都是:“属性名称:属性值”。
这些属性主要包括:
属性名称
属性说明
Manifest.mf
JAD
MIDlet-Name
MIDlet Suite的名称
必需
必需
MIDlet-Version
MIDlet Suite的版本号
必需
必需
MIDlet-Vendor
MIDlet Suite的作者
必需
必需
MIDlet-n
属于该MIDlet Suite的每一个MIDlet都应独立定义一个
必需
必需
MicroEdition-Profile
MIDlet Suite所需简表版本
必需
必需
MicroEdition-Configuration
MIDlet Suite所需配置版本
必需
必需
MIDlet-Jar-URL
对应JAR文件的下载地址
-
必需
MIDlet-Jar-Size
JAR文件大小,单位:字节
-
必需
MIDlet-Description
MIDlet Suite的描述
可选
可选
MIDlet-Icon
MIDlet Suite的图标路径
可选
可选
MIDlet-Info-URL
MIDlet Suite的信息路径
可选
可选
MIDlet-Data-Size
MIDlet Suite用于持久性存储所需的最小字节数
可选
可选
MIDlet-Permission(MIDP2.0)
MIDlet Suite需要访问的受限API的许可
可选
可选
MIDlet-Permissions-Opt(MIDP2.0)
定义那些访问受限API非关键的许可
可选
可选
MIDlet-Push(MIDP2.0)
Push注册
可选
可选
MIDlet-Install-Notify(MIDP2.0)
定义接收MIDlet Suite安装状态的URL
可选
可选
MIDlet-Delete-Notify(MIDP2.0)
定义接收MIDlet Suite删除报告的URL
可选
可选
MIDlet-Delete-Confirm(MIDP2.0)
MIDlet Suite确认删除的提示信息
可选
可选
根据MIDP的规定,代表MIDlet Suite的JAR文件内部要有一个列表文件,且文件名为Manifest.mf。
JAD文件虽然是可选的,但是也很有用武之地,特别是,在OTA模式下,在MIDlet Suite安装到移动设备之前,AMS首先会读取JAD文件的内容,分析MIDlet Suite是否与设备实现兼容,最典型的就是分析配置和简表的版本是否匹配。如果不兼容,那么AMS就会拒绝安装。这样也符合用户的需求。
同时,使用JAD文件的另一个优势是,可以自定义属性,比如说定义一个web服务的请求URL,当URL改变时,我们就不需要改变JAR的内部文件,来适应变更。
MIDlet-1: Query, Query.png, client.QMIDlet
……
queryURL: http://localhost:8080/QServlet/query.do
仔细观察上表,对于Manifest.mf文件和JAD文件来说三个属性是必须的:MIDlet-Name,MIDlet-Version和MIDlet-Vendor。三者属性值必须保持一致,否则AMS将不会下载和安装这个MIDlet Suite。而对于MIDlet-n,MicroEdition-Profile和MicroEdition-Configuration属性,实际上并不需要在JAD文件和Manifest.mf文件中重复定义。
另外,当用户安装MIDlet Suite的时候,AMS会鉴别正在安装的MIDlet Suite是被信任的(Trusted)还是非信任的(Untrusted)。根据MIDlet Suite类型的不同,AMS处理在这两个文件中被重复定义的属性也采取了不同的方法:
· 当为Trusted时:如果定义的属性在Manifest.mf和JAD文件中都出现,那么它们必须保持一致。
· 当为Untrusted时:如果定义的属性在Manifest.mf和JAD文件中都出现,那么MIDlet在运行时期所取得属性值则以JAD文件中的定义的为准。
属性定义知道了,那么怎么来获取它们的属性值呢?其实很简单,上面所提到的属性值,几乎所有都可以通过javax.microedition.mdilet.MIDlet.getAppProperty()这个方法来获取,唯独MicroEdition-Configuration和MicroEdition-Profile需要是通过java.lang.System.getProperty()来获取的。
最后还有一点值得指出的是:中文问题。把在Manifest.mf和JAD文件中出现的中文字符转换为Unicode的正则表达式可以有效防止乱码。
转换的方法是利用JDK所提供的native2ascii.exe工具。
CMD命令:
native2ascii 源文件.txt 目标文件.txt
转换前:MIDlet-1: 中文字典, DicMIDlet
转换后:MIDlet-1: \u4e2d\u6587\u5b57\u5178, DicMIDlet
这并不局限于JavaME,虽然稍微麻烦了一点,但这是一个比较通用和实用的方法。
2. JAD和程序安装
2.1 远程安装
1) JAR是必需的。
2) JAD文件引导安装可以实现认证。只有JAR安装时,由于缺乏证书信息,只能非信任域安装。
3) JAD修改配置参数中JAR的URL为远程URL可以实现在线安装。也就是只有JAD时,配置了JAD路径为远程URL也可实现安装。但是远程JAR的文件大小以及类型需要和JAD中配置一致。
远程实例:
JAD参数配置
MIDlet-1: BrowserMainMIDlet,,src.BrowserMainMIDlet
MIDlet-Jar-Size: 8574
MIDlet-Jar-URL: http://99.1.101.199/cmbWebBrowser.jar
MIDlet-Name: cmbWebBrowser Midlet Suite
MIDlet-Permissions: javax.microedition.io.Connector.http,javax.microedition.io.Connector.socket,javax.microedition.io.Connector.file.read,javax.microedition.io.Connector.file.write
MIDlet-Vendor: Midlet Suite Vendor
MIDlet-Version: 1.0.2
MicroEdition-Configuration: CLDC-1.1
MicroEdition-Profile: MIDP-2.0
红色部分可见JAR路径已经配置为远程路径
在实际测试过程中,需要注意要对IIS中MIME进行配置。在没有进行过相关配置的时候,运行JAD进行安装会报错获取到的文件类型不符合。在确认JAR没有问题以后,查找资料得知,是因为MIME需要进行如下配置:
在iis增加如下两个mime:
Jad text/vnd.sun.j2me.app-descriptor
Jar application/java-archive
经过JAD配置以及IIS中MIME配置后,运行JAD可以实现远程安装,成功。
2.2 扩展知识:MIME
MIME(Multipurpose Internet Mail Extensions,多用途Internet邮件扩展)是创建用于电子邮件交换,网络文档,及企业网和Internet上的其他应用程序中的文件格式的规范。最早的HTTP协议中,并没有附加的数据类型信息,所有传送的数据都被客户程序解释为超文本标记语言HTML文档,而为了支持多媒体数据类型,HTTP协议中就使用了附加在文档之前的MIME数据类型信息来标识数据类型。
由于MIME类型与文档的后缀相关,因此服务器使用文档的后缀来区分不同文件的MIME类型,服务器中必须定义文档后缀和MIME类型之间的对应关系。而客户程序从服务器上接收数据的时候,它只是从服务器接受数据流,并不了解文档的名字,因此服务器必须使用附加信息来告诉客户程序数据的MIME类型。 服务器在发送真正的数据之前,就要先发送标志数据的MIME类型的信息。
简单来说,服务器通过MIME信息高速客户程序发送的文件类型是什么,客户程序从服务器发送来的MIME信息得知接收到的数据流是什么文件类型,然后调用对应的应用程序进行处理。
3. 程序自动升级实现
已经实际测试过,可以实现。
具体方法是
1) 程序:
在主MIDlet启动的时候,访问服务器获取服务器的版本信息;如果服务器版本和当地版本不一致,就向用户提示是否升级;用户选择升级以后,退出当前程序,远程获取jad文件进行安装;安装过程中从jad定义的远程url获取JAR。
2) 安装文件:
jad中需要修改参数MIDlet-Jar-URL为远程URL。同时提供一个记录了版本信息的文件。
升级程序代码如:
在主MIDlet中,进入程序时判断版本:
public void startApp()
{
String version_current=this.getJadVersion("MIDlet-Version");
WorkThread wt=new WorkThread("http://99.1.101.199/version.txt",Display.getDisplay(this));
String version_remote=wt.Getresponse();
if(version_current.equals(version_remote))
{
UpdateForm uf=new UpdateForm(this,version_current,version_remote);
display.setCurrent(uf);
}
else
{
QueryForm qf=new QueryForm(this,version_current);
display.setCurrent(qf);
}
}
在有新版本的时候,显示升级界面提示下载。
在升级界面,显示版本信息,并让用户选择是否升级。当用户选择了升级以后,进行远程获取JAD文件并安装升级。如下:
String url = "http://99.1.101.199/cmbWebBrowser.jad";
try {
midlet.platformRequest(url);
} catch (ConnectionNotFoundException ex) {
ex.printStackTrace();
}
midlet.notifyDestroyed();
主要为使用platformRequest方法来调用外部应用处理JAD文件,从而实现远程获取JAD文件安装。同时,又由于获取到的JAD中定义了需要使用的JAR文件URL为远程URL,于是又从远程下载JAR,最终实现安装。
程序安装会需要退出当前程序,这也是实现完全安装的唯一方法。
展开阅读全文