symbian学习转载

诺盛电信咨询:移动支付是什么- -| 回首页 | 2006年索引 | - - Nokia 6681菜鸟必修课 zt

腾达智能社区:Symbian基础类知识- -

                                      

http://bbs.smartet.com:81/viewthread.php?tid=397&extra=&page=1
Symbian基础类知识!!!
前言:
许多机友最近发帖询问AppArcServerThread是什么意思,老实讲我不知道,我的专业和计算机毫不沾边,通俗点讲就是火门都摸不着。这类技术性太强的问题请大家以后到symbian专区去看看能否找到答案,或者向【凤凰L~grainy~ldquhot】三位咨询,毕竟他们是那个专区的斑竹,对这方面更有研究。
下文是我在网上资料东拼西凑而成的产物,希望对大家有一点帮助!!!
AppArcServerThread是symbian系统中的一个术语,全称是Application Architecture ServerThread(从字面翻译就是“应用构架的服务线程”【这是我胡乱翻译的,没有找到它的准确中文意思】)
出现这个提示的原因有以下几点【个人观点,说的不对请大家见谅】:
01:尝试删除E:/system/recogs里的所有文件,不用太担心后遗症,这都是一些程序的关联插件
02:使用进程中强行拔出MMC卡,而此时却有卡上的程序正在运行【格卡,请养成好的操作习惯】
03:软件安装在E盘上产生了错误文件,致使系统读取E盘不能成功【找出那个软件彻底删除即可,如果找不到就把E盘文件全部删除或者格卡】
04:E盘的系统框架遭到破坏,造成读取E盘错误【格卡】
以下是一位网友解决这个问题的个案,大家可以借鉴:
QUOTE:
我的QD只要一装东西然后插卡就自动弹出 AppArcServer Thread程序已关闭,而且就算进了菜单机子也慢的几乎不动,必须把卡取掉,然后重新启动再插卡才可以正常使用!如果插卡开机的话就白屏~~~
到网上查看,网友都说可能是卡的问题~,经过我反复研究发现原来是一个文件的原因,只要删掉这个文件就好了~(你的MMC卡上的System/recogs/recAutoExec.mdl这个文件,不知道安什么软件产生的!我把它删掉以后,机器就再也没出现问题了!如果有这个问题的朋友可以试试~但是我想也有可能你的机器不是recAutoExec.mdl这个文件产生的,也可能是其它文件,你可以一个一个的替换就可以查出问题了!
------------------------------------------------
1.1 SymbianOS的六大特性
1、操作系统是运行在ROM上的
2、系统是运行在电池驱动的设备上的
3、完全是面向对象的
4、基于组件的设计
5、被设计成确保用户的数据不会丢失
6、简单的UI系统
Symbian 是真正的微核操作系统,所谓“微核”,就是说操作系统
只有很小的一部分是运行在最高优先级的,其他的功能都是以Client-
Server的方式提供。下面是Symbian系统的内部结构图:
应用层:Shell, OPL, 及其他应用程序
--------------------------------------------
系统层:Dialogs, Menu, Toolbar, Icons, Resources, JavaVM,
Grid, Rich Text, Edit Control, List Control, Application Framework,
Jave Class Libraries.
服务层:Window Server, Process Server, Socket Server, Sound Server,
Wireless Server, Database Server, File Server, Alarm Server, Comms
Server, 以及无线协议
内核:euser.dll, ekern.exe, 服务控制(supervisor server),
HAL(设备抽象层)
驱动程序层:包括音频驱动,显示驱动,MMC驱动,键盘驱动,串并口驱动
,DSP驱动,时钟控制器驱动等等
1.2 Symbian UI系统命名
使用过Symbian UI系统的同志们一定都听说过一些奇怪的名字,比如:
Eikon, Cone, Apparc, Avkon等等,这么多kon字辈的东东到底有什么关系呢?
首先,大家要明白,在kon字辈的同志们中,Cone和Apparc是老大,其他kon们
都是从这两个kon继承来的。
先说说Cone。Cone就是Control Environment(控制环境)的缩写。Cone是Client
端的控制环境。这个东东定义了Graphic UI中一些基础的东西,没什么代码,
但是是一种Design pattern
Apparc是Application Architecture的缩写。Application architecture定义了
Symbian应用程序的框架。主要是定义了CApaApplication, 以及CApaDocument
这两个类,也就是d&v结构。然后还定义了程序启动以及数据控制流等等。
kon们其实就是控件组,关于控件的用法以后再说。Series60用的是Avkon,
Series90用的是Ckon,大家可以理解为不同的kon是专为不同屏幕大小的手机设
计的不同的控件库。
以Series60为例:
Avkon
-----
Eikon
Uikon
Cone + Apparc
============================================
〖Symbian OS内存管理介绍〗
在Symbain OS中内存管理的主要任务是:如何为程序分配内存以及如何在程序的内部分配内存。
Symbian OS 程序最根本和基础的东西就是内存,作为一个有限的资源,必须小心细致地处理,特别是当有错误或异常发生的时候。正是由于这样的原因,在支持清理机制的API中,异常处理和内存管理几乎是绑在一起的。
Uikon核心框架使用这些支持清理机制的API来管理内存,使GUI程序的基础架构具有良好的性能和表现。GUI程序还支持异常情况下内存清理,以及调试模式下的内存泄露检测。
一、Symbian OS的清理机制(cleanup)
清理机制是Symbain OS 程序对于程序异常处理的一种特有方式。当异常发生时,清理机制将清理错误的内存区域。Symbian OS的清理策略和它所有类的基类CBase类有着密切关系。要了解Symbian OS清理机制就必须清楚以下三个概念:异常处理(exception handling)、清理栈(cleanup stack)以及通用清理项(general cleanup item)。
1、异常处理 (Exception Handling)
Symbian OS没有使用C++的try…catch异常处理方式,而是使用了它自己所特有的方式:leave。在Symbian OS中,异常以 leave 的形式出现,trap harness可以在程序中设置一个点,使程序发生leave时回跳到这个点上,宏TRAP和TRAPD 可以在程序中设置这个点。调用系统API User 类的一些静态函数可以触发Leave ,例如 User:eave()方法,这就相当于主动地抛出异常,当然某些系统函数或是用户代码,也有可能发生leave。
2、清理栈(Cleanup Stack)
当 leave 发生时,任何分配了资源的heap内存,例如通过new()方法创建的对象,他们将被孤立,因为leave一旦发生已指向他们的指针就不存在了,这样就导致了内存泄漏。为了防止内存泄漏发生,程序就有要记录那些已经被创建的对象,如果程序运行发生leave,那么系统可以自动找到并清理他们所占用的内存。这些工作可以通过清理栈来完成。CleanupStack类是支持清理栈的一个类。GUI应用程序拥有一个由应用程序框架所提供的清理栈,其他的应用程序必须用CTrapCleanup 类自己构建一个清理栈。
3、通用清理项(General Cleanup Item)在默认情况下,清理栈只处理那些 CBase-based 类(也就是它所处理的类必须是由 CBase类继承下来的)和那些untyped 类型对象(用一个简单的内存释放语句就可以释放的对象)。通用清理项(General Cleanup Item)使其他类型的对象也可以放到清理栈中。TCleanupItem类是支持通用清理项的一个类。
2005-11-12 11:59 #2
状态 离线  二、Symbian OS的内存分配
内存分配管理的目的在于 能够使Symbian OS 进程通过底层函数访问和操纵内存区域。绝大多数的客户端程序不需要直接使用这些函数,那些在进程间共享内存区域以及在一个进程的线程间共享内存区域的程序会使用这些底层函数来管理内存。这里有两个概念需要了解 chunk(块) 和 heap(堆)。
1、Chunk(块)chunk 是一组线性相邻的内存地址在RAM 中的映射。进程创建以后,它的地址空间包括1到3个chunk:
(1)stack/heap chunk:这里包括了进程的主线程所要使用的stack 和 heap。所以这个chunk 通常是进程所必须的。
(2)code chunk:这个chunk 只有当进程被加载到RAM时才出现。
(3)data chunk:只有当进程拥有静态数据的时候才会有这个chunk。
当然,程序可以还创建额外的chunk。 一个全局的chunk可以被其他进程访问,这样就实现了大量内存的共享。RChunk 类提供了对chunk的支持。TFindChunk 类可以用来查找其他进程创建的全局chunk。
2、Heap(堆)
heap 通常用于显式的动态内存分配 。Symbian OS定义了C++中new操作符创建对象到当前线程的heap中。Heap的功能可以是:
?监控内存泄漏:对于一个GUI程序来说,这个是经常发生的。
?在同一进程的线程间进行共享。
?在单元一级上进行访问和操作。
RHeap类提供了对heap的支持。如果heap 是当前线程的 heap,那么使用等价系统静态方法API 的User 类 将更加方便。这些系统静态方法API 同样也提供了宏来管理内存,以防止内存泄漏。
三、进程和地址空间
Symbian OS 的程序可以包含若干进程,每个进程包含若干在概念上并发执行的线程。每一个用户进程都有他自己私有的地址空间。一个用户进程不可以直接访问另外一个用户进程的地址空间。进程包括若干线程,他们运行在进程的特权级。
Kernel 进程是一个比较特殊的进程,它的线程运行在超级访问者级别,这个进程通常包括两个线程。
Kernel server 线程:是一个原始的进程,在系统启动时就已经存在。它可以在heap执行核心函数请求的内存分配或重新分配。
null 线程:当系统中没有其他可运行的线程时这个线程就开始运行,null 线程使处理器处于空闲状态,减少耗电
线程的地址空间包括若干chunk,在刚创建的时候,进程只有一个线程和1到3个chunk。如果进程创建了新的线程,那么一个新的chunk将被创建被分配给这个线程。每一个chunk都包括一个了stack,如果线程没有共享当前heap,那么在chunk中也将包括heap。
四、Chunks(块)
Chunk 把RAM映射到一个连续的虚拟地址。一个chunk中包括了一个保留区(reserved region)和和委托区(committed region)。保留区是一个连续的虚地址区域,它的大小可能是整个chunk的大小。在委托区中存放了真正映射到RAM的地址。chunk的大小是可以被动态修改的,允许委托区也可以修改大小,他的范围是从0一直到保留区大小,是处理器页面大小的整数倍。这样,就允许进程获得更多的内存空间。通常,委托区起始地址位于保留区底部。另外还可以创建 double-ended chunk ,那么委托区将是保留区的任意连续子集,他的大小也是处理器页面大小的整数倍,这种Chunk的委托区可以有两个顶端和底端,并且它们的大小也是可变的。
在chunk创建时可以指定chunk的最大空间,保留区大小应该小于这个最大值。.尽管这样,如果保留区请求比当前chunk更大的空间,那么chunk可以被重新分配空间,以允许保留区扩大。保留区可以扩大到撑满整个chunk.。
Local chunks(本地 chunk)
如果一个chunk对于创建它的进程是私有的,不允许被其他用户进程访问,那么那么这个chunk就是本地chunk,本地chunk是没有名字的。
Global chunks(全局chunk)
如果一个chunk可以被其他进程访问,那么这个chunk就是全局chunk。全局chunk是有名字的,这样,进程可以根据chunk的名字来访问他们。当进程打开一个全局chunk的时候,他把chunk映射到自己的地址空间,这样就可以对chunk进行直接访问和数据共享了。如果已经知道了chunk的名称,那么使用 RChunk::OpenGlobal() 可以直接打开chunk.。如果只知道了chunk的部分名字,那么可以使用带 TFindChunk 型参数的 RChunk::Open()方法来打开chunk.。
五、Heaps(堆)
Each thread has a chunk which contains that thread's program stack. For the main thread of a process, this chunk also contains the thread's heap. A program's request for memory is allocated from this heap. For example, a code fragment such as:
每一个线程都有一个包含了自身程序栈(program stack)的chunk。.对于进程的主线程来说,这个chunk中同样也包含了线程heap。程序对于内存的请求都是从这个heap的地址空间来分配的,例如有以下代码:
CArrayFixFlat<...>* fixflat;
...
fixflat = new (ELeave) CArrayFixFlat<...>(3);
程序请求了heap中部分的内存地址,并把地址返回给调用者。请求heap中的内存必须是显式的,同样,释放这些内存时也必须进行显式调用。
Structure of a heap(heap 结构)
heap包括两个单元列表。一个是已经分配的内存单元列表,一个是还未分配的内存单元列表。两个列表都在heap对象上。内存单元由单元头和单元体组成,单元体实际上就是一个内存区。单元头是在e32std.h 中定义的 RHeap::SCell 结构体,他是RHeap类的一部分。
如何共享heap
heap通常被同一个进程的线程所共享当一个线程创建时:
?它可以和父线程使用同一个heap。
?父线程同时为新线程创建一个新的heap。
?新线程使用系统为它创建的heap。
这里,只有第一和第二中情况可以认为是heap的共享。
2005-11-12 11:59 #3
状态 离线  〖术  语  表〗
活动对象?负责向异步服务提供器发出请求和处理这些请示的完成的类。它必须从CActive派生而来。
活动规划器?在事件处理程序中,负责为活动对象规划事件的类。类必须派生于CActiveScheduler。
应用程序信息文件(AIP,Application Information File)?包含应用程序标题、图标、功能和MIME优先级支持信息的文件。文件扩展名为.aif。
AIF生成器?用于生成应用程序信息文件及其图标的GUI程序。SDK程序运行在开发的机器上(不是运行在设备或模拟器上)。
应用程序编程接口(API,Application Programming Interface)?系统对象或组件向其他对象或组件暴露的可见公共行为。
应用程序架构(Apparc,Application Architecture)?为Symbian OS应用程序及CONE提供了部分基本框架。
应用程序框架?处理应用程序的启动和对应用程序数据(它的文档)的访问。
应用程序启动器?Series 60设备的默认视图,以网格或列表视图模式显示可供选择的应用程序。
AppWizard?可以IDE集成的工具,用以快速生成GUI应用程序骨架。
ARM处理器?运行32位(或16位)嵌入式ARM RISC的处理器。
ARM4?用于基于ARM处理器的32位指令集和二进制接口。如果应用程序针对ARM4进行编译,它仅调用针对ARM4或ARMI编译的函数。ARM4代码运行速度比THUMB代码快,但却占用更多的ROM空间。
ARMI?用于基于ARM处理器的32位指令集和二进制接口,并带有Interwork模式。如果应用程序针对ARM进行编译,它调用针对ARM4、THUMB或ARMI编译的函数。ARM代码运行速度比THUMB代码快,但却占用更多的ROM空间。这是推荐使用的默认生成兼容性格式。
ASCII(美国信息交换标准码)?计算机使用的编码数字标准,用于表示所有大小写拉丁字母、数字、标点符号等等。有128个标准ASCII码,每个标准ASCII码可用一个7位二进制数来表示。
Avkon?Series 60标准UI库和应用程序框架(构建于Symbian Uikon技术之上)。
BC(二进制兼容)?如果程序动态链接到库的以前版本上,使用新版本库仍能继续运行,而不必重新编译,则该库为二进制兼容。
承载层?用于承担通话的电话网络。
黑箱子测试?在不知道被测试的组件的情况下所进行的测试。
Blit?从内存到图形设备进行像素数据拷贝的块传输。
蓝牙(BT)?在移动设备之间无线传输声音和数据的开放标准。
Bmconv?用于在Windows和Symbian OS格式之间转换位图的工具。
BMP(位图文件)?提供图像、图标和遮罩使用的像素模式,并提供填充显示区域的子图形和画刷。
布尔?只有真或假两种值的表达式或变量。
CA(证书授权机构)?发布用于创建数字签名和公钥对的数字证书的第三方受权威组织或公司。
证书生成器?用于创建证书请求文件,然后将该文件发送到证书授权机构。
密码组?用于安全套接字的数据加密机制。
清除栈?部分构建数据项的引用的栈,由CleanupStack:ushL()和CleanupStackp()来维护。当它们异常退出时,将清除该栈。
客户?从另一个程序请求服务的程序。
剪切区域?将原始图像进行剪切的目标区域。
Codec(编解码器)?在不同数据格式之间相互转换的机制。
编码标准?Symbian或其他组织定义的标准,用于规定良好的编码习惯。
COM?串行通信端口,它支持RS-237通信标准。
CommDB(通信数据库)?提供系统范围的存储,用于通信相关的设置。
Comms模块(CSY)?串行通信模块。提供了串行端口与串行通信服务器连接的实现。
压缩商业卡?为Nokia 9000智能手机定义的旧式Nokia格式。
技术资格中心(Series 60)?诺基亚对有限数量的公司进行监察并授予Series 60软件工程高级资格的系统。
技术资格中心(Symbian)?Symbian对有限数量的公司进行监察并授予Symbian OS软件工程高级资格的系统。
复合控件?包含一个或多个简单或复合控件的控件。
CONE(控件环境)?为窗口服务器的异步服务提供活动对象接口,同时为控件和app UI提供框架。
控制台应用程序?不具有GUI界面的应用程序。
容器控件?复合控件。
上下文敏感菜单?根据应用程序的状态,当用户请求使用菜单时,为用户提供特定的菜单。
控件?屏幕的一个矩形区域,能响应用户的输入事件。
裁剪?输入图像时,去掉不需要的部分。
CSV(由逗号分隔的值)?一种文件格式,其中的每个不同数据项由逗号分隔。
CSY(串行通信模块)?串行通信模块。提供串行端口与串行通信服务器的实现。
数据报?用于断开式网络服务的信息包。使用数据包中的头部将它传输到目地地。
Daytime?用于决定远程计算机所在位置的时间的因特网协议,以人类可读的形式给出。
描述符?从TDesC派生的类,它描述用作字符串或某些二进制数据的内存区。
对话框?一个控件,通常由选择的菜单命令进行调用,它允许用户与程序之间进行交互。
拨号网络(DUN)?通过电话线,用调制解调器拨号连接到网络的方式。
直接屏幕访问(DSA)?不使用窗口服务器,直接在屏幕上进行绘制的方式,它避免了客户和服务器之间的通信,因此速度较快。
DLL(动态链接库)?为响应执行程序对API的显式调用而装载动态链接库。
DNL(动态导航链接)?使用视图架构的应用程序可以让其他应用程序发送消息,指定显示的视图、可能相关的伴随数据,这种消息称做动态导航链接消息。
DNS(域名服务器)?因特网名字和地址的数据库,它将名字转换成官方因特网协议数字或反之。
嵌入式文档?在另一个文档中保存的文档,因此在这两个文档之间产生关联。例如,在文本文档中保存图像。
双缓冲?在显示之前,通过在离屏缓冲中构建图像,达到平滑显示动画的技术。
DTMF(双音多频)?拨号时,电话系统用于与按键通信的方法。电话键盘上的按键产生两种模拟间,一种用于行,一种用于列。通过交换进行解码,从而判断按下的是哪个键。
ECom?便于使用插件模块的框架。
编辑器?有于数据项的UI控件。
EIKON?EIKON包含一个编程框架以及一个具体控件和标准控件集。在Symbian OS v6.0中,EIKON由UIKON和平台特定的UI库取而代之。
模拟器?在运行Microsoft Windows的 PC上实现Symbian平台。模拟器是Symbian平台的主要开发环境。
引擎?应用程序中的UI独立部分,它与数据操作及其他基本操作有关,这些操作均与最终向用户显示的方式无关。
EPOC?Symbian OS的原始名。它定义了特地为基于ROM的移动计算设备定义的操作系统。
ESOCK?Symbian OS套接字框架。它提供了一个抽象套接字接口,扩展后用于支持可编写的特殊套接协议,如TCP/IP。
ETeI?Symbian OS电话框架。它提供了抽象电话接口,扩展后用于支持可编写的特殊电话协议或设备。
事件?用于描述对事件源请求的完成过程的广义术语。
事件源?异步服务器提供器,当某事件发生时,它导致请求的完成(一般不会直接请求)。
异常?导致退出的程序条件。
外部化?将对象的数据写入流的过程。
工厂函数?返回自身类型指针的函数,是一种对象构建机制。
2005-11-12 11:59 #4
状态 离线  FFS(闪速文件系统)?一种持久性文件系统,它使用闪速RAM进行存储。一般为c:驱动器。
FEP(前端处理器)?允许输入字符(如T9)、手写识别或语音输入的框架。
FIFO(first-in, first-out)?一种缓冲的队列类型。
文件?永久存储器上的数据集合,可通过文件服务器进行访问。
文件服务器?负责所有文件系统操作的服务器线程。使用文件的所有应用程序都是该线程的客户端。
刷新?清空缓冲,将它的内容发送到下一个处理阶段。
折叠?为了进行粗略性或对大小不敏感的匹配,消除那些不重要的字符之间的差异。忽略大小写区别的同时,还忽略字符的重音。
窗体?表示相关数据项字段的UI组件。
框架?通过编写插件模块,可以扩展功能的组件(框架扩展)。扩展开发人员编写由该框架定义的接口派生而来的类。框架在运行时载入需要的扩展。
FTP(文件传输协议)?用于因特网上进行文件交换的协议。
GCC?GNU C++编译器。
GDI(图形设备接口)?与图形操作、图形上下文和位图相关的Symbian OS组件。
GET?用于获取特定文档的HTTP请求方法。
GIF(图形交换格式)?用于图像文件的常见格式。
GNU?致力于创建和支持开放源码软件的组织。
GPRS(通用无线分组业务)?一种GSM数据传输技术,它不为数据的传输和接收从便携终端建立连续信道,而是以包的形式传输和接收数据。
粒度?为数组增加容量的元素个数。
网格?提供行列布局功能的UI组件。
GSM(全球移动通信系统)?一种数字移动电话系统,它使用一种分时多重访问方式。
2005-11-12 12:01 #5
状态 离线  在三种数字无线电话技术中(TDMA、GSM和CDMA)中,它的使用最为广泛。
GT(通用技术)?Symbian OS通用平台,用作UI平台(如Series 60)的基础。
GUI(图形用户界面)?窗口、对话框和其他用户用于交互的控件的系统。
HAL(硬件抽象层)?用于为硬件提供通用接口,并“隐藏”硬件特定的函数。
句柄?标识其他线程或进程所拥有对象的方式。
堆?用于动态内存分配的内存区域。
HTML(超文本标记语言)?用于创建因特网上所使用的超文本文档的编码语言。
HTTP(超文件传输协议)?因特网使用的对应协议。HTTP定义了格式化和传输消息的方式,还定义了响应不同命令时,Web服务器和浏览器应该采取什么样措施。
超级终端?可用于将主机与硬件设备进行连接的Windows程序,它使用主机上的串行通信设备以及通过空解调器电缆连接的硬件设备。
IAS(lrDA信息访问服务)?IrDA协议栈层,负责搜寻服务。
ICO?用于图标的图像格式。
IDE(集成开发环境)?支持软件编写过程的系统。此系统可能包含语法检查器、程序项的图形工具以及用于编译、运行和调试程序的集成支持(与源代码对应的相关编译错误)。
IMAP4(因特网信息访问协议,v.4)?远程访问服务器上的因特网邮件的开发标准。
IMEI(国际移动站设备标识)?手机序列号。输入*#060#可显示手机的IMEI号。
安装文件生成器?SDK提供的makesis.exe工具,用于创建安装文件。
接口(ECom)?定义插件DLL提供的服务的类。
内部化?从流中读取数据并将赋值给对象的过程,可能会从该数据构建新对象。
国际化?通过使用应用程序支持各种不同的语言而进入国际市场。
因特网访问点(IAP)?可用于访问因特网的一系列设置,如用户名、密码、ISP详细信息等。
因特网地址分配委员会(IANA,Internet Assigned Numbers Authority)?不同因特网协议参数(如端口、协议和企业号以及选项、代码和类型)的注册中心。
因特网控制消息协议(ICMP)?IP协议的一部分,用于处理错误和控制消息。
进程间通信(IPC)?跨线程和进程边界的通信。Symbian OS中的服务器使用IPC。
IP(因特网协议)?用于TCP/IP协议套件的网络层协议。
IP地址?给因特网上的每个设备分配的全球惟一编号,用于与指定的计算机进行连接。
IR(红外线)?低于可见光频率范围的电磁波(与辐射热相对应)。
IrCOMM?为以前的COM程序、打印和调制解调器设备提供COM(串行)端口模拟的协议。
IrDA(红外数据协会)?设置红外通信标准的团体。
IrLAN?支持局域网IR无线访问的IrDA协议。
IrLAP?提供点对点连接的IrDA协议。
IrLMP?IrDA协议,它支持通过单个点对点连接进行多重会话。
IrMUX?提供不可靠数据报服务的IrDA协议。
IrOBEX(红外对象交换)?用于交换vCard和vCal的协议。
IrTranP?可用于在数码照相机和Symbian OS手机之间传输图片的IrDA协议。
ISP(因特网服务提供商)?提供因特网访问的公司(通常为付费服务)。
Java?一种高级编程语言,由Sun Microsystems开发。
Java MIDP(移动信息设备架构)?专门用于手机的Java API集。
JPEG(联合图像专家组)?一种图形图像文件或图像压缩算法。
实时(JIT)?实时调试,即对正在终止的进程附加的调试器。
内核?操作系统的核心。它管理内存、进程和库的装载,并规划线程的执行。Symbian OS的内核名叫ekern.exe。
L2CAP(蓝牙逻辑链接控制和适配协议)?控制链接的多用户如何一起协作、如何处理包片断和程序集以及传递服务质量信息。
异常退出?Symbian OS的异常处理。异常退出时调用函数user: eave()。导致返回到当前的捕获装置,它等价于C++中的throw。
库?可供程序使用的预编译例程集合。
链表?存储的数据项集合。其中的每个元素或节点包含前一个或下一个列元素的指针。
列表?用于显示文本或图形化元素数组的UI组件。
本地文化?与已知语言和国家对应的信息集。
日志引擎?用于记录用户感兴趣的事件,其中一些事件,用户可能不能马上知道,或者可能会导致费用的增加,比如电话呼叫。通过查看程序可以读取这些事件并显示给用户。
机器UID?惟一设备标识码,在生产商的产品中,绝对具有惟一性。
宏?保存在可执行窗体中的指令集。
幻数?代码中的文字数数字,不带有解释或明显的意义。
Makefile?包含指定如何在不同环境中生成项目的必需信息的文件,由makmake工具从.mmp文件生成。
遮罩?定义另一幅位图的透明区域的位图。
MBM(多位图文件)?压缩位图的集合。用于Symbian OS中,作为一种在单个文件中存取大量位图的有效方式。
内存泄漏?当应用程序分配了使用的内存,但在结束时没有释放内存,此时将发生内存泄漏。
菜单?包含用户可执行的动作列表的UI控件。
消息传送?消息传送核心功能的框架,为新消息传送协议提供支持的框架。客户程序及协议提供程序均使用该API。
MIME(多用作因特网邮件扩展)?因特网邮件消息通过该协议可以包含若干独立的条目,包括二进制数据和应用程序特有的数据。
混合类?为与主要基类混合而设计的协议接口定义。在Symbian OS中惟一使用多重继承的基础。混合类只应当包含纯虚成员函数。这意味着,它们只描述对象的期望行为。
MMP?也称做项目文件。手工编辑的文件,主要目的是指定组成可发布的源文件。用作makmake工具的输入。
MMS(多媒体消息传送服务)?在手机之间发送多媒体消息内容的机制。
有模式对话框?一种对话框类型。用户可以与其他UI控件交互之前,必须关头有模式对话框。
无模式对话框?不带有模式的对话框类型。
MSDN(微软开发人员网络)?为使用微软产品和技术的程序开发人员提供帮助而设计的服务集(http://msdn.microsoft.com)。
MTM(消息类型模块)?消息传送架构的插件,它是一组组件,一起为特定的协议提供消息处理。
多字段数字编辑器(MFNE)?具有一个或多个字段的数字编辑器,每个字段用数据特定的字符分隔。可用于日期、时间项等。
多任务处理?同时执行多项任务的能力。从计算的角度看,这意味着,从一个程序切换到另一个程序由于相当快,以至于外表上看起来就像同时在执行多个程序一样。
多线程处理?一些操作系统必须同时执行程序的不同部分、不同线程的能力。
命名空间?将声明和定义按组放置在一起的作用域。
NIFHAN(网络接口管理器)?负责网络连接的Symbian OS组件。
通知(note)?用于向用户传达信息的一种UI控制。
OBEX(对象交换)?让vCard联系人信息和vCalendar日程项等对象使用IrDA (IrOBEX)或蓝牙进行交换的高层协议集。
OOD(磁盘空间不足)?当前文件空间耗尽时出现此条件。
OOM(内存不足)?RAM耗尽时出现此条件。
选项菜单?按选项软键时激活的菜单(“选项”是左软键的默认值)。
OS(操作系统)?计算机用于规划任务并控制系统资源使用的系统软件。
包交换数据(PSD)?基于包交换原理的数据通信网络。
严重错误?由终止当前执行线程的编程错误导致的运行时异常。
PCM(脉冲编码调制)?从模拟声音中取样并将结果保存为二进制数据的过程。
PDP(包数据协议)?PDP上下文指安全性、费用、服务质量和通话线路等信息集,它描述了移动无线服务通话和会话。
个人数字助理(PDA)?一种手持计算设备。
PIH(个人信息管理器)?通常包括地址簿、以有效方式组合注释、约会和姓名等信息的应用程序。
平台UID?惟一平台标识码。Series 60的每种发布版本均具有不同的平台ID。
插件?多态接口DLL,用于提升和扩展父程序的操作。
PNG(可移植网络图形)?作为GIE后续格式而设计的一种图形格式。
POP3(邮局协议,V.3)?从服务器读取因特网邮件的开放标准。
端口号?应用程序与传输服务之间的逻辑通信信道的标识符。每个程序或服务监听特定端口上到达的包,IANA将某些端口永久分配给特定的协议。例如,端口80一般用于HTTP通信。与主机设备建立连接时,端口号总是与IP地址结合使用。
POST?用于传输表单数据的HTTP请求方法。
PRT?协议模块。
PUT?将数据推入服务器的HTTP方法。
QA(质量保证)?保证商业产品满足某些最低标准的系统。
查询?用于向用户提出问题的UI组件。
RAM驱动器?非持久的临时文件系统,一般为d:驱动器。
RAS(远程访问服务)?允许远程用户登陆LAN的Windows功能。可以配置为让Series 60模拟器连接到网络。
资源文件?与可执行代码分离、包含数据的文件。它们的主要用途是定义用户界面组件以及保存本地化数据。
RFC 2616?HTTP 1.1规范。
RFCOMM?允许应用程序以相似的方式对待蓝牙的接口,让它就像在串行端口上通信一样。
RGB?红、绿和蓝。混合后显示屏幕上像素色的主要颜色。按不同成份组合这三种颜色可以得到发射光的每种颜色。
RISC(精简指令集计算机)?一种计算机处理技术,其中的微处理器理解若干简单的指令,因此提供了快速、可预测的指令流。
ROM(只读存储器)?用于保存计算机关闭时继续存在的程序和数据的存储器。它是持久性存储,可读出,但不能更改。一般为z:驱动器。
RS-232?使用电缆进行串行数据传输的标准,一般通过在数据和控制信号线上的?5V和?12V之间进行。
SA(系统代理)?动态管理某些变量的状态,这些的值反映了许多系统组件的当前状态。
SDK(软件开发包)?让软件开发人员创建运行于特殊平台上的产品的软件包。
选择键?该“键”用于确认选择。在Series 60设备上,这意味着导航控制器的中心位置。
信号量?用于在Symbian OS中同步协同操作线程的内核对象。通过RSemaphore句柄访问信号量。
2005-11-12 12:01 #6
状态 离线  串行通信?在单信道上逐个发送数据位的系统,它不是同步发送。
服务器?为另一个程序执行服务的程序。
服务搜寻数据库(SDD)?保存了手机可用蓝牙服务信息的数据库。
服务搜寻协议(SDP)?用于定位和描述蓝牙设备提供的服务。
会话?在客户和服务器之间通信的信道。
设置列表?一种Series 60 UI控件,用于向用户显示配置设置。
SIM(用户标识模块)?用于手机中的智能卡。它包含用户访问网络、接听电话的标识,也可以保存个人信息,如SMS消息和手机目录。
SIS文件?Symbian安装文件,由安装文件生成器(makesis. exe)生成,或由SIS文件创建器(Sisar)生成。文件扩展名为.sis。
Sisar?SIS文件创建器。
皮肤?GUI元素,可进行更换,让界面具有不同的外观。皮肤也称做“主题”。从Series 60 2.0开始支持皮肤。
SMIL(同步多媒体集成语言)?基于XML的语言,用于MMS消息的表示中。发音为“smile”。
SMS(短消息服务)?在手机间发送文本消息的机制。
SMTP(标准邮件传输协议)?发送因特网邮件的开放标准。
套接字?两个应用程序间通信端点的抽象(尤其是通过TCP或UDP进行通信时)。Symbian OS ESOCK组件提供了通用套接字接口。
软键?设备上的一个按键,它根据手机的操作更改功能。它的当前功能使用手机显示屏上按钮之上的关键字来突出。Series 60设备有一个左软键和一个右软键。一般左软键用于菜单和确认性响应,右软键用于退出视图和否认性响应。
小图形?一各任意形状的位图,应用程序不必重绘相应的屏幕就可以移动它。一般用于指针光标和用于游戏中的动画人物形象。
SSL(安全套接字层)?用于安全因特网通信的协议,它按加密的形式传输数据。
栈?用于实现数据结构的内存区域,它遵循后入先出的访问模式。系统栈用于保存本地程序变量、方法参数和返回值。
STL(标准模板库)?包含类、算法和迭代器的一个C++库。注意,这个库不是为Series 60而实现的。
存储?流的集合。
流?一个或多个对象的外部表示。
结构?任意类型元素集合的数据结构。
Symbian?Symbian是一家软件授权公司,由无线工业领导者所拥有。它为允许数据操作的手机提供了一种操作系统:Symbian OS。
Symbian OS?一种操作系统,Series 60平台的构建基础。Series 60 1.x基于Symbian OS 6.1,Series 60 2.x基于Symbian OS 7.0s。
SyncML(同步标记语言)?基于XML的标记语言,也是数据同步的开放标准。它允许在服务器和不同移动应用设备之间实现数据同步化。针对无线网络进行了优化。
系统监测?Series 60内的子系统,用于监视性能,它可能请求关闭应用程序。例如,OOM(内存不足)监测。
TCP(传输控制协议)?面向连接的协议,它构建于TCP/IP中的IP之上。它添加了可能的通信和流控制。
TCP/IP(传输控制协议/因特网协议)?用于在因特网上进行连接的通信协议套件。
Telnet?使用TCP/IP协议提供终端模拟的协议。它允许用户登陆和访问远程计算机。
主题?参见“皮肤”。
线程?在进程内的单个执行单元。线程并发运行。
THUMB?用于基于ARM处理器的16位指令集和二进制接口。如果程序对THUMB进行编译,则只其他针对THUMB或ARMI编译的函数。THUMB代码运行速度比ARM4代码速度快,但占用较少的ROM空间。
TIFF(标签图像文件格式)?图像文件格式。
TinyTP(小型传输协议)?一种IrDA传输协议,它给IrDA栈添加了每个信道流控制以及SAR(片断和程序集)。
TLS(线程本地存储)?可用于在DLL和线程上下文中锚定信息的内存机器字。代替使用(非常量)静态数据,因为Symbian OS DLL并不支持它。
TLS(传输层安全性)?用于安全因特网通信的协议,它以加密的形式传输数据。RFC-2246中定义了改进的SSL 3.0。
捕获?在捕获装置中执行C++语句集的宏。等价于C++异常处理中的catch语句。
捕获装置?与TRAP和TRAPD相关联的构造。在捕获装置内执行的代码可能异常退出,返回装置的清除部分,自动使数据项从清除栈中清理掉。
TSY?一种ETel扩展模块,它处理ETel服务器与特殊电话设备或设备家族之间的交互。
缇?1/1440英寸,或1/20点。GDI支持的所有度量或者对于设备采用像素为单位,或者对于真实的大小采用缇为单位。
UART(通用异步收发报机)?驱动RS-232串行端口的硬件的常用名。
UI(用户界面)?控件、编辑器和对话框层,用户通过它可以控制运行的程序。
UID(惟一标识符)?全球32位惟一性数字,用于复合标识符中,惟一性地标识对象、文件类型等。
UID类型?用于标识Symbian OS对象的3个UID集合,由TUidType对象封装。
UID1?复合标识符(UID类型)中的第一个UID。它标识Symbian OS对象的一般类型,可看作系统级别的标识符。可执行文件、DLL和文件存储都由UID1来识别。
UID2?复合标识符(UID类型)中的第二个UID。它在一般类型(由UID1定义)内进行识别,可看作接口的标识符。静态接口(共享库)DLL和多态接口(应用程序或插件框架)DLL由UID2来识别。
UID3?复合标识符(UID类型)中的第三个UID。它标识特定的子类型,可看作是项目标识符。已知程序的所有对象(包括库DLL、框架DLL和所有文档)可共享UID3。
Uikon?提供通用控件的Symbian UI层。根据Uikon构建平台特定的UI。
UML(通用建模语言)?用于面向对象设计的标准标记和建模技术。
Unicode?16位字符集,给各种语言中的字符分配惟一性的字符码。Series 60是一个Unicode平台。
URI(通用资源指示器)?指向因特网上对象的名字和地址通用集合。例如URL和部分URL。
URL(统一资源定位器)?因特网上资源的地址。
用户数据报协议(UDP)?TCP/IP协议套件中的无连接式、不可靠传输层协议。
UUID(通用惟一标识符)?惟一性的128位数字。UUID用于蓝牙设备地址。
vCalendar?用于创建、保存和共享电子日历或规划信息的开放因特网标准。由Versit联盟开发,现在由因特网邮件联盟控制。
vCards?用于创建、保存和共享电子商业卡片的开放因特网标准。由Versit联盟开发,现在由因特网邮件联盟控制。
视图?定义完备的用户数据表达方式。许多应用程序围绕许多基本数据视图而设计,它们组成了应用程序的GUI。
WAE(无线应用环境)?部分WAP标准。WAE指定了允许操作人员和服务提供商构建可到达各种不同平台的应用程序和服务的环境。
WAP(无线应用协议)?在手机上下载和显示浏览器内容的开放标准。
WBMP(无线位图)?用于WAP的单色图像格式。
WCDMA(宽带码多分址)?宽带无线访问的技术。允许进行高速的多媒体服务,如因特网访问和视频会议。
WDP?在容许不同数据的承载层服务之上,提供WAP通用数据报传输服务。
白箱测试?检查程序结构并根据程序逻辑得到测试数据的软件测试。
WIN32?在WINS生成中,用于链接的Windows 32位系统库。
窗口服务器?代表客户程序管理屏幕、键盘和指针的服务器。
WINS(Windows单进程)?模拟器生成,它运行在单进程环境中(有时,特定指Microsoft Visual C++ IDE生成)。
WINSB?用于Borland C++ Builder模拟器生成的WINS平台。
WINSCW?用于Metrowerks CodeWarrior模拟器生成的WINS平台。
WMF(Windows元文件)?常规Windows图形文件格式。
WSP(无线会话协议)?提供轻量级的WAP 客户/服务器事务,相对于基本数据报服务,具有改进的可靠性。
WTLS(无线传输层安全性)?提供隐私、数据完整性和WAP验证的层。
WTP(无线传输协议)?提供轻量级的WAP 客户/服务器事务,相对于基本数据报服务,具有改进的可靠性。
XML(可扩展标记语言)?专门用于Web文档的语言,允许创建自定义标签。
状态 离线  〖开 发 参 考〗
本章将详细介绍两个Series 60项目中的所有组件,另外还将介绍使用其他关键开发工具工具来生成、部署和运行示例应用程序。
本章重点关注项目结构、文件和必需的生成工具。本章分为两个部分。第一部分是关于复杂项目定义和深入使用生成工具的指南。第二部分从“额外开发工具”一节开始,这一部分主要提供参考信息。读者可能希望略读这一部分,不过其中描述了更多开发工具、高级项目信息以及生成和应用程序开发问题(第4章将讨论应用程序设计、结构和源代码)。
第一部分的指南对于生成过程的更多高级特性提供了指导?应查阅第1章,温习基本过程和语法。该指南描述了3个示例项目中每个关键文件的内容,重点介绍.mmp和bld.inf文件的组成以及语法,我们已在第1章中介绍了这两个文件。
这一部分介绍的GUI应用程序演示了更复杂Series 60项目的细节和组成。同时介绍了该项目的两个变化版本。第二个版本显示如何创建本地化应用程序项目。
这一部分还介绍了一个控制台示例应用程序。一般情况下,将使用这个简单类型的可执行文件作为测试其他代码模块的基础?例如,测试应用程序引擎等组件。
本章将学习一些更常用的SDK工具,例如如下的一些工具:用于生成应用程序资源的工具、用于创建位图和图标的工具、甚至是用于创建基础Series 60应用程序中文件和代码的向导。
应用程序本地化?也就是说,设计并编码用于多个地区和语言的应用程序?对于最大化应用程序的市场范围至关重要。Symbian OS中针对这一点提供了非常优秀的支持,本章将从项目和生成的角度描述这一部分开发过程的关键元素。
本章也将更深入地介绍应用程序部署,同时说明如何得到更复杂的安装包,包括本地化应用程序的安装包。
本章也提供了有关SDK和模拟器配置信息的详细链接,包括测试和调试工具的概述、模拟器热键的相关信息以及如何使用支持红外线和蓝牙(Bluetooth)设备为模拟器添加通信功能的细节。
?        SDK版本和选择?关于安装并使用各种当前可用SDK版本的信息。介绍如何设置EPOCROOT的值和使用devices命令,同时介绍了正确建立系统路径的技巧。
?        HelloWorld GUI应用程序?详细描述了两个Symbian OS一般性项目文件。介绍如何生成并运行应用程序,同时描述产生的运行库文件。讨论项目文件夹和源文件的结构。介绍应用程序UI资源文件和资源编译器、应用程序信息文件、图标、标题。
?        通过HelloWorld示例的一个变化版本HelloWorldLoc演示应用程序本地化的涉及的内容。演示了示例应用程序的英语、法语和德语版本。
?        控制台应用程序?详细描述了两个一般性项目文件,同时描述了控制台项目文件和GUI项目文件之间的区别。介绍如何生成并运行该应用程序,还描述了可执行文件和源文件。
?        Symbian安装系统?介绍如何包装应用程序的所有组件,从而在真正的Series 60设备上安装该应用程序。在安装和本地化的应用程序安装期间运行可执行文件。
?        额外的开发工具?介绍Symbian OS位图文件和应用程序创建向导,同时介绍了开发人员可以使用的其他大量工具和实用程序。
?        许多Series 60 SDK和IDE的安装技巧?有关配置模拟器并使用它的许多工具的知识。
?        高级应用程序部署和生成指导?避免在不兼容设备上安装软件的Series 60 Platform UID。提醒读者注意一些Series 60平台的本质区别,同时介绍模拟器和目标硬件之间在哪些地方存在生成上的区别。
本章中提供了生成并运行3个示例项目必需的所有知识。可以在线获得与这些示例关联的所有项目文件、源文件和开发信息,在前言中已经说明了这一点。如果还没有获得这些资料,建议现在就下载并安装它们。学习本章时,它们是非常有帮助的参考知识。
2005-11-12 12:02 #8
状态 离线  2.1  SDK版本和选择
如果在开发PC系统上安装了多个Symbian OS SDK,则在使用之前,需要选择希望使用的SDK。
Series 60 Platform SDK 1.x或更早的版本均基于Symbian OS 6.1。从Series 60 2.x版本以后,开始使用Symbian OS 7.0,并且修改了配置多个SDK的方法。
2.1.1  Series 60 1.x SDK
如果只使用Series 60平台1.x或更早的版本(基于Symbian OS 6.1),则选择一个SDK只涉及设置特殊环境变量EPOCROOT的值。在安装Series 60 SDK期间创建EPOCROOT,将这个变量设置为指向特定SDK的根目录。安装一些资料,例如文档和工具,这些资料对于多个SDK可能是公共的,因此将其放置在共享目录中。然而,每种平台模拟器的运行库环境以及相关的系统头文件和库都不相同。因此,每个SDK都有一个单独的目录树;环境变量EPOCROOT必须指向这个目录。例如,可以设置如下目录:
/Symbian/6.1/Series60/
SDK特有的工具、资源和示例项目都位于这个子目录树下面。因此,如果需要利用多个Series 60版本的SDK,可能需要确保在每次切换到特定SDK时都正确设置EPOCROOT的值。否则,将无法在没有获得错误消息的情况下使用特定的SDK。
通过在命令提示符中使用set命令改变EPOCROOT的值,可以在不同的SDK之间切换:
set EPOCROOT=/Symbian/6. l/Series60/
注意,EPOCROOT必须不包含(PC文件系统)驱动器字母?只需要指定文件夹路径即可。
作为另一种选择,可以使用EpocSwitch实用程序在不同的SDK环境(Series 60 1.1、1.2等等)之间切换。本章后面的“各种SDK工具”小节提供了有关EpocSwitch的更多信息。
此外,所选择的IDE可能具有直接设置EPOCROOT值的工具。
可以在以下两个目录中找到进行C++开发的Symbian OS工具(除了模拟器之外):
?        Symbian开发的工具位于/epoc32/tools/目录下面,该目录位于SDK安装的根目录中。
?        Symbian提供的ARM交叉编译器(cross compiler)是由Cygnus修改并提供的GNU gcc编译器。这种目标交叉编译器和它的支持程序位于/epoc32/gcc/bin/目录下,该目录位于SDK的根目录中,也可能位于/Shared/epoc32/gcc/bin/目录中,该目录位于SDK根目录的上一级目录中。具体位于哪个目录取决于安装SDK时选择的选项。
两个工具目录都应该包括在Windows系统路径中。SDK安装过程通常更新路径和注册表设置。
技巧:
如果正在使用Microsoft Visual C++,并且希望能够执行WINS的命令行生成,则必须确保建立环境变量以访问Visual C++工具。如果在安装Visual C++时选择了“命令行生成”选项,则通常会产生这种情况。也可以使用随产品一起提供的命令文件vcvars32.bat来设置。
2.1.2  Series 60 2.x SDK
在Symbian OS 7.0s中,修改了配置多个SDK的方法。因此,对于Series 60 2.x平台(安装或没有安装Version 1.x SDK),通过devices命令完成特定SDK的选择。不再需要设置环境变量EPOCROOT;相反,使用devices命令选择希望针对其进行开发的特定Symbian OS设备。以kitname:device这样的形式指定设备,其中,kitname指的是SDK。通过简单地打开命令提示符并且输入devices,可以看到所有可用设备的列表。为了将某个设备设置为默认设备,例如可以输入:
devices -setdefault @Series60_v20:com.nokia.series60
然后,通过改变默认设备或使用set EPOCDEVICE命令,可以切换到不同的设备。
注意,devices命令一般不会显示已经安装的任何SDK,除非这些SDK基于Symbian OS 7.0s或更高版本。然而,可以使用devices -add命令将这些SDK添加到列表中。可以在SDK文档中找到更多的相关细节。
注意,EnvironmentSwitch工具(Series 60 2.x中引入了该工具)可用于自动化切换到不同开发环境的过程。本章后面的“额外开发工具”一节将提供更多的相关细节。
通过Metrowerks CodeWarrior IDE使用设备
CodeWarrior IDE了解devices信息,并且会在适当的时候询问使用的设备包(例如,当使用“File”菜单中的“Import Project from .mmp File”选项时),本章的后面将描述这一点。注意,为了使CodeWarrior IDE可以检测到设备,标识符的设备名必须为com.name.name这样的形式。
2005-11-12 12:03 #9
状态 离线  2.2  HelloWorld GUI应用程序
使用与第1章中完全相同的示例,详细介绍HelloWorld示例的两个一般性项目文件,并且逐行了解其内容。对于每个开发项目,必须有一个组件定义文件(bld.inf)和一个项目定义文件(.mmp)。项目的bld.inf文件可能引用一个或多个.mmp文件,每个.mmp文件对应一个将要生成的组件。在简单的项目中只有一个组件?例如,应用程序自身对.mmp文件的引用。在更复杂的项目中,除了应用程序,可能涉及其他组件,例如动态链接库(DLL),并且可能有多个.mmp文件。工具链使用组件定义文件和项目定义文件构造一个生成命令文件(abld.bat)。可以将这个文件用于各种目的,例如为选择的平台或开发环境创建其他的项目文件和工作区文件,或者以调试或发布格式为模拟器或目标设备生成项目。
2.2.1  HelloWorld bld.inf
HelloWorld组件描述文件(bld.inf)引用一个项目定义文件(HelloWorld.mmp)。
// HelloWorld bld.inf
PRJ_MMPFILES
// 列出项目所需的.mmp文件
HelloWorld. mmp
对于简单的应用程序(或单独的组件),例如HelloWorld示例,所有的内容一般都位于一个bld.inf文件中。项目中的.mmp文件列表位于PRJ_MMPFILES语句之后。在本示例中,只有一个.mmp文件,它的名称是应用程序的名称。在更复杂的项目中,可能存在其他一些.mmp文件的列表?每个文件分别对应于应用程序的每个组件部分。
bldmake工具处理当前目录中的组件定义文件(bld.inf),并且生成批处理文件abld.bat和一些批处理生成文件(.make)。ald使用makefile执行组件生成的各个阶段。输入如下命令查看bldmake语法的一般性列表:
bldmake
然后,输入下面代码,可以看到其他在bld.inf中有效的语句的语法一般列表:
Bldmake inf
2.2.2  HelloWorld.mmp
项目定义文件(.mmp)以平台无关和编译器无关的方法指定项目组件的属性。然后,SDK生成工具(abld.bat)或IDE使用项目定义文件和bld.inf文件得到平台特有的makefile。HelloWorld.mmp项目定义文件如下所示,后面的表2-1分别解释了每行语句。
// HelloWorld.mmp文件
TARGET  HelloWorld, app
TARGETTYPE  app
UID  0xl00039CE 0x101F6148
TARGETPATH/system/ apps/HelloWorld
LANG 01
SOURCEPATH  ../src
SOURCE   HelloWorldApplication, cpp
SOURCE   HelloWorldAppUi, cpp
SOURCE   HelloWorldDocument, cpp
SOURCE   HelloWorldContainer. cpp
RESOURCE  ../data/HelloWorld.rss
RESOURCE  ../data/HelloWorld_caption.rss
USERINCLUDE  .  . . /inc
SYSTEMINCLUDE /epoc32 /include
LIBRARY euser.lib apparc.lib cone. lib eikcore.lib
LIBRARY eikcoctl.lib avkon.lib commonengine.lib
AIF HelloWorld.aif  ../aif HelloWorldaif.rss c12
context_pane_icon.bmp context_pane_icon_mask.bmp list_icon.bmp
list_icon_mask, bmp
欲查看.mmp文件中有效语句的完整列表,请打开一个命令提示符,定位到SDK,输入makmake-mmp。
【此处插入表2-1】
1.UID
UID是全球唯一性标识符(globally unique identifier),它由32位数字组成。在Symbian OS中,通过UID类型标识对象,UID类型具有3个组件UID:UID1、UID2和UID3。UID1确定文件是文档还是可执行码。应该将它看作是一个系统级的标识符,用于区分可执行文件、DLL等文件。.mmp文件中的TARGETTYPE语句确定UID1。
对于文档文件,UID2确定文档类型(应用程序数据文件或.aif文件)。对于可执行代码文件,UID2的值确定可执行文件的类型(.app、.dll或.tsy)。对于可执行代码文件,在.mmp文件中的UID行上指定UID2和UID3。
UID3是一个应用程序级的标识符,应用程序的UID3值必须不同于其他所有应用程序。只有Symbian才可以发布这些值。通过发送电子邮件到[email protected],可以从Symbian处获得应用程序的独特UID和其他用途的UID。在开发期间可以使用如下范围的UID:0x01000000到0x0FFFFFFF,但需要非常小心,绝对不要发布带有实验UID的应用程序。
Symbian OS使用UID将文档(数据文件)和.aif文件与它们各自的应用程序关联起来;UID3包括在每个数据文件、可执行文件或.aif文件的头部。然而,可执行文件和它们的组件仍然需要具有正确的文件扩展名,否则它们将无法正确运行,无法出现在Application Launcher(应用程序启动器)中,或者无法正确地与它们的文档进行关联。
当应用程序创建文档文件时,应用程序框架将所有的3个UID和32位的检查和(checksum)自动合并到文件头的前16个字节。
有时,在生成项目时出现链接错误,这是因为.mmp文件中遗漏了一个必需的库。为了找出需要在.mmp文件中列出哪个库,可以检查SDK文档或使用clindex实用程序,该实用程序产生最新的有序清单?更多的细节可查看本章后面的“更多工具和实用程序”一节。
2.栈和堆的大小
自动变量(本地范围)、函数参数等存储在称为栈(stack)的内存区域中。可以从称为堆(heap)的池中获取动态分配的内存,通过new(或者是Symbian OS代码中的new(Eleave))等运算符进行自动分配。系统为每个执行的应用程序或线程创建栈和堆。运行库环境负责控制栈内存的分配和解除分配。开发人员直接控制堆上的内存分配和解除分配。在大多数情况下,开发人员可以控制这种分配;而在某些情况下,操作系统设计者负责控制这种分配。仔细地控制分配,并且特别注意堆内存的解除分配,这对所有Symbian OS开发人员是至关重要的要求。
默认情况下,应用程序的栈大小是8KB,但针对某些类型的应用程序,可能需要更大的栈。然而,必须注意不能为了方便而错误地使用栈。在Symbian OS代码中,只有较小的对象应该放在栈上;所有较大的对象一般都分配在堆上。如果确实需要多于8KB的栈(例如,在一个高度递归的应用程序中),可以在应用程序的.mmp文件中使用EPOCSTACKSIZE语句重写默认的8KB大小。以十进制格式或十六进制格式指定栈的大小(以字节为单位)。在目标硬件上,如果在ARM上发生栈溢出,这将造成页面错误;应用程序将产生出现严重错误并终止,同时报告一个错误(KERN-EXEC 3)。查看SDK文档了解完整的错误代码信息?搜索“Panic categories and numbers”以及“System panic reference”。
应用程序的默认堆大小是1MB。同样,可以根据需要增加(或减少)这个大小。通过EPOCHEAPSIZE语句可以指定最小和最大的堆值。在模拟器中,这并存在问题,因为没有强制实施最大的堆大小限制。
根据所使用的IDE,EPOCSTACKSIZE和EPOCHEAPSIZE语句可能在模拟器环境下不会产生任何效果。可能必须直接在IDE中改变项目设置,从而将更多的(或更少的)内存分配给应用程序。
警告:
在Microsoft Visual C++下面针对模拟器进行生成时,尝试使用过多的栈将产生下面的错误:
Engtest.obj : error LNK2001:  unresolved external
symbol _chkstk
/EPOC32/RELEASE/WINS/DEB/ENGTEST.exe :  fatal
error LNKll20: 1 unresolved externals
Error executing link.exe.
在Visual C++ IDE中,为了修正WINS生成的这种错误,从菜单中选择“Project | Setting”,然后在打开的对话框中选择“C++”选项卡。插入如下新行:
/Gs9999 /FD /c
其中,9999是以字节为单位的新栈大小(十进制)。
3.额外的项目组件
为了进行良好的面向对象设计并帮助实现可维护性和灵活性,Symbian OS应用程序一般划分为两个主要部分:UI和应用程序引擎?也称为模型(model)。UI一般又划分为数据在屏幕上的表示以及确定应用程序整体行为的处理器或控制器。应用程序引擎一般包含用于表示应用程序数据的数据结构、算法和数据持久性。
通常,将引擎创建为一个单独的组件?一般创建为一个DLL。如果将引擎创建为DLL,则将引擎DLL创建为一个额外的组件项目,该项目带有自己的.mmp文件。一般在bld.inf文件中将这个.mmp文件列为主应用程序的一个组件。然而,必须将引擎DLL的名称包括在应用程序的.mmp文件的LIBRARY语句中。
第4章中将更详细地讨论Symbian OS UI应用程序中的应用程序架构和关键的类;在第4章中将提供一个示例项目,显示如何创建一个封装引擎功能的DLL。
2.2.3  生成和运行
打开一个Windows命令提示符,定位到包含项目定义(.mmp)和组件定义(bld.inf)文件的文件夹?例如,SDK根目录中的/EMCCSoft/HelloWorld/group。
输入如下命令创建abld.inf:
bldmake bldfiles
输入如下命令,从命令行中编译和链接项目:
abld build wins udeb                                ?对于Visual C++
abld build winsb udeb                                ?对于CodeWarrior
abld build winscw udeb                        ?对于for Borland C++
这将用Series 60调试模拟器生成项目。通常在IDE中生成和运行HelloWorld示例应用程序之类的程序。
一些IDE中的生成过程可能不会生成完整应用程序所需的所有资源?例如位图(.mbm)和图标(.aif)文件。使用abld的命令行生成将进行完整的生成,包括创建所有在项目中指定的资源和组件。输入abld可以查看该命令文件的一般性语法,或者输入abld help commands列出所有的命令选项。
为了运行应用程序,首先需要启动Series 60模拟器。在命令提示符中输入:
epoc
一般情况下,这就可以从命令提示符中启动模拟器。如果已经安装了多个SDK,可能需要确保选择正确的版本?例如,通过使用devices命令来完成。通常,可以创建IDE项目文件,并且在选择的IDE中生成和运行模拟器,第1章中已经对此进行了描述。对于应用程序调试,在IDE中以调试模式运行应用程序是一个必要条件,而不是一个可选项。
一旦已经启动Series 60调试模拟器,定位并选择HelloWorld应用程序,然后点击“Selection”按钮(位于定位控件的中间),用以调用该应用程序。应用程序将运行,并且应该如图2-1所示。
2.2.4  HelloWorld GUI的可执行文件和运行库文件
这一小节介绍生成过程产生的文件,显示每个文件的类型和作用,以及它在模拟器和目标设备上的位置。图2-2总结了根据输入源、头文件和输出运行库文件的整个生成过程。
至少需要两个文件才可以组成最小的GUI应用程序,分别是.app文件和.rsc文件(例如,HelloWorld.app和HelloWorld.rsc)。HelloWorld.app是应用程序的可执行文件,换句话说,这是来自于编译和链接过程的输出。HelloWorld.rsc是资源编译器产生的二进制资源文件。
2005-11-12 12:04 #11
状态 离线  在一个计划将要发布的应用程序中,也必须提供应用程序信息文件(.aif)?在开发期间并不一定要提供该文件。.aif文件包含图标、所支持语言的可选标题,并且指定某些应用程序属性,例如是否支持嵌入。如果没有提供.aif文件,应用程序仍然可以运行。然而,它将具有由系统提供的默认图标,并且系统将其他的应用程序特征设置为默认值。如果指定标题资源文件(例如,HelloWorld_caption.rss),将会产生用于安装的额外文件HelloWorld_caption.rsc。请参见本章后面“AIF文件”小节中的“标题”部分。
在Symbian OS中,GUI应用程序是特殊形式的DLL,它总是具有.app文件扩展名。系统提供一个特殊的框架,用于加载和正确地初始化GUI应用程序。作为一个开发人员,必须依照这个框架的要求,并且必须提供许多纯虚函数的实现,这样应用程序才可以正确启动。作为选择,也可以提供许多其他虚框架函数的实现,从而获得可能需要的额外特殊行为。第4章将详细讨论应用程序框架以及虚函数和纯虚函数。
为了使系统可以自动识别,所有的GUI应用程序必须遵循一个位置约定?它们必须位于特定的文件夹中,例如:/system/apps/appname/。因此,在HelloWorld示例中,应该将前面描述的文件(HelloWorld.app、HelloWorld.rsc、HelloWorld_caption.rsc和HelloWorld.aif)放到名叫/system/apps/HelloWorld/的文件夹中。这个文件夹必须位于c:或z:(模拟的ROM驱动器)等目标设备驱动器或模拟驱动器的根目录中。
将应用程序的名称保持在16个字符或更少的字符(大小写并不重要),否则Series 60模拟器可能无法找到应用程序,即使生成过程没有报告任何错误也是如此。
为了正确地实现特定应用程序的功能,可能必须使用其他许多文件。例如,可能需要压缩的多重位图文件(.mbm)、应用程序特有的数据文件等。通常将这些必要的文件放在和关键的应用程序文件相同的位置中,即/system/apps/appname。
有时,当尝试在目标设备上或模拟器下运行应用程序时,可能会获得一个令人恼怒的“Not found(没有找到)”错误消息?遗漏了某些内容或者某些方面不正确,但是系统不会提供更多的提示。检查应用程序UID是否正确?可能忘记在代码中(包括.mmp文件和.pkg文件)更新所有的UID。同样,可能遗漏了一个DLL文件?当安装到目标设备并且忘记将所有的DLL移动到该设备时,这一点更为常见。另一个更常见的问题是遗漏了另一个文件,例如.mbm文件、资源文件或另一个必需的应用程序数据文件。
2.2.5  HelloWorld项目文件和位置
在/EMCCSoft/HelloWorld/下面,将找到大量的相关文件夹,表2-2列出了这些文件夹
项目的子文件夹和文件组织(位于项目名文件夹下)将反映定义在.mmp文件中的结构。在一些情况下,data和install文件夹可能不存在,相关的文件可能位于group文件夹中。实际上,在生成期间生成的所有文件和中间生成文件都位于这种文件夹结构的外部,除了以下文件外:
?        abld.bat文件?该文件不可以在不同的SDK之间移植,当bld.inf文件和.mpp文件改变时,必须重新生成该文件。
?        在生成过程中,HelloWorld.sis位于包含.pkg文件的文件夹中
2005-11-12 12:04 #12
状态 离线  2.2.6  HelloWorld GUI源文件
这一小节将概述组成示例项目的每个源文件的内容和功能,第4章中将详细讨论Series 60应用程序设计原理。
1.源文件和头文件
列在表2-3中的文件组成了C++应用程序源文件、头文件和类模块的主体
一旦在IDE中打开HelloWorld项目,可能会发现另一个源文件HelloWorld.uid.cpp。这是UID源文件;生成工具自动在某个文件夹下创建这个源文件,例如在SDK根目录中的/epoc32/Build/Symbian/6.1/Series60/HelloWorld/group/HelloWorld/wins/中创建此文件。不需要编辑该文件。它只是将应用程序的UID定义为一个数据段,一些在模拟器(WINS)环境下运行的DLL需要它。
【此处插入表2-3】
2.应用程序资源文件
在Symbian OS中,应用程序使用资源源脚本文件(Resource Source Script)(.rss)(例如,HelloWorld.rss)定义GUI应用程序在屏幕上的显示方式。定义应用程序外观、行为和功能的许多信息存储在资源文件中。在资源文件中可以定义从状态面板、菜单、普通用户界面控件到单个对话框等各个方面,这些都在可执行文件的主体外部创建。在运行时可以根据需要有效地加载单个资源,从而最小化内存需求。
在生成时,将应用程序资源编译(并且可能会压缩)到将在运行时使用的二进制文件中(默认情况是带有.rsc扩展名的文件)。在生成过程中,资源编译器处理这个文件。一般在编译源文件之前自动编译该文件(但只有在上次运行资源编译器后已经更新资源文件的情况下才进行编译)。资源编译器的输出是一个二进制文件,在运行时使用该文件提供必需的资源信息。默认的输出名具有和应用程序相同的名称,但是带有.rsc文件扩展名。
对于HelloWorld示例应用程序,资源文件的文件名将是HelloWorld.rsc。此外,资源编译阶段还生成带有.rsg文件扩展名的头文件。该文件包含一系列符号名/数字常量对(通过#define定义),用于标识每个用户界面元素。只要引用或使用相关的资源,则必须将该文件通过#include包含在.cpp文件中。
资源文件和它们的内部结构可能一开始表现得非常复杂,但通过逐步深入了解,它们将变得非常直观。本书中将提供应用程序资源文件的全面解释和示例,并且可以在Series 60 SDK示例项目中找到其他许多示例。
可以创建另一个可选的资源文件HelloWorld_caption.rss,用于定义应用程序的标题,即显示在Application Launcher中的应用程序名。提供两个标题的大小,以容纳Application Launcher网格视图和列表视图的显示选项。资源编译器也在完整的项目生成期间处理这个文件。
3.其他头文件
注意,avkon.hrh(位于/epoc32/include/中)包含许多由Series 60用户界面和应用程序框架定义的枚举常量。对于Series 60应用程序来说,这是一个非常重要的文件。例如,其中一个定义的常量是EAknCmdExit;应用程序的菜单选项“Exit”应该总是生成该命令。当应用程序应该关闭时(例如,具有较低的可用内存或者需要进行系统备份时),由框架传递的标准值是EEikCmdExit,在Uikon.hrh文件中定义了这一点。
名字为HelloWorld.hrh的特殊头文件是大多数项目的一部分,它包含可以用于源文件(.cpp)和资源文件(.rss)中的任意枚举常量定义。这些常量特定于某个应用程序,并且一般用于菜单命令、键的处理、视图标识符或对话框中的命令处理。
在带有.rh扩展名的文件中定义UI资源和控件的结构,该结构用于应用程序的资源文件中。可以针对自定义用户界面组件而定义自己的资源结构。特殊的SDK提供了大量的资源结构,定义这些结构的.rh文件位于../epoc32/include文件夹中,该文件夹在的SDK文件夹树的下面。第5章中将更为详细地介绍资源文件和资源头(.rh)文件。
2.2.7  资源编译器
实际上,可以在资源文件中定义所有的用户界面元素和控件。在运行时可以根据需要从已编译的资源文件(默认情况是带有.rsc扩展名的文件)中加载单个资源,从而最小化内存需求。
可以在不重新编译主程序的情况下本地化资源文件。为了使本地化更为简单,通常将所有的用户界面文本从主资源文件(.rsc)分离到单独的头文件中,并且在生成时有条件地将这些文本通过#include包括到主资源文件中。这是包含的语言文本文件,而不是在后面转换成不同支持语言的主资源文件。针对每种语言产生应用程序资源文件的一种版本。这一节的后面将更详细地讨论本地化。
应用程序标题资源可以用于以两种不同的长度和多种语言提供标题(应用程序的名称)。在Application Launcher中,标题和应用程序的图标一起显示。在完整的生成过程中,资源编译器也处理标题资源文件。查看本章后面的“AIF文件”小节可了解更多细节。
通常在IDE中自动调用资源编译器(rcomp.exe)。作为选择,也可以从命令提示符中运行它;一般通过一个命令文件(epocrc.bat)执行资源编译器,该命令文件通过C++预处理器传递资源文件,然后使用rcomp.exe编译该文件。编译资源文件可产生一个二进制输出文件和一个.rsg头文件,通过#include将这个头文件包含到C++代码中,从而标识特殊的用户界面资源,如文本串、对话框和菜单组件。
2.2.8  应用程序和资源的本地化
如果需要将应用程序发布到本地区之外,则应该从项目的开始就考虑本地化需求。Symbian OS及SDK生成系统和工具中提供了关于本地化的很好支持。
对于拉丁字符集,使用不同的语言文本改编应用程序应该只需要改变资源文件,因为用户可视文本不会嵌入到C++源文件中。然而,对布局必须采取灵活的态度,因为转换成不同语言的文本明显具有不同的长度。
每种支持的语言都具有两位数字的标识符代码。例如英语是01,法语是02,而德语则是03。在/epoc32/Include/e32std.h中定义这些语言码。对于每种语言,一般通过转换默认的语言文本来创建特定的文本文件。然后,在生成时有条件地将这些语言文本包含在主应用程序资源文件中。本章中使用的HelloWorld示例版本(称为HelloWorldLoc)演示了通过这种方法本地化应用程序的过程。每个特定的文本文件一般具有两位数字的语言码,这种语言码组成了文件扩展名的最后两个字符。因此,在这个示例项目的HelloWorldLoc版本中,将看到包含的文本文件具有3种变体,扩展名为.l01、.l02、.l03,分别表示英语、法语和德语版本。
针对其他地区敏感的信息和格式,也具有大量的支持类。例如,在e32std.h中定义了TLocale和相关的类,并且允许根据当前的系统地区正确格式化日期、时间、货币和其他许多地区敏感的数据类型。需要了解各种对地区敏感的数据类型以及可用的格式化类,并且确保在屏幕上显示数据时使用它们。
可以使用许多方法来提供语言变体和安装文件,这些都在应用程序安装时为用户提供了各种选择。
针对特定语言编译的资源文件一般都具有.r01、.r02和.r03等文件扩展名,并且用户在安装时可以选择语言。默认编译的资源文件具有.rsc扩展名;在安装期间可以将任何语言变体重新命名为这个扩展名。Series 60项目文件(.mmp)可以通过LANG语句列出支持的语言。
LANG 01 02 03
执行完整的项目生成时,系统将编译应用程序的英语(01)、法语(02)和德语(03)资源。本章后面将提供关于安装多语言版本应用程序的更多信息,而在第4章中将介绍日期本地化。
对于非拉丁语言,文本的本地化更为复杂。对于使用汉语、日语、朝鲜语、希伯来语、阿拉伯语和泰语等语言生产设备,Symbian OS和Series 60确实提供了一些支持。然而,编写支持这些语言的应用程序是一个专门的主题,超出了本书的讨论范围。

2005-11-12 12:04 #13
状态 离线  2.2.9  AIF文件
在运行时使用应用程序信息文件(.aif),并且存储关于应用程序的数据,包括:
?        两种大小的图标(本章后面将定义),系统使用这些图标代表应用程序。
?        各种功能,例如文档嵌入、新文件的创建、是否隐藏应用程序以及MIME类型的支持优先级。
?        可选地使用支持语言的应用程序标题(名称)?虽然可以通过本节后面介绍的标题资源文件系统提供对标题的更好支持。
如果没有.aif文件,应用程序将使用默认的图标、以应用程序名称作为标题(省略文件扩展名)。通过和Series 60 SDK一起提供的aifbuilder工具,可以独立于应用程序创建.aif文件。aifbuilder工具允许定义.aif文件的属性,并且将项目定义的细节保存在文件扩展名为.aifb的文件中。注意,aifbuilder需要安装JavaTM 2运行库,可以从http://java.sun.com中获得该运行库。
可以通过带有.rss文件扩展名的资源文件(例如HelloWorldaif.rss)手工指定.aif文件的组成部分。本章描述的所有示例GUI应用程序中都使用了这个选项。Aiftool实用程序负责编译这个资源文件?可以在命令提示符中手工执行这个实用程序,或者在完整的项目生成过程中自动执行。.aif生成过程也转换形成图标的位图文件(使用bmconv,本章后面将介绍),然后创建.aif文件。Series 60 SDK中文档中说明了aiftool实用程序和.aif文件的语法。
1.图标
当嵌入并显示在应用程序外壳上时,图标用于代表应用程序和它们的相关文件/文档。通常以两种大小提供Series 60图标。如果特定大小的图标不可用,则显示最适合当前容器“缩放状态”的大小?例如,Application Launcher网格视图和列表视图使用42?29像素的图标,然而状态面板的上下文面板(当应用程序具有焦点时显示在屏幕的顶部)使用44?44像素的图标。如图2-3所示,在应用程序视图中,Messages图标的大小是42?29像素,而状态面板中屏幕顶部的Messages图标大小是44?44像素。
提供不同的图标大小有助于确保系统可以使用最适合的大小。只提供一种大小,当以特定大小进行绘制时产生动态缩放?缩放较小的位图一般将产生显著的图像质量丢失。
Aifbuilder可以启动一个图标设计工具,该工具将创建组成图标的位图和遮罩。AIF图标设计器有助于以Symbian OS特有位图文件格式产生这种图标,这种位图文件格式称为多重位图文件格式(.mbm)。
2.AIF文件本地化
如果应用程序需要根据不同的语言而提供不同的图标,可以通过如下的方法实现这一点:使用aiftool实用程序产生.aif文件的多个副本,每个副本包含适当的位图。通常使用扩展名.aXX保存产生的每个本地化.aif文件,其中XX是与适当地区关联的两位数字语言码。应用程序框架软件(Apparc)已得到修改,以尝试加载和当然系统语言设置关联的.aif文件。
3.MIME支持
系统通过前面描述的UID系统识别本地Symbian OS文件(由Symbian允许的应用程序创建),特别是通过UID3进行识别。对于非本地文件,MIME类型识别是一种理想的可选方法。多用途因特网邮件扩展协议(MIME,Multipurpose Internet Mail Extension)定义了用于传输非文本数据的文件格式,这些非文本数据包括在因特网上传输的图形、音频和传真等。查看http://www.iana.org/
assignments/media-type/了解关于MIME类型的更多细节。
Symbian OS应用程序可以在它的.aif文件中指定支持的MIME类型以及对每种类型提供支持的优先级。例如,可能希望自己的应用程序支持纯文本文件的显示和编辑。打开某个文件时,Symbian OS启动对所选文件类型具有最高优先级支持的应用程序。
存在4种优先级(由/epoc32/include/aiftool.rh中的枚举定义),一般只应该使用其中的EDataTypePriorityNormal或EDataTypePriorityLow两种优先级。
例如,文本编辑器很明显适合于编辑文本/普通文件,因此应该对这种文件类型提供EDataTypePriorityNormal优先级。Web浏览器不太适合于处理文本文件,因此对这种文件类型提供较低的EDataTypePriorityLow优先级。因此,可以启动这两种应用程序处理文本文档。然而,如果同时存在这两种应用程序,则优先启动文本编辑器。假设两个应用程序具有相同的MIME类型优先级,Symbian OS将任意启动其中一个应用程序。
如果需要了解.aif文件和MIME类型支持的更多信息,可以查看相关的Series 60 SDK文档。
4.标题
Series 60 UI和应用程序框架Avkon提供了将标题和应用程序关联的可选功能?相比于一般通过.aif文件提供标题的功能,应该优先使用这种功能。默认情况下,系统将使用.aif文件中提供的标题。然而,很可能应用程序作者已经创建了一个单独的标题文件,同时包含普通长度的标题和简短标题?提供的这些标题用于Application Launcher的列表视图或网格视图中。简短标题用于应用程序网格视图中,而普通标题则用于应用程序列表视图中。使用创建普通GUI资源文件的相同方法得到标题文件。对于HelloWorld项目,标题源文件是HelloWorld_caption.rss,在运行时使用的二进制输出文件为HelloWorld_caption.rsc。该文件和其他应用程序文件(例如.app、.rsc和.aif等)一起放置在/system/apps/HelloWorld/文件夹中。
如果需要,可以为应用程序支持的每种语言产生单独的标题文件。命名标题资源文件的约定如下:
NAME_OF_APP_caption.rss,其中NAME_OF_APP是应用程序的名称,在HelloWorld示例中就是HelloWorld_caption.rss。通过将额外的行添加到应用程序的.mmp文件,可以将标题资源的生成作为普通生成过程的一部分:
RESOURCE < NAME OF APP >_caption.rss
然后,编译过的资源文件形如:
/system/apps/appname/appname_caption.rXX,其中XX是在.mmp文件中指定的两位数字语言码
2005-11-12 12:05 #14
状态 离线  2.3  控制台应用程序
通常,在系统组件、通信模块、应用程序引擎和其他独立功能单元的开发期间,可能需要一个简单的测试应用程序。这种“测试装置”允许在开发代码时运行并测试它们。
GUI应用程序通常并不是用于这种目的的最佳选择;如果只是进行测试,特别是只进行回归测试(可重复实现的功能测试),则使用GUI应用程序就显得大材小用。控制台应用程序通常是更好的选择,它们具有一个关键性的优点。它们是.exe文件而不是.app文件,因此不需要GUI库,从而模拟器和应用程序可以更快速地启动。
控制台应用程序在以下方面区别于GUI应用程序:
?        它们只提供文本输出?没有菜单、图标和对话框等。
?        控制台应用程序并不适合于部署到终端用户设备上?一般无法定位或启动它们。
?        它们必须提供自己的基本运行库对象,例如清除栈(Cleanup Stack)和活动规划器(Active Scheduler)?UI应用程序则必须通过派生这些对象的框架类获得它们。注意,通过检验控制台应用程序示例(HelloWorldCon)中的代码,可以了解如何创建这些对象。
?        控制台应用程序也没有应用程序信息文件(.aif)或资源文件(.rsc)。
因此,如果像许多开发人员一样更喜欢逐步创建并测试代码,则控制台应用程序的快速启动速度是一个重要的考虑因素。
控制台应用程序的关键缺点(除了简单的文本界面外)是在模拟器中一次只可以运行一个应用程序。这是因为,基于PC的Series 60模拟器(epoc.exe)是单一的进程,并且Symbian OS的.exe应用程序必须在自己的进程中运行。因此,控制台的.exe应用程序和eexe.obj链接在一起,这就会启动模拟器并将应用程序作为主进程运行。
2.3.1  Hello World控制台应用程序
本节中提供了一个示例控制台应用程序HelloWorldCon,在生成这个应用程序时,它由一个具有.exe文件扩展名的可执行文件组成。在Symbian OS中,这种可执行文件用于两个主要目的:作为没有任何用户界面的服务器;或者作为简单的测试装置,这种测试装置具有非常简单的、基于文本的界面。
注意,.HelloWorldCon.cpp文件中的项目代码非常简短,并且相对简单。它实现一个名叫doExampleL()的简单函数,从callExampleL()中调用该函数。在头文件CommonFramework.h中定义callExampleL()函数。作为Series 60 SDK的一部分提供这个头文件,这个头文件适合作为在一般性开发工作过程中使用、基于控制台的其他任何测试装置的基础。
.exe程序的主入口点是E32Main()。该函数建立内存泄漏宏、清除栈和捕获装置,用于处理callExample()函数中发生的任何异常。该函数创建一个文本控制台以及从CConsoleBase中派生而来的控制台类对象,并且调用doExampleL()。应该在doExampleL()函数中放置或调用测试代码。第3章中将解释TRAP装置和清除栈等概念。
2.3.2  生成和运行控制台应用程序
打开一个命令提示符,定位到SDK根目录中包含项目代码的文件夹(例如,/EMCCSoft/HelloWorldCon)。这个文件夹将包含3个文件:
?        HelloWorldCon.cpp                        ?源文件
?        HelloWorldCon.mmp                        ?项目定义文件
?        bld.inf                                        ?组件描述文件
这个项目也需要和SDK一起提供的CommonFramework.h头文件。根据的SDK,该头文件将位于类似于如下文件夹中:
…/Epoc32Ex/Base/CommonFramework
或者
…/Epoc32Ex/Basics/CommonFramework
可以从命令提示符或IDE中生成并运行这个示例。为了创建abld.bat,可以输入:
为了编译和链接用于调试模拟器的项目,输入:
abld build winsb udeb                                ?对于Borland C++
abld build winscw udeb                        ?对于CodeWarrior
然后,为了运行HelloWorldCon应用程序,定位到包含它的文件夹(例如…/Epoc32/release/
wins/udeb),并且在命令提示符中输入:
HelloWorldCon
另一种方式是,创建IDE项目文件(已经在第1章中介绍过),并且在IDE中加载和生成这个项目。为了运行控制台应用程序,可能必须指定可执行文件为HelloWorldCon.exe。Series 60模拟器启动,并且应用程序将立刻显示,如图2-4所示。
注意,只有在应用程序可用时,HelloWorldCon才会启动。它显示“Hello World”并且只是等待用户在PC上按下任意键。按下任意键将完成应用程序并关闭模拟器。
2.3.3  HelloWorldCon.mmp
控制台应用程序的项目定义文件(.mmp)具有一些和等价GUI应用程序相区别的关键之处。归纳如下:
TARGET                                HelloWorldCon.exe
TARGETTYPE                        exe
UID                                        0
SOURCEPATH                        .
SOURCE                                HelloWorldCon.cpp
USERINCLUDE                        .
USERINCLUDE                        /Epoc32ex/Basics/CommonFramework
SYSTEMINCLUDE                        /Epoc32/include
LIBRARY                                euser.lib
注意,在TARGET语句中将应用程序可执行文件的名称以及(特别是)它的扩展名(.exe)指定为HelloWorldCon.exe。TARGETTYPE是exe,并且UID行被设置为0,因为.exe应用程序不需要UID。UID行上的零值将取消显示生成工具的警告。然而,在安装时提供非零的UID具有另一个非常重要的效果?它防止.exe应用程序取代前面已经安装的另一个也具有UID零值的.exe应用程序。参阅本章后面标题为“.pkg文件格式”部分,从中了解更多相关细节。
LIBRARY语句中不需要任何GUI库;在这个非常简单的示例中只需要euser.lib。
2005-11-12 12:05 #15
状态 离线  2.3.4  HelloWorldCon模拟器可执行文件
在Series 60模拟器下,HelloWorldCon控制台应用程序由一个可执行文件组成:HelloWorldCon.exe。使用调试模拟器生成时,在/epoc32/release/wins/udeb文件夹中创建该文件,使用发布生成时,在/epoc32/release/wins/urel文件夹中创建该文件(实践中很少创建模拟器发布生成)。在模拟器下,这些位置是正确执行.exe文件的必要条件。
2.3.5  HelloWorldCon目标可执行文件
针对目标硬件设备生成的HelloWorldCon控制台应用程序由一个可执行文件组成:HelloWorldCon.exe。在PC上,针对armi发布生成,在/epoc32/release/armi/urel中创建该文件(若对于thumb发布生成,则在/epoc32/release/thumb/urel中创建该文件)。第1章已经解释了针对目标设备的ARM生成选项。
在目标设备上,.exe可执行文件按照约定位于/system/programs文件夹下面,但和.app程序不同的是,从理论上讲,可以从任何位置运行.exe可执行文件。问题在于,将.exe文件放到一个设备上,然后在Series 60设备上定位并运行这种类型的应用程序,这样做可能并不直观。在大多数系统上,目标设备的Messaging收件箱将识别到达消息附件中的Symbian OS可执行文件格式(.exe),并且可能出于安全原因而拒绝打开消息及其附件。
一般不会为终端用户提供用于安装的.exe应用程序,但作为开发人员,可能出于合理的理由而希望做这项工作。可以在.sis文件中提供.exe应用程序,但Series 60不会自动识别并显示.exe应用程序的图标,因此在运行控制台应用程序时仍然会遇到问题。有两种选择:
?        安装可执行文件,通过特殊的实用程序选择并运行该文件。
?        安装可执行文件,在安装过程中自动运行该文件。
在第一种选择中,提供了名叫Exelauncher的GUI实用程序来帮助解决这个问题。作为在线提供的示例材料的一部分提供这个应用程序,参见“前言”中的说明。
应该在安装文件(.sis)中将HelloWorldCon.exe应用程序打包,然后通过红外线或蓝牙将该应用程序从PC传送到设备,同时传送Exelauncher实用程序的.sis文件。读取这两条消息并安装这两个应用程序。找到Exelauncher图标并运行它。然后,将出现一些选项,用于选择并运行HelloWorldCon应用程序。为了让Exelauncher可以找到HelloWorldCon.exe文件,必须将其安装在目标设备上的c:/EMCC/Exes/中。
第二种选择具有一个缺点:它是一次性的操作,必须在每次运行应用程序时重复安装过程。安装过程期间运行应用程序的必要条件是,在.pkg安装包文件中的应用程序文件(.exe)名后面指定一个额外的参数(FR)。本章后面的“在安装期间运行可执行文件”部分演示了这一过程,而下一节将详细描述.sis文件的组成部分和使用。
我们提供了生成和运行HelloWorldCon项目所需的所有内容;包括所有的源代码、安装系统文件和实用程序Exelauncher。
2005-11-12 12:05 #16
状态 离线  2.4  Symbian安装系统
Symbian安装系统(SIS)提供了一种简单而一致的方法,将应用程序、数据或配置信息安装到基于Symbian OS的设备上。这个系统不是为模拟器上的软件安装而设计的。开发人员和终端用户安装打包在(.sis)文件中的组件,如果该文件来自于PC,则使用安装程序进行安装;如果该文件来自于Series 60设备,则使用实用程序Application Controller进行安装。
通过使用数字证书,Symbian安装系统允许用户在安装软件前标识软件供应商,从而可以验证安装文件自从创建以来有没有被篡改过。在某种环境中可以很容易地访问大量免费可下载软件,此时该功能特别重要,因为软件可能会感染病毒。证书生成器(makekeys.exe)可以创建公钥/私钥对。然后,可以选择通过文件生生成器(makesis.exe)创建具有数字签名的安装文件。SDK文档中详细描述了这个过程。请参阅“工具和实用程序”一节,并且参考“安装指南”和“安装参考”部分。
安装文件可以集成其他嵌入的安装文件。这种特性可用于将文件打包到可以作为完整集合安装和删除的逻辑组件中。例如,可以将共享库从使用它的应用程序中分离出来,放在单独的安装文件中。
大量选项可以提供给用户,从而在安装期间系统将根据用户的选择执行不同的动作。在安装和删除应用程序期间,可以安装不同的文件集、显示文本或运行自定义程序。这种工具一般用于在安装期间显示许可协议。用户也可以获得有关安装选项的提示,例如在何处安装组件,在何处接受用于验证创建者的安全证书,或者在何处选择特定的语言。
安装过程完成后,设备上还留有一个较小的“存根”.sis文件,用于根据需要控制应用程序的卸载。
对于本章中的示例和本书中的大多数项目,我们提供了相应的示例安装项目文件,用于在Series 60设备上安装示例应用程序。
2.4.1  SIS文件生成工具
和Series 60 SDK一起提供了两个工具,用于允许开发人员生成安装文件:
?        安装文件生成器(makesis.exe)根据包源文件(.pkg)中提供的规范创建安装文件。.pkg文件是文本文件,它包含应用程序或文件的安装信息。这是用于本章中描述的所有示例GUI应用程序的选项。
?        另一种选择是,使用和Series 60 SDK一起提供的sisar工具产生.sis文件。sisar将所有的应用程序文件打包到一个.sis文件中,从而易于在目标硬件上进行安装。该工具在具有.sisar文件扩展名的文件中存储安装项目的细节。可以将手工创建的.pkg文件导入到sisar实用程序中,但不可以将它们再次导出。此外,sisar可以导入由前面描述的aifbuilder工具生成的.aifb文件。
对于创建简单的.sis文件,sisar是方便、易于使用的工具。然而,直到编写本书之时,使用.pkg源文件和makesis.exe实用程序更为灵活。最为重要的是,makesis方法允许使用Series 60平台UID码(本章后面将解释这一点),而sisar当前无法实现这一点。Makesis也允许对安装选项和过程进行细微的调整。
另一个SDK工具证书生成器(makesys.exe)可以创建私钥/公钥对,通过安装文件生成器(Installation File Generator)(makesis.exe),可以有选择地使用相应的密钥对安装文件进行数字签名。在安装期间,用户将得到即将安装未签名应用程序的警告。
可以从命令行中运行makesis和makesys,也可以在sisar中调用它们。也可以在命令中调用sisar生成.sis文件。
文本源文件(.pkg)指定可执行代码文件以及在设备上安装应用程序所需要的其他资源。一般使用文本编辑(或者在IDE中)手工创建必需的.pkg文件,然后使用makesis工具生成.sis文件。
使用sisar工具基本上无需解释即可明白,但它有自己的帮助机制,并且单独归档在Series 60 SDK中。注意,sisar依赖于JavaTM 2运行库,可以从http://java.sun.com中获取该运行库。
2005-11-12 12:06 #17
状态 离线  2.4.2  .pkg文件的格式
HelloWorldCon示例项目有另一个版本,名叫HelloWorldLoc,这是本地化的另一个版本,用于显示如何提供适合于一些不同地区的应用程序安装包。安装期间将使用资源文件、标题文件、甚至是应用程序信息文件的适当语言版本。因此,可以定制应用程序的所有文本、应用程序名称甚至图标,用于满足每个支持地区的需求。这一小节首先介绍非本地化.pkg文件的语法,然后指出本地化版本中的主要区别。
;  Languages - Only English so the next line is optional
&EN
; Name/caption needed for each language,  caption file used if
supplied
; Name,  the app UID,  version,  minor version,  build & package
type
#{"HelloWorld"}, (0x101F6148) ,1,0,0,TYPE=SISAPP
;  Platform UID code required for recognition by a compatible
;  device at installation time
(0x101F6F88) ,0,0,0,  {"Series60ProductID"}
;  Four files to install
"/Epoc32/release/armi/urel/HelloWorld.aif"
"!: /system/apps/HelloWorld/HelloWorld. aif"
"/Epoc32 /release/armi/urel/HelloWorld. r01"
"!: /system/apps/HelloWorld/HelloWorld. rsc"
"/Epoc32/release/armi/urel/HelloWorld_caption.r01"  -
"! :/systemkapps/HelloWorld/HelloWorld_caption.rsc"
"/Epoc32 /release/armi/urel/HelloWorld.app"  -
"!: /systemkapps/HelloWorld/HelloWorld.app"
;  End of File
HelloWorld示例只有英语版本。如果希望支持其他的语言,必须在文件的顶部指定每一种语言。然后,剩余文件的语法必须提供针对每种语言/地区的选项?后面将使用HelloWorldLoc示例说明这一点。
包的头文件包含组件名(在这个示例中是应用程序名)、应用程序或组件的UID、主版本号和次版本号、生成号和包选项(SISAPP)?是否为应用程序安装、升级、补丁、系统选项等。
#{"HelloWorld"}, (0x101F6148),l,0,0,TYPE=SISAPP
注意,.exe应用程序在它们的.mmp文件和.pkg文件中不需要包含应用程序UID(UID3)的值?对于用作测试和实验的.exe应用程序,相应的应用程序UID一般设置为0。然而,如果将要发布一个.exe(假设作为服务器),就需要提供一个UID值,从而拥有真正的惟一性。如果两个不同的.pkg文件中指定了相同的应用程序UID(0),则在安装新的.exe时将删除前面安装的.exe。
注意,在包文件中,需要按照如下方式包括Series 60平台标识码:
(0x101F6F88),0,0,0,  {"Series60ProductID"}
如果用户尝试在Series 60设备上安装不兼容的软件,则平台标识码(平台UID)将启用内置的系统机制发出警告。平台UID是分配好的32位数字,用于标识Series 60的特定版本或特殊设备?它与3个UID没有任何关系,这些UID与可执行文件或应用程序文档直接关联。
为了顺利安装软件,Series 60应用程序的安装包应该带有序列。如果没有找到平台UID序列,或者UID引用比终端中更新的平台版本,则用户将获得有关潜在冲突的通知。根据不同的产品,安装过程可能自动异常中止。如果允许安装过程继续,则很明显存在应用程序功能失效的风险。
基于Series 60平台第一个版本(0.9)的应用程序标识符是0x101F6F88(例如,早期的Nokia 7650设备就是基于Series 60的第一个版本)。指定这个值的应用程序安装包与Series 60平台0.9兼容,并且也有可能与Series 60平台后面的版本兼容。
针对Series 60 2.0引入了新的Series 60平台UID,也就是0x101f7960。应该在依赖于Series 60 2.0特性和API的应用程序中使用这个平台UID。早期版本的平台UID仍然可以获得支持,并且必须在计划运行于Series 60平台0.9、1.x、2.x等版本上的应用程序中使用它们。
可以在一个.pkg文件中定义多个Series 60平台UID,用于表示应用程序能够在其上运行的所有平台和设备。
2005-11-12 12:06 #18
状态 离线  参见:
参阅本章后面的“高级应用程序部署和生成指南”一节,了解平台UID更为完整的列表。
最后,列出了安装的每个应用程序组件。在本例中,这些组件为HelloWorld.aif、HelloWorld.r01、HelloWorld_caption.rsc和HelloWorld.app。注意,每一行的格式如下:首先是源文件名,后面跟上目标文件的位置和名称。
同样需要注意的是,在用作开发的PC上,应用程序组件(生成过程产生的结果)的文件位置将根据所使用Series 60平台版本的变化而改变。
SDK的1.x版本将.app文件和所有其他文件放在如下相对位置中:/Epoc32/release/armi/urel。
2.x版本的SDK生成(以及所有CodeWarrior生成)只将.app文件放在上面的位置中;其他所有文件(.r01、.aif、.mbm)放在如下相对位置中:/Epoc32/data/z/system/apps/appname。
使用AnsPhone示例项目作为说明,1.x版本的.pkg文件将是:
"/epoc32 /release/armi/urel/AnsPhone.aif" -
"!: / system/ apps /AnsPhone /AnsPhone. ai f"
"/epoc32 / release/ armi /urel /AnsPhone. app" -
"!: / sys t em/ apps /Aris Phone /Ans Phone. app"
"/epoc32 /release/armi/urel/AnsPhone. r01" -
"!: /system/apps/AnsPhone/AnsPhone. rsc"
" / epoc32 / release/armi /urel /AnsPhone. mbm" -
"!: /system/apps/AnsPhone/AnsPhone.mbm"
2.x版本(或CodeWarrior)的等价.pkg文件将包含:
"/epoc32 /data / z / system/ adps /AnsPhone /AnsPhone. ai f"  -
"!: /systemlapps/AnsPhone/AnsPhone.aif"
"/epoc32/release/armi/urel/AnsPhone.app"  -
"!: /system/apps/AnsPhone/AnsPhone.app"
"/ epoc 32 / data / z / system/ apps /AnsPhone /Ans Phone. r 01"
"!: /system/apps/AnsPhone/AnsPhone, rsc"
"/ epoc 32 / data / z / system/ apps /AnsPhone /Ans Phone. mbm"
"!: /system/apps/AnsPhone/AnsPhone .mbm"
注意,.pkg文件的1.x版本和2.x版本之间需要改变平台UID。
同样需要注意的是,在.pkg脚本中,源文件和目标文件的文件扩展名并不总是相同的。原因在于,可能存在可选的源文件,这一节后面的HelloWorldLoc本地化示例项目中说明了这一点。
为了允许用户选择在设备上的任意驱动器中安装应用程序(例如,在可移动存储卡上安装,而不选择在闪存上安装),通过一个“!”字符来指定驱动器名,这里给出的示例中说明了这一点。在安装期间,提示用户获得存储应用程序的可选驱动器列表。
为了确保应用程序总是显示正确的图标,请按照提供示例中所显示的方式排列文件的顺序。特别需要注意的是,将.aif文件的名称放在.app文件的前面。
1.在安装期间运行可执行文件
为了使HelloWorld GUI应用程序可以在安装过程期间运行,需要在应用程序文件名和后面添加一个额外的参数,如下所示:
"/Epoc32 /release/armi/urel/HelloWorld.app" -
"!: /system/apps/HelloWorld/HelloWorld.app",  FR
或者,在HelloWorldCon控制台应用程序的情况中:
"/Epoc32 /release/ thumb/urel /HelloWorldCon ~ exe"
-" c: /EMCC/Exes /HelloWorldCon.exe",  FR
确保在安装.pkg文件中的应用程序之前安装其他所有的应用程序组件文件。
“FR”参数表示“文件运行(File Run)”。在安装过程期间,不要错误地认为应用程序已经再次关闭?应用程序仍然保持运行。安装过程启动应用程序,然后任务返回到自身,以完成剩余的安装过程,仅此而已。为每个示例项目提供了示例“文件运行”安装包文件(.pkg)。它们位于主项目文件夹下面的/install文件夹中,并且带有以FR结尾的文件名?例如,HelloWorldConFR.pkg。
2.多地区安装
示例应用程序的HelloWorldLoc版本支持3种可选地区:英国、法国和德国。将在/EMCCSoft/HelloWorldLoc/目录下面找到该项目(相对于Series 60 SDK的根目录)。
下面是HelloWorldLoc.pkg文件中和应用程序安装本地化相关的部分代码:
;  Languages - English,  French and German
&EN, FR, GE
注意这里如何指定支持的语言?指定为EN、FR和GE,这不同于在项目.MMP文件的LANG语句中使用的方法?指定为01、02和03。标识支持语言的这种差异似乎只是由于传统的习惯。.pkg文件的其他语言码在SDK文档中进行了说明,位于“包文件格式”下面。
包的头文件必须包含每种支持语言中的组件名。
; Name/caption for each language,  caption file is used if
# { "HelloWorldLoc" , "BonjourMondeLoc'' , "HalloWeltLoc" }, (0x101F614
9) , 1,0,0, TYPE=SISAPP
包文件(.pkg)的语法强制要求针对每种语言重复输入Series60ProductID字符串:
(0x101F6F88), 0, 0, 0,
{ "Series60ProductID", "Series60ProductID", "Series60ProductID" )
接下来,提供了3个地区特有的.aif文件列表,只安装其中一个.aif文件:
{
"/Epoc32/release/armi/urel/HelloWorldLoc .a01"
"/Epoc32/release/armi/urel/HelloWorldLoc.a02"
"/Epoc32/release/armi/urel/HelloWorldLoc.a03"
} -" !: / system/apps/HelloWorldLockHelloWorldLoc.aif"
现在指定将要安装的应用程序名称。其他的应用程序组件可以有它们自己的代码行,或者使用嵌入的安装文件(.sis)来安装组件。查看后面的“多组件安装”了解更多细节。
"/Epoc32/release/armi/urel/HelloWorldLoc, app"
,, !: /system/apps/HelloWorldLoc/HelloWorldLoc ~ app"
接下来,提供了3个地区特有的资源文件列表,只安装其中一个资源文件:
"/Epoc32 /release/armi/urel/HelloWorldLoc. r01"
"/Epoc32/release/armi/urel/HelloWorldLoc. r02"
"/Epoc32 /releaselarmi/urel/Hel loWorldLoc, r03"
}-" !: /system/apps/HelloWorldLoc/HelloWorldLoc. rsc"
最后,提供了3个地区特有的标题资源文件列表,同样,将只安装其中一个标题资源文件:
"/Epoc32/release/armi/urel/HelloWorldLoc_caption.r01"
"/Epoc32/release/armi/urel/HelloWorldLoc_caption. r02"
"/Epoc32 /release/armi/urel/HelloWorldLoc_caption. r03"
}-" !: /system/apps/HelloWorldLoc/HelloWorldLoc_caption.rsc"
2005-11-12 12:06 #19
状态 离线  3.多组件安装
有时,使用嵌入的安装文件(.sis)处理应用程序所需的组件安装可能会更好。通过如下的方式很容易实现这一点:
;  Embedded SIS file for components e.g.  DLLs
@"- -/- ./Engine/group/Engine.sis",  (0x101F6150)
@". -/../Controls/group/Emccctrls.sis",  (0x101F6151)
注意,指定嵌入.sis文件名称的每一行都以@开头。相对于当前的应用程序位置,在引号中提供了.sis文件的路径和文件名。文件名和路径后面是应用程序或组件的UID3,作为主安装包的一部分包括这些应用程序或组件。
每个组件或是一个单独的项目,或者是组成主项目的一部分。每个组件都需要自己的.pkg(或.sisar)文件,用于生成对应的嵌入.sis文件。如果指定一个或多个嵌入.sis文件作为应用程序安装的一部分包括进来,则在删除嵌入组件的应用程序或组件时,这些嵌入的组件也将被删除(假设没有其他的组件与这些嵌入的组件相关)。
4.有条件的组件安装
有时必须决定在安装过程自身中需要哪些组件,或者决定哪些组件适合。在安装脚本中集成条件语句,本章后面将说明如何做这项工作,请参阅“高级部署和生成指南”一节中的“安装时的设备标识”小节。
2.4.3  生成SIS文件
为了生成HelloWorld.sis文件,打开命令提示符,定位到HelloWorld项目所在的文件夹,按照如下方式生成项目:
abld build armi urel
然后,改变到/install文件夹。输入如下命令生成.sis文件:
makesis HelloWorld.pkg
或者,为了生成自动运行的版本,使用如下命令:
makesis HelloWorldfr.pkg
注意,如果在项目中包括适当的.pkg文件,则Borland C++ BuilderX IDE可以在生成过程期间创建.sis文件。选择“项目 | 属性”菜单项,然后选择“Symbian设置”选项卡。将平台设置为适当的目标设备,将生成设置为urel,并且在生成项目时得到.sis文件。
为了在目标设备上运行应用程序,使用红外线或蓝牙连接将.sis文件传送到设备上。
2.5  额外的开发工具
Symbian OS SDK包括大量工具和实用程序;Series 60 SDK则提供了更多的工具。EMCC 软件公司也为公众提供了许多免费的额外工具和实用程序。这里列出的额外工具都是经常使用、非常有帮助、非常重要的工具,或者是在其他地方找不到很好的文档说明。本节也提供了如何获得这些额外工具的参考。
2.5.1  多位图和位图转换器Bmconv
位图提供了图片、图标和遮罩的像素模式,同时提供了用于填充显示区域的小画面以及画刷样式。为了优化位图性能,Symbian OS使用以Symbian OS的高度压缩格式包含多个位图的文件。作为和Series 60 SDK一起提供的工具,bmconv.exe接受一个或多个Windows位图(.bmp)文件作为输入,并且产生一个Symbian OS多位图文件(.mbm),针对有效的运行时加载进行了优化。
如果需要查看bmconv命令的语法和选项,可以在命令提示符中输入bmconv。
针对文件中的每个位图,bmconv工具也产生一个带有符号定义(标识符)的头文件(.mbg)。这个产生的头文件位于SDK的/epoc32/include文件夹中。将这个头文件包含(#include)在C++代码中,这样就可以引用任何所需的任何位图。
存在两种类型的.mbm文件:加载到RAM中的文件存储位图文件和访问时不使用任何RAM的ROM映像位图文件?只有系统开发人员一般才会创建基于ROM的.mbm文件。
在转换过程期间,可以为转换的位图指定每像素的位数,并且可以指定这些位图是否应该是彩色或灰度。该程序也可以将Symbian OS多位图文件(.mbm)以Windows位图格式(.bmp)重新划分为组件位图文件。
并不总是需要直接使用bmconv工具产生专门用于特殊应用程序的位图文件。可以作为标准abld项目生成过程的一部分来执行所需位图的生成。可以在项目定义文件(.mmp)中指定.bmp文件列表。下一节将介绍项目定义文件(.mmp)语法中START BITMAP语句的示例。查看Series 60 SDK文档查以了解START BITMAP语法的更多细节。
多位图文件、颜色和调色板支持
在不同的产品之间,Series 60设备的硬件色彩功能可能存在区别。一般情况下,对于Series 60 1.x,显示屏能够产生最低4 096色(12位);对于Series 60 2.x,显示屏可以产生最高64K色(16位)。所有这些色彩位数可用于提供尽可能最佳的再现效果,例如,显示全色的JPEG照片。
一般在应用程序的.mmp文件中指定Symbian OS多位图(.mbm)文件的生成并设置目标色彩方案,如下所示:
START BITMAP myapp.mbm
HEADER
TARGETPATH        /system/ apps /MyApp
SOURCEPATH        . . /Data
SOURCE c8        MyPict.bmp                //256色
SOURCE c8        MyOtherPict.bmp         //256色
SOURCE 1        MyOtherPict_Mask.bmp        //黑白遮罩
END
完全重新生成项目时(一般从命令提示符中完成),bmconv将产生.mbm文件。可以根据喜好而直接从命令行中调用该文件。
可以指定12位色(4096或Color4k)或16位色(Color64k),不过,存在一个调色板,它带有256种(8位)颜色项,用于绘制用户界面图形,例如图标和窗口边界。使用这种调色板可以节省内存空间,同时确保不同产品之间一致的图形外观。
对于Series 60 SDK,bmconv实用程序已经做了改动,从而调用者可以有选择地指定用于转换中的目标调色板文件为参数。目标色彩模式不是Color256的位图不会受到影响。对于目标色彩模式为Color256的位图,则使用Series 60调色板进行转换?换句话说,颜色立方体中有216种色彩,同时有10种灰影(gray shade)。可以在SDK的根目录下面找到用作bmconv参数的调色板文件,具体位置是:/epoc32/include/ThirdPartyBitmap.pal。
该调色板中的色彩索引划分为下面几部分:
?        静态色彩(static color)?这部分包含通常称为Web安全色的216种色彩,同时带有另外10种灰色,共计226个索引。这些色彩是固定的,因此无论使用什么色彩方案,它们都保持相同。
?        方案色彩(scheme color)?保留有23个索引用于色彩方案。可以转换调色板这一部分中的RGB值,从而用户可以改变整体UI色彩方案,例如,从蓝色改变到绿色。这些索引用于应该遵循色彩方案的UI图形部分中。
?        通知色彩(notification color)?包括4种色彩,分别用于不同的注释(确认、信息、警告和错误注释)。
?        Series 60特有的编码标识色彩?用于识别计划与Series 60色彩调色板一起使用并支持色彩方案特性的位图。通过检查某些调色板索引的RGB值可以实现这一点。如果图像的值匹配预先定义值,则该图像被标识为Series 60特有的图像,并且产品中的调色板索引值将用于渲染该图像,而不是使用图像自身的调色板值。如果标识色彩索引的调色板项不匹配(或者使用的位图格式不同于索引的未压缩Windows位图),则使用图像的RGB值。
?        遮罩色(masking color)?保留一个索引(255)专门用于遮罩色。在遮罩中,这种索引值的像素将被渲染为透明色。
2.5.2  Series 60应用程序向导
本书中提供了大量示例项目,这些示例项目可用作任何新项目或应用程序的基础。
作为选择,可以使用各种IDE提供的向导工具来创建用于基本Series 60应用程序的项目。
1.Microsoft Visual C++ 6.0
如果正在使用Microsoft Visual C++ 6.0作为IDE,可以使用作为SDK一部分而提供的Series 60应用程序向导来创建新项目。它提供了一个简单而方便的方法,用于从Visual C++ IDE中生成基础应用程序框架。该向导将根据3种可选UI显示设计中的一种创建项目:基于对话框、Avkon视图切换、或传统的Symbian OS控件式应用程序体系结构。它将创建:
?        与大多数Symbian OS应用程序关联的4个基本类(App、AppUI、Document和View)的骨架代码和声明。
?        生成项目所需的所有生成文件和项目文件。
?        简单的资源文件和用作默认应用程序图标的位图。
?        在设备上安装应用程序所需的文件。
使用该向导非常简单,在Series 60 SDK中对它进行了很好的说明,因此这里不会对它的使用进行详细介绍。然而,它确实提供了一些选项来创建符合3种基本应用程序设计之一的项目。第4章将介绍这3种基本应用程序设计,因此推荐在使用向导之前阅读第4章。
2.Borland C++ BuilderX
如同第1章中所描述,通过将项目的bld.inf文件导入到IDE中,可以打开已有的Series 60项目。通过Object Gallery完成这一点。从菜单中选择“File | New”命令,然后选择“Import Symbian C++ Project”选项,以此来调用Object Gallery。在编写本书时,其他可以选择的选项是:
?        新Symbian GUI应用程序
?        新Symbian空项目
?        新Symbian DLL
?        新Symbian C++文件
?        新Symbian .H文件
?        新Symbian资源文件
?        新Symbian AIF向导
选择“新Symbian GUI应用程序”选项将创建Symbian项目的基本框架。不过,这一般是基于Uikon CEik-基类,而不是Series 60 GUI应用程序所需的CAkn-基类。
3.Metrowerks CodeWarrior
CodeWarrior可以根据提供的模板项目(称为stationery)创建新的项目。使用这种模板的方法是,选择“File | New…”命令,再从“Project”选项卡中选择“Symbian Stationery Wizard”。提供项目的名称并设置它的位置?使用“Set”选项进行浏览。选择开发商和正在使用的特定SDK版本。按下“Next”按钮并从C++复选框下面的下拉树型结构中选择需要的特定项目类型。然后,该向导将创建带有源文件和头文件的基本Series 60项目。
可以创建自己的stationery。同时一些获得许可的开发商也可能提供设备特有的stationery,作为获许可开发商的开发工具包和SDK的一部分。
2.5.3  其他SDK工具
Series 60 SDK为了方便开发者进行工作而提供了大量额外的工具和实用程序。查看SDK根目录下面的/Series60Tools文件夹,查找最新的可用工具和实用程序、它们的安装细节以及正确用法。
1.EPOCSwitch
EpocSwitch位于PC系统托盘中,通过它可以选择希望使用的SDK(通过右键点击该图标)。也可以双击图标或者从菜单中选择命令提示符,从而获得一个正确设置了环境的命令提示符。遗憾的是,这种方法与Symbian OS 7.0采用的SDK配置管理新方法不兼容(参见EnvironmentSwitch)。
2.EnvironmentSwitch
可以从Series 60 2.0中获得EnvironmentSwitch。它取代EpocSwitch,提供与其相同的功能,但是与最新的SDK和较早的版本完全兼容。和EpocSwitch一样,它位于系统托盘中,通过右键点击就可以激活它。
3.EPOCToolbar
该工具可以激活使用Symbian OS特有的工具栏?但只在Microsoft Visual C++ IDE中起作用。通过该工具栏中的6个图标可以访问6个方便的实用程序。
2005-11-12 12:07 #21
状态 离线  4.MBMViewer
该工具允许便捷地浏览嵌入PC上Symbian OS .mbm文件中的位图/图标。
5.MMPClick
该工具允许在.mmp文件上右键点击,并且从上下文菜单中选择希望针性进行生成的目标平台(armi urel,wins udeb,wins urel),否则创建Microsoft Visual C++工作区和项目文件。
6.SMS Inbox
这是一个模拟器应用程序,可以在测试从应用程序中发送/接收SMS消息的过程中在后台保持运行。发送SMS时,将消息复制到/smsout文件夹,将接收的SMS消息复制到/smsin文件夹中。通常的SMS浏览器和编辑器都可以用于编辑SMS消息。
2.5.4  更多的工具和实用程序
1.自定义Microsoft Visual C++?语法突出显示
使用文件usertype.dat可以启用Symbian OS和其他用户自定义关键字的语法突出显示。可以将用户自定义关键字设置为不同于C++关键字的颜色,从而更容易定位Symbian OS关键字。它作用于Visual C++ 6.0?参见下面的clindex,了解如何不断更新关键字文件。可以从http://www.emccsoft.com中获取usertype.dat以及如何使用它的说明。
2.自定义Microsoft Visual C++?Symbian OS变量扩展
在调试阶段,能够在观察窗口中浏览变量的内容非常有用。不过,Visual C++并不总是能够显示用户自定义类型。但可以使用文件autoexp.dat自定义Visual C++,借此在观察窗口和datatip中正确扩展复杂新数据类型。从http://www.emccsoft.com可以获得autoexp.dat及其使用指南。
3.Clindex
为了找出哪个库提供了哪些对象(从而可以列在.mmp文件中),可以检查SDK文档或使用来自于EMCC软件公司的实用程序clindex。检查Microsoft Visual C++ SDK安装,它产生了所有对象的最新有序列表和它们对应的库。此外,clindex有一个选项,用于将所有找到的类名合并到usertype.dat文件中。可以从http://www.emccsoft.com中获取clindex以及如何使用它的指南。
2005-11-12 12:07 #22
状态 离线  2.6  Series 60 SDK和IDE的安装技巧
从Series 60平台2.0开始,通过专门的包管理器应用程序来管理SDK安装。通过使用新工具,多个SDK的安装和使用更为简单。根据默认的设备设置和任何指定的覆盖值来自动设置EPOCROOT。为了保持向下兼容性,用户可以手工设置EPOCROOT,并且它将不会被device命令覆盖。
2.6.1  Microsoft Visual Studio .NET
微软不再支持Visual C++ 6.0 IDE。如果希望使用带有Series 60 SDK的Microsoft Visual Studio .NET,为了正确进行设置,可参阅Symbian Developer Network Knowledge Base(http://www3.symbian.com/faq.nsf)上的FAQ-0835(使用搜索选项,并输入FAQ-0835作为搜索主题)。
2.6.2  模拟器配置
Series 60模拟器用于测试处于开发中的应用程序,同时也用于在Series 60环境中进行应用程序数据和其他内容的交互。该模拟器提供了PC环境中Series 60的功能和一般性的外观,从而可以在开发软件的同时,更容易地执行应用程序逻辑、行为和完整用户体验的测试,而不需要具有真正的Series 60物理设备。
该模拟器提供了完全的目标环境,该环境在PC上的Microsoft Windows下面运行。实现的平台称为WINS(WINdows Single process)平台。在PC模拟器下,应用程序作为单个进程内的单独线程运行,而在目标硬件上,每个应用程序都在自己的进程中运行,一般通过内存管理硬件互相保护。
该模拟器基本上能够基于PC完成开发。它具有优秀的调试支持;当线程出现严重错误时,调试器提供有关该错误的充分信息。只有最后的开发阶段才关注目标硬件。一般不遵循这种规则的例外情况为低级编程,此时必须直接访问目标硬件,例如物理设备驱动器的编程工作;并且,在这种编程工作中,只通过模拟器无法满足连通性/通信的需求。
该模拟器非常灵活,并且具有高度可配置性。但是,其中可选项根据所使用的平台版本而有细微的变化。表2-4中总结了各种选项。第二栏中列出的信息资源请参见表后的内容。
资源
【此处插入表2-4】
搜索SDK文档(.chm文件)时,字面值搜索意味着将搜索字符串放在引号中,按照指定的内容进行精确搜索。根据具有的SDK文档版本,搜索字符串可能具有细微的区别。
为了查找在Symbian Developer Network Knowledge Base中引用的信息,使用Knowledge Base搜索工具中的FAQ号(可以在http://www3.symbian.com/faq.nsf中找到该工具)。
SDK01?Series 60 SDK文档:用关键字“Emulator Guide”进行精确搜索。
SDK02?Series 60 SDK文档:用关键字“Configuring the Emulator”或“Emulator configuration”进行精确搜索。
SDK03?Series 60 SDK文档:用关键字“Comms settings syntax”进行精确搜索。
SDK04?Series 60 SDK文档:用关键字“Enabling RAS for the emulator”进行精确搜索。
SDK05?Series 60 SDK文档:用关键字“CommDb Overview”进行精确搜索。
FN01?“诺基亚论坛”站点Series 60部分中的“Series 60模拟器配置”。
SDN01?Symbian Developer Network Knowledge Base FAQ-0893。
SDN02?Symbian Developer Network Knowledge Base FAQ-0867。
SDN03?Symbian Developer Network Knowledge Base FAQ-0713。
2.6.3  模拟器中的应用程序严重错误
Symbian OS使用术语“严重错误”表示应用程序和系统线程的异常中断。当发生不可恢复的错误时,系统或应用程序自身可能产生严重错误。从Series 60 SDK 1.2开始,当应用程序发生严重错误时,模拟器只显示消息“Program closed(程序已关闭)”,而不显示一般的严重错误号和信息文本。为了显示严重错误号和文本上下文消息(按照较早平台版本上那样),需要在文件夹/epoc32/wins/c/system/bootdata中创建名字为ErrRd的空文件。如果这样做,将以正常的方法处理发生的任何严重错误。
2005-11-12 12:08 #23
状态 离线  2.7  高级应用程序部署和生成指南
下面将提供一些更高级的应用程序部署和生成指南。其中一些指南介绍如何使用模拟器,一些指南则针对目标设备(包括模拟器和目标硬件之间的关键区别)。一些信息则与软件安装和分布更为相关。
2.7.1  平台UID
平台UID是Symbian安装系统(.sis)包文件(.pkg)定义的基本部分?必须在应用程序准备对外发布之前包含它们。表2-5提供了当前平台UID的列表,可以在.pkg文件中使用这些平台UID指定与应用程序兼容的目标Series 60平台。
【此处插入表2-5】
一般倾向于使用Series 60平台UID(而不使用目标设备特有的平台UID),除非应用程序只是针对特定的手机。
可以在一个.pkg文件中定义多个平台UID,用于表示应用程序可以运行的所有平台和设备。使用最广泛的可用平台UID号,从而获得最大兼容性,但需要考虑周到。不要使用Series 60 2.x平台UID,除非使用Series 60 2.x SDK进行生成。
如果需要了解以述要求的完整解释和最新实现细节,请访问http://www.forum.nokia.com,参阅标题为“Series 60平台标识码”的相关文档。
2.7.2  设备标识UID
所有的Series 60设备都可以返回由制造商分配的唯一标识符UID。注意,这不同于平台UID。
在安装过程期间或运行时,标识符UID有时可用于确定安装应用程序的设备确切身份。可以实现这两种要求,下面两节将分别加以描述。
表2-6提供了设备UID的部分列表;不过,可能需要咨询授权获得商了解特定设备的UID。
【此处插入表2-6】
1.安装时的设备标识
在过程期间确定安装应用程序所用设备的确切身份具有许多潜在的优点。例如,它允许判定特定的设备需要哪些不同的特殊组件或文件。下面是摘自一个假想安装包脚本文件(.pkg)的示例部分,显示如何完成这种有条件的安装过程。
IF MachineUID=0xl01F4FC3;  install Nokia 7650 specific files
"/Epoc32 /release/armi/urel /N7650. dar"  -
"!: /system/apps/ExampleApp/N7650. dat"
ELSEIF MachineUID=0x101F466A ;  install Nokia 3650 specific
files
"/Epoc32 /release/armi /urel /N3650. dar"  -
"!: /system/apps/ExampleApp/N3650. dat"
ELSEIF MachineUID=0xl01FB3DD ;  install Nokia 6600 specific
"/Epoc32 /release/armi/urel/N6600 .dat"
"!: /system/apps/ExampleApp/N6600. dar"
ELSE ;  install option for all other devices
"/Epoc32 /release/armi /urel /Default. dar"  -
"!: /system/apps/ExampleApp/Default. dar"
ENDIF
2.执行时的设备标识
这种设备标识可用于获得运行时应用程序所处设备的确切身份?一般情况下,可能希望在应用程序初始化的早期就进行这项工作。可以做到这一点,并且Symbian OS实用程序API可以提供设备UID?请查看第12章和标题为“硬件抽象层”一节,了解一些相关的示例代码。
2.7.3  资源文件版本和压缩
Symbian OS 7.0引入了一种资源文件压缩算法,一般的Symbian OS 6.1中并没有提供这种算法。然而,版本2.0之前的Series 60版本实现了自己的资源文件压缩方案?与Symbian OS 7.0s中的方案不同。
Series 60 2.x压缩资源文件与Series 60 1.x不存在向后兼容关系。
然而,为了维持一定程度的向前兼容性,Series 60 1.x资源、.aif、.sis和位图文件(.bmp)可以和基于Series 60 2.x的设备一起使用。
2.7.4  针对ARM目标的生成
一般情况下,ARM生成将比模拟器(WINS)生成更为困难,并且通常在第一次尝试时gcc会产生额外编译器错误和警告。这是因为gcc在一般情况下比Microsoft编译器等更为严格,同时它有一些细微的区别,这些区别将在第一次尝试ARM生成时显现出来。下面介绍了一些最为常见的错误。
函数输出
当涉及指定输出函数时,gcc工具链比WINS生成更为严格。从DLL中输出函数的正确方法如下:
在头文件(.h)中:
class CMyClass  :  public CBase
IMPORT_C void Function();
}
然后在源文件(.cpp)中:
EXPORT_C void CMyClass: :Function()
WINS工具链不会提醒CPP文件中是否没有包含EXPORT_C;它无论如何都会输出函数。然后,gcc工具栏需要IMPORT_C和EXPORT_C之间的完全匹配。如果不匹配,则不会从DLL中输出函数,在尝试链接到这个DLL时,这将最终导致产生“Cannot Find Function”(无法找到函数)这样的错误。
2005-11-12 12:08 #24
状态 离线  1.DLL中可写入的静态数据
其他编译区别包括一些错误,例如由生成工具petran产生的“The MyDll.DLL has(un)initialized data”(MyDll.DLL具有(未)初始化数据)错误。petran工具去除与ARM目标无关的符号信息的PE格式文件(Win32可移植可执行文件格式);因此使DLL小得多。所以,ARM目标只支持按照顺序的链接。Petran也负责将UID信息添加到可执行文件的头文件中。
Symbian OS体系结构不允许DLL具有数据段(静态数据,或初始化或未初始化)。以下基本问题决定是否应该使用数据段:
?        是否所有的DLL用户都共享数据段?
?        是否应该针对DLL附加的每个进程都复制数据段?
?        在实现任何可能的方案时,都有显著的运行时系统开销。
然而,因为WINS模拟器使用对应的Windows DLL机制,它可以使用“即写即复制”方式提供每个进程的DLL数据。这就是直到生成基于ARM的Symbian OS设备的代码时才检测到问题的原因。
在生成过程期间生成的相关.map文件包含帮助追踪所涉及的源文件的信息。查看../epoc32/release/armi/urel/dllname.map,并且搜索“.data”或“.bss”。查看诺基亚论坛中Series 60部分的“Series 60编码习惯”,了解有关该主题的更多细节。
2.生成和冻结DLL
加载DLL时,它提供一个地址表,一个地址对应于每个输出的符号,另一个地址则对应于每个输出函数的入口点。这是DLL的公共接口,并且DLL应该在发布前冻结它们的输出,从而确保库的新版本的向后兼容性。这在术语上称为维持二进制兼容性(BC,maintaining binary compatibility)。而且每个输出的索引应该在不同版本之间保持不变。
开发DLL时,可以在项目的.mmp文件中使用EXPORTUNFROZEN关键字,用于告诉生成过程还没有冻结输出。准备进行冻结时,必须从.mmp文件中移除EXPORTUNFROZEN关键字,并且提供一个列出输出的.def文件。
Symbian OS使用输出定义文件(.def)管理这种需求。每个输出的符号列在该文件的输出部分中,同时带有一个序号,序号的基数为1。
第一次完成生成时,可能会生成一个警告,声明冻结的.def文件并不存在。一旦完成项目,并且已经按照它的发布形式进行了生成,就可以使用下面的代码运用abld冻结该项目:
abld freeze
这种方法将创建冻结的.def文件,该文件包含项目的输出函数。然后,为了根据最近冻结的接口生成应用程序,输入下面的命令:
abld build wins udeb                                 ?用于Visual C++
abld build winsb udeb                                ?用于Borland C++
abld build winscw udeb                        ?用于CodeWarrior
为了维持BC,必须在新版本中定义较早版本中已经定义的每个输出。在新版本中引入的新输出的任何序数必须跟在较早版本中定义的输出的序数后面。
对于DLL生成,命令行工具自动在指定目标的生成树中创建.def文件。一旦针对生成创建了这些文件,可以将它们和项目源一起归档,并且用于将来的生成,根据改动冻结相应的输出。通过如下方式完成这一点:将.def文件复制到默认位置,并且在项目的.mmp文件中包括如下代码:
DEFFILE projectname.def
通常,只有命令行生成应该发布。注意,一些IDE现在也支持输出的冻结。在项目以后的任何命令行生成中,可以保证输出与当前的版本兼容。
如果添加新输出,则应该从生成目录中复制新的.def文件,并且将这些文件和新的版本一起归档。
注意,所有的ARM平台共享一个公共.def文件,但是WINS/ WINSCW/WINSB具有不同的.def文件。
2005-11-12 12:09 #25
状态 离线  2.8  小结
本章详细介绍了如何选择并使用特定的SDK,以及如何以某种方式指定Series 60项目,允许针对模拟器或目标设备进行项目生成。本章详细讲解了使用项目文件使之能够运用各种IDE进行开发的过程。同时,本章也介绍了如何针对模拟器和目标硬件从命令提示符中生成项目。
本章详细描述了组成一般项目的源文件和其他文件(作为生成工具的输入),同时也描述了组成该过程输出的文件。使用GUI应用程序、本地化的GUI应用程序以及控制台应用程序示例演示了生成过程和输出文件。本章也定义了应用程序资源,同时介绍了定义和生成本地化应用程序的过程。
通过详细介绍Symbian安装系统(包括介绍如何在安装时启动应用程序),描述了在Series 60设备上部署应用程序。
到现在为止,读者应该对Series 60开发期间经常使用的主要生成工具和部署工具有了很好的了解。此外,我们介绍了一些和Series 60 SDK一起提供的非常见工具,以及大量可用于Series 60模拟器的配置选项。
2005-11-12 12:09 #26
状态 离线  〖CMWAP 和 CMNET 的主要区别与适用范围〗
如果你是一个菜鸟或者初学者,不妨直接跳到第(4)节,看看我提供的“应用程序能否工作于CMWAP的辨别方法”;如果你希望对CMWAP和CMNET有一个详细的了解,那么就读完全篇吧;如果你对这个问题有所研究的话,还请不吝赐教,解开仍旧困惑我的几个疑问。
(1) 为什么会有两个接入点?
在网上查阅大量资料后并经过反复的尝试与探索后,我大致对中国移动提供的这两种接入方式有了初步了解。
在国际上,通常只有一种GPRS接入方式,为什么在中国会有CMWAP和CMNET两兄弟呢?(彩信之所以单独配置接入点是因为彩信服务需要连接专用的服务器,在这里不作探讨。)
其实,CMWAP 和 CMNET 只是中国移动人为划分的两个GPRS接入方式。前者是为手机WAP上网而设立的,后者则主要是为PC、笔记本电脑、PDA等利用GPRS上网服务。它们在实现方式上并没有任何差别,但因为定位不同,所以和CMNET相比,CMWAP便有了部分限制,资费上也存在差别。
(2) 什么是WAP?
WAP只是一种GPRS应用模式,它与GRPS的接入方式是无关的。WAP应用采用的实现方式是“终端+WAP网关+WAP服务器”的模式,不同于一般Internet的“终端+服务器”的工作模式。主要的目的是通过WAP网关完成WAP-WEB的协议转换以达到节省网络流量和兼容现有WEB应用的目的。
WAP网关从技术的角度讲,只是一个提供代理服务的主机,它不一定由网络运营商提供。但据我所知,中国移动GPRS网络目前只有唯一的一个WAP网关:10.0.0.172,有中国移动提供,用于WAP浏览(HTTP)服务。有一点需要注意,WAP网关和一般意义上的局域网网关是有差别的,标准的WAP网关仅仅实现了HTTP代理的功能,并未完成路由、NAT等局域网网关的功能。这就决定了它在应用上所受到的限制。
(3) 中国移动对CMWAP的限制
为了从应用中区别两者的定位,中国移动对CMWAP作了一定的限制,主要表现在CMWAP接入时只能访问GPRS网络内的IP(10.*.*.*),而无法通过路由访问Internet。(少数地区的移动网络可能不存在这一限制。)我们用CMWAP浏览Internet上的网页就是通过WAP网关协议或它提供的HTTP代理服务实现的。
说到这里,就让我自然而然的联想到我们公司的网络,相信不少工作的朋友都有类似的体会。公司的网络在网关上不提供路由和NAT,仅仅提供一个可以访问外网的HTTP代理。这样,我们就无法直接使用QQ、MSN等非HTTP协议的应用软件了(好在它们还提供的有HTTP代理的连接方式)。CMWAP也正是
(4) 适用范围
适用范围才是大家最关心的问题。CMNET拥有完全的Internet访问权,这里就不多说了,主要让我们来看看CMWAP。因为有了上面提到的限制,CMWAP的适用范围就要看WAP网关所提供的支持了。目前,中国移动的WAP网关对外只提供HTTP代理协议(80和8080端口)和WAP网关协议(9201端口)。(据有的网友提到1080端口也是开放的,但无法连接。这也许是移动内部使用的一个Socks后门吧^_^)。
因此,只有满足以下两个条件的应用才能在中国移动的CMWAP接入方式下正常工作:
1. 应用程序的网络请求基于HTTP协议。
2. 应用程序支持HTTP代理协议或WAP网关协议。
如何辨别一个应用程序的网络请求是否基于HTTP协议?
这个问题还真不好回答,要完全做到这一点需要通过拦截应用程序的通信数据包进行分析。这里提供几个简单的方法给广大菜鸟朋友:从表现上看,如果它的网络请求是网址(URL)的形式,那么通常是基于HTTP协议的,如Web浏览器;如果它连接的服务器端口是80,那么它可能是基于HTTP协议的。如果确实无法准确判断,那么请直接看下一个条件。(满足第二个条件的应用一定是基于HTTP协议的)
如何区别一个应用程序支持HTTP代理协议还是WAP网关协议呢?
首先看它的设置中有没有代理服务器的选项(通常在S60上未特别说明的代理都是特指HTTP代理),如果有则表示它支持HTTP代理协议。如果没有,则需要按照以下步骤测试:
在GPRS接入点设置的高级设置里去掉代理服务器的设置项:Server Address 和 Server Port(,如果应用程序可以正常工作,那么它是基于WAP网关协议,如Java程序、S60内置的浏览器。如果在此状态下不能正常工作,而恢复GPRS接入点高级设置中的代理服务器设置后能够正常工作,则应用程序支持HTTP代理协议(代理设置从系统中读取)。如果仍不能正常工作,那么这个应用程序一般来说是不支持HTTP代理协议或WAP网关协议的。
这里需要特别说明的是JavaQQ,它有Socket和HTTP两种版本。现在网上流传的可用于CMWAP的JavaQQ就是基于HTTP协议的。就拿那个JavaQQ 2004来说,启动画面中就明确的写着“KJava QQ HTTP”。而SIS版的QQ和AgileMessenger(S60的MSN客户端)因为是采用的普通的Socket连接方式,因此无法用于CMWAP。
总结一下CMWAP下可以使用的常见软件的工作方式:
(1) 手机内置的浏览器:WAP网关协议
(2) Opera 浏览器:HTTP代理协议(有代理设置)
(3) Java 程序:WAP网关协议
(4) AvantGo:HTTP代理协议(有代理设置)
比较奇怪的是AvantGo虽然支持HTTP代理,但在我的测试中发现AvantGo同步时并没有使用代理服务器。难道它在连接主服务器是用的Socket方式?不解

你可能感兴趣的:(symbian,microsoft,工具,平台,语言,os)