Symbian OS v9.x SIS 文件格式说明书

介绍

目的和范围

本文档描述Symbian OS v9.1版本重新设计和重新组织的SIS文件格式。SIS文件是设备部署所需的文件包,用手机安装程序解析。除了简单的打包文件的功能外,SIS文件还可以包含影响安装过程的条件判断,比如设备相关的安装,语言相关的安装、用户可选的组件。 Symbian OS v9.1包含了新的设备安全策略,所以不再支持以前的版本。另外,设备上的安装程序在安装成功前监督安装来确保安装包符合特定的安全标准。

SIS文件格式

概述

SIS文件的信息分成2个独立的部分。第一部分是元数据(Meta-Data),描述需要安装的文件集合。第二部分包含实际的文件数据部分。这使得安装程序可以分成2个阶段,判断和安装。在判断阶段,对SIS文件进行审查和安全检测,从而验证安装。在安装阶段,如果核实正确,就仅仅是拷贝文件到设备上的过程。

注意SIS字段的保留值

请注意,Symbian保留了定义SIS字段相关的可扩展值集。例如,字段TInstallFlags 位指示器(用bit位来标识枚举类型). 未定义的值的产生----MakeSIS和/或SignSIS支持的上下文之外的,因此就可能引起跟Symbian OS后续版本的兼容性问题。因此SIS包的安装也许就会失败。

完整性

SIS文件格式支持签名和证书(签名安装包),这些签名可以在安装过程中进行审查,也可以在安装包安装到设备上之后再次审查。为了支持SIS文件的2段安装过程(判断和安装),只有SIS文件的元数据被签名。为了确保文件内容的完整性,元数据中包含了包中每个文件的散列(Hash)。因此整个SIS文件的的完整性是由签过名的元数据来保证的。这意味着在安装过程中,安装程序可以校验签过名的元数据中的每一个文件的散列,同时使用一个不受信的组件来执行任何需要的解压缩。 SIS文件中分离每个元数据的校验和(checksums) 与 文件内容使得SIS文件可以在安装过程的开始阶段被检测。这些校验和是可选的(optional)。

扩展性

考虑到修改文件格式的成本和潜在风险,SIS格式被设计成可扩展的,使用TVL(Type-Length-Value)格式。由于每个SIS字段都有规定的长度,所以当安装程序解析一个SIS文件时,可以忽略那些无法识别的类型。

压缩

SIS文件格式支持SIS包中每个文件的独立压缩,SISController也可以被压缩。这样减少了安装需要的多余空间。使用SISCompressed SIS字段来标识压缩,它内部也可以包含另一个压缩的SIS字段。

嵌套

为了限定安装一个SIS包所需的资源数量,Installer现在最多只处理SIS文件的八层嵌套。SIS文件如果包含多于8层的嵌套,就会被拒绝。

支持SIS文件再次签名

由于SIS文件格式不需要修改偏移,所以它很容易添加新的签名和证书链到元数据的末尾,即使它们在SIS文件的中间。 Symbian File Header SISContents ...... SISController ...... ...... ...... SISSignatures SISData ......

SISSignatures 字段会由于添加的签名证书链而加长,后续字段会在SIS文件中随之往后偏移。

编程要考虑的事

文件格式

SIS文件格式被设计成每个字段由一个类(class)表示。这样就可以很容易的用C++的类来实现。由于文件格式中没有使用偏移,因此设计一个C++类包含SIS字段中的所有数据是可以实现的。

内存使用

由于SIS文件可能会很大,所以不可能一次性把所有的数据载入内存。根据文件格式的结构,可以每次载入一个SIS字段的元数据信息,而不用一次性载入所有的SIS字段。

支持嵌入SIS

支持一个SIS文件中嵌入另外一个SIS文件。MakeSIS能够在创建一个SIS文件时,把一个已经生成的SIS文件嵌入其中。这个已生成的SIS文件会被SISController加载,解压(如果需要的话),插入到SISInstallBlock字段。SISDataUnit(这个字段包含安装所需的文件)被添加到SISData字段的数据单元队列(Data Units array)的末尾。SISControllers有一个数据索引字段,标识所需文件的SISDataUnit的索引。MakeSIS必须循环访问被添加的SISControllers,修正这些索引值。

图1 - 嵌入SIS文件

在生成的SIS文件中,为了查找SISDataUnit中的SISFileData的绝对索引,SISControllers链中的每一个数据索引(Data Index),从最外层的SISController到当前处理的SISController,是总计累加的。从图1中,所有的SISController都有一个数据索引是0。当计算Controller2的SISDataUnit中SISFileData的索引时,Controller1和Controller2的数据索引相加,得到它的绝对索引。

图2 - 多项嵌入Controller的数据索引

下表标识了SISFileData中的SISDataUnit的绝对索引,对应上面图中的Controller。

SISController SISFileData中SISDataUnit的绝对索引 A A(0) = 0 B A(0) + B(1) = 1 C A(0) + B(1) + C(1) = 2 D A(0) + D(3) = 3 E A(0) + D(3) + E(1) = 4 F A(0) + D(3) + F(2) = 5 G A(0) + G(6) = 6 H A(0) + G(6) + H(1) = 7

字节序

所有的元数据都以Little-Endian格式存储。

字符集

SIS文件格式只支持Unicode UCS-2 编码字符串。

文件限制

前面描述过,SIS Controllers/files的嵌套只支持8级。个别安装类型被去掉了,目前支持的类型有: EInstInstallation // standard type EInstAugmentation //removable addition to a package EInstPartialUpgrade // adds files to a package (patch) without any removals EInstPreinstalledApp // for use with pre-installed media EInstPreInstalledPatch // for use with pre-installed media 不支持的类型是 EInstSISSystem, EInstSISOption, EInstSISConfig, EInstSISPatch, EInstSISMIDlet, EInstSISMIDLetSuite。

SIS文件结构概述

SIS文件格式由TLV格式编码的SIS字段组成。所有的SIS字段都以这种格式存储,除了存储在SISArray中的SIS字段。这是由于一个Array中存储了SIS字段的相同类型,Array中的每一项都包含Type是多余的,所以只存储Length和Value。 Type Length Value

Type

这个字段标识SIS字段的类型。每种类型都有一个唯一的ID,详细定义在附录A中可以找到。这个字段的长度是4个字节。

Length

这个仅指Value字段的长度,不包括SISField中的其他字段的size。 Length字段存储为4个字节或8个字节,根据它的值。这是因为有些字段需要支持64位的长度,但是大部分字段我们不需要64位长度。所以没有必要把所有的字段长度都以64位来存储。Length以无符号型来标识。如果Length小于2的32次方,那么Value以32位存储。如果Length大于或等于2的31次方,那么Value以64位存储。最高位设置成1,表示数据长度最大可能表示为2的63次方减1。读取数据长度的值时,我们首先读取前32位。如果最高位是0,那么低31位表示数据长度值。如果最高标志位设置为1,那么我们读取下一个32位,然后把2部分合并,组成63位。

Value

这个字段包含了SIS字段的数据。它的格式取决于Field ID。

原理

这个格式的原因是,它使得用C++类来实现SIS字段非常容易。也很容易只根据SIS字段数据就构造出实例,而不需要SIS文件中的其他部分。

校准

SIS格式以0字节填充需要的区域(在每个SIS字段的末尾),所以每个SIS字段以32位Word边界开始。这样可以在只支持32位对齐访问的系统上从内存中高效的解析格式。

标记法

以下标记用于描述SIS文件格式的数据结构 Structure Name Name of Field 1 Type of Field Size of Field ...... ...... ...... Name of Field N Type of Field Size of Field Structure Name是结构体的名字,决定存储在Type 字段的ID。长度取决于所有字段的长度。字段1到N,表示结构体中Value部分的数据。

SIS文件结构

SIS文件中的所有实际数据都包含在SISContents字段中。Symbian OS使用一个Header来联系文件集合。这个Header是一个扁平(flat)数据结构,包含3个32位的UID和一个32位的校验和。 Symbian File Header SISContents

文件头结构

Field Name Field Size UID 1 4 Bytes UID 2 4 Bytes UID 2 4 Bytes UID Checksum 4 Bytes

UID 1

SIS文件相关的应用程序UID,总是0x10201A7A。

UID 2

这个UID保留,为了未来可能的用途。

UID 3

SIS文件的Package UID。这个UID唯一标识一个SIS文件,除了升级包(升级包和原安装包需要有相同的UID3)。这个UID应该跟最上层的SISController的SISUid字段的UID一致。注意:这个UID(UID3)在其他文档中一般也称为包UID(Package-UID)或者简称pUID。

UID校验和

这个字段提供UID结构体的校验和。

SIS字段

普通SIS字段

SISString

包含一个UCS-2编码的Unicode字符串。 SISString Length String

String

这个字段包含Unicode UCS-2编码的字符串。它的长度字节由Length字段表示,由于每个字符是以16位编码,所以字符数量是长度的一半。

SISArray

这个字段含有一个SIS字段类型的队列。SISField包含的Type会在从数据中创建SISField时将被检查,以及添加新SISField时。 SISArray<SISString>用于表示一个SISString的队列。队列中所有的SISField都优化为不存储Type,只存储TLV中的length和Value部分。 SISArray Length SISField Type TUint32 4 bytes SISField 1 SISField ...... ...... SISField N SISField

SISField Type

这个字段表示队列中SISField的类型。所有的字段都是相同类型。当从数据中创建SISField时将检查这个字段,以及添加新SISField时。

SISFields

这是SISField的序列,它们的Type都等于SISField Type字段的值。这个SISField只是部分存储,Type字段被丢弃,因为从SISArray的SISField Type字段能够确定它的Type。Field的数量通过读取所有的Field直到我们读完SISArray Length值表示的所有数据。

原理

在SIS文件格式中有几个地方需要SISField队列,所以为了减少代码冗余,设计了SISArray类型。

SIS压缩

这个字段是原始数据的包装,数据可以有选择的被压缩。数据可以是一种容易集成在SSI文件格式中的SISField。 SISCompressed<SISString>用于表示一个经过压缩的SISString。 SISCompressed<Raw Data>表示经过压缩的Raw Data。 SISCompressed 长度压缩算法 TUint32 4 bytes 未压缩数据的长度 TUint64 8 bytes 经过压缩的数据

压缩算法

这个字段包含用于压缩数据的算法 Enum TCompressionAlgorithm { ECompressNone = 0, //数据未压缩 ECompressDeflate //数据根据RFC 1951压缩 };

未压缩数据的长度

这个字段包含数据未压缩时的长度。

经过压缩的数据

这字段包含经过压缩的数据。

SISVersion

用于存储版本号,包括主版本、次版本、build号。 SISVersion 长度 Major TInt32 4 bytes Minor TInt32 4 bytes Build TInt32 4 bytes 只能使用正数或0表示版本。不过,当合适时,主、次、build号可以设置成-1,表示任何版本。

SISVersionRange

该字段表示版本范围。用于表示哪个版本满足特定的依赖关系。如果范围只是一个特定版本,那么“From Version”和“To Version”都要设置成相同值。如果可以升级到任何版本,那么“From Version”和“To Verson”的主、次、Build号要设置成-1。“To Version”可以省略,表示版本范围应用于从“From Version”到任何后续版本。 SISVersionRange 长度 From Version SISVersion To Version SISVersion

版本检查

当检查依赖关系时,我们分别检查已安装的版本和“From Version” “To Version”。检查“From Version”,我们首先判断将安装的包和已安装的包的主版本号。如果已安装的包的主版本号小,那么依赖关系检查失败。如果大,那么这个检查通过。如果相等,那么以相同的规则检查次版本号。这样以词典编纂方式比对版本。主、次、Build版本值为-1则需要特殊处理。如果我们发现“From Version”是-1,那么整个From部分检查通过。 “To Version”以相同方式检查。例如:

Major        Minor        Build

From Version 3 -1 -1 To Version 4 5 -1 这将从3.x.x到4.5.x升级任何版本。x 可以是任何值

Major        Minor        Build

From Version 1 3 4 To Version 4 3 5 这将升级1.3.4或1.3.5

SISDate

该字段表示一个日期。日期以公历格式存储。年的部分要完整存储,必须是有效日期。 SISDate Length Year TUint16 2 bytes Month TUint8 1 byte Day TUint8 1 byte

Year

年以绝对数存储。例如 2004年以2004表示。

Month

月以0-11表示1月到12月。

Day

日从1开始。

SISTime

该字段表示一个时间。格式UTC,必须是有效时间。 SISTime Length Hours TUint8 1 byte Minutes TUint8 1 byte Seconds TUint8 1 byte

SISDateTime

该字段包含日期和时间 SISDateTime Length Date SISDate Time SISTime

SISUid

该字段包含SIS文件的UID SISUid Length UID 1 TInt32 4 bytes

SISLanguage

该字段表示一种语言 SISLanguage Length Language TUint32 4 bytes

Language

该字段的值与TLanguage枚举类型一致,但是在SIS文件中以TUint32存储。

SISBlob

该字段封装一些上下文决定的原始数据。 SISBlob Length Data

Data

该字段包含数据,长度由该SISField的长度决定。

SISDataIndex

该字段作为SISData字段的DataUnits字段的队列的相对索引。为了查找SISDataUnit中的SISFileData的绝对索引,SISControllers链中的每一个数据索引(Data Index),从最外层的SISController到当前处理的SISController,是总计累加的。从图1中,所有的SISController都有一个数据索引是0。当计算Controller2的SISDataUnit中SISFileData的索引时,Controller1和Controller2的数据索引相加,得到它的绝对索引。见“支持嵌入SIS”。 SISDataIndex Length Data Index TUint32 4 bytes

Data Index

该字段用于查找SISData字段的DataUnits字段队列的索引。每个SISController中有一个SISDataUnit。

4.2 SIS文件元数据字段 (Meta-Data SISFields)

4.2.1 SISContents 该字段包含SIS文件的整个内容。内容分成若干部分到SISController中。SISController包含了元数据和SISData。SISData包含了实际的文件数据。 SISContents 长度 Controller Checksum SISControllerChecksum Data Checksum SISDataChecksum Controller SISCompressed <SISController> Data SISData

4.2.1.1 Controller Checksum 该校验和是一个对Controller字段内容的CRC-16校验。该校验和是对整个SISCompressed<SISController>。 所以如果这个SISController是经过压缩的,它不需要被解压缩来验证校验。这使得检查Controller的完整性不需要检查整个文件。该字段是可选的,也许不会出现。

4.2.1.2 Data Checksum 该校验和是对整个数据字段内容的CRC-16校验。这使得检查数据的完整性不需要检查整个文件。该字段是可选的,也许不会出现。

4.2.1.3 Controller 它包含SIS文件中的所有元数据。

4.2.1.4 Data 该字段包含SIS文件的实际文件。它们根据Controller字段的元数据的含义被分别单独处理。

4.2.2 SISControllerChecksum 该字段包含可能经过压缩的SISController的校验和。 SISControllerChecksum Length Checksum TUint16

4.2.2.1 Checksum 该字段包含CRC-16校验和。是对整个SISCompressed<SISController>字段的计算。

4.2.3 SISDataChecksum 该字段包含SIS文件的SISData部分的校验和。 SISDataChecksum Length Checksum TUint16

4.2.3.1 Checksum 该字段包含CRC-16校验和。是对整个SISData字段的计算。

4.2.4 SISController 该字段包含SIS文件的元数据 SISController Length Info SISInfo Options SISSupportedOptions Languages SISSupportedLanguages Prerequisites SISPrerequisites Properties SISProperties Logo SISLogo Install Block SISInstallBlock Signature 0..N 0 SISSignatureCertificateChain Signature 0..N ... SISSignatureCertificateChain Signature 0..N N SISSignatureCertificateChain Data Index SISDataIndex

4.2.4.1 Info 该字段包含SIS文件的信息

4.2.4.2 Options 该字段包含:当安装文件时询问用户选择的选项。这些选项用于确定哪些文件将被安装。

4.2.4.3 Languages 该字段包含SIS文件支持的语言。

4.2.4.4 Prerequisites 该字段包含安装SIS文件的前提条件。

4.2.4.5 Properties 该字段包含属性Properties,成对的Key, Value 整型数。

4.2.4.6 Logo 该字段是可选项,如果存在就表示一个在安装开始时显示的Logo。

4.2.4.7 Signature 0......N 这些字段表示签名,签署SISController中的数据,不包括Data Index字段。每个SISSignatureCertificateChain签署的数据范围是从SISController的SISInfo字段到SISSignatureCertificateChain字段之前。因此每个签名把所有之前的签名当做SISController数据进行签署。

4.2.4.8 Data Index 该字段是SISData字段的DataUnits字段队列的一个索引。每个SISController有一个SISDataUnit。

4.2.5 SISInfo 该字段包含SIS文件的相关信息 SISInfo Length UID SISUid Vendor Unique Name SISString Names SISArray<SISString> Vendor Names SISArray<SISString> Version SISVersion Creation Time SISDateTime Install Type TUint8 1 byte Install Flags TUint8 1 byte

4.2.5.1 UID 该字段表示SIS文件的UID。该UID应该是特定应用程序包唯一的。不过相同的UID可能会有多个不同版本的安装包。

4.2.5.2 Vendor ID 该字段表示创建该安装包的厂商。

4.2.5.3 Vendor Unique Name 该字段表示一个非局限的厂商名字。用于安装过程中检测一个安装包是否是一个有效的升级包。

4.2.5.4 Names 该字段包含SIS文件的名字队列。它们必须是每种支持的语言对应一个名字。每个名字跟SISController的SISSupportedLanguages字段对应的语言一致,在队列中的位置也一致。

4.2.5.5 Vendor Names 该字段包含SIS文件厂商的名字队列。它们必须是每种支持的语言对应一个名字。每个名字都对应SISController的SISSupportedLanguages字段的语言,在队列中的位置也一致。

4.2.5.6 Version 该字段表示SIS文件的版本。

4.2.5.7 Creation Time 该字段表示SIS文件的创建时间和日期。但是它不是一个安全的时间戳,可以轻易的被用户以修改PC时钟的方式修改。

4.2.5.8 Install Type 该字段表示SIS文件的安装类型。根据这个值,安装程序将采用不同的行为安装文件。该值以TUint8存储,但是对应以下枚举值: Enum TInstallType { EInstInstallation, EInstAugmentation, EInstPartialUpgrade, EInstPreInstalledApp, EInstPreInstalledPatch };

4.2.5.8.1 EInstInstallation [SA] SIS文件包含一个可以安装在设备上的应用程序。一旦它被安装上了,就出现在已安装SIS文件列表中(程序管理软件),用户也就可以删除它。如果用户想安装一个拥有相同UID,类型是EInstApplication的SIS包到设备上,同时设备上已经安装了一个相同UID,类型是EInstApplication的SIS包,那么该新SIS包被看做是升级版本。当前版本会被删除,新版本会被安装上。

4.2.5.8.2 EInstAugmentation [SP] SIS文件包含一个已经存在的安装包的增量。这些文件后续可以被删除,跟原安装包分离。这允许例如,游戏关卡,增强一个已经安装上的应用。

4.2.5.8.3 EInstPartialUpgrade [PU] SIS文件包含一个应用程序的部分升级。部分升级与正常的应用升级不同,在安装升级版之前,原版不会被删除。这允许例如,用一个非常小的升级SIS包去替换原安装包的部分文件,不需要再次发布整个原安装包。

4.2.5.8.4 EInstPreInstalledApp [PA] 特殊的类型,用于预安装,内置,在卡上。

4.2.5.8.5 EInstPreInstalledPatch [PP] 特殊的类型,用于预安装,内置的增量应用程序。(例如,提供游戏关卡)

4.2.5.9 Install Flags 该字段包含影响安装过程的标示。该值以TUint8存储,但是对应以下枚举值: Enum TInstallFlags {

EInstFlagShutdownApps = 1    //在卸载文件时关闭所有应用。

};

4.2.6 SISSupportedLanguages 该字段包含SIS文件支持的语言队列。 SISSupportedLanguages Length Languages SISArray<SISLanguage>

4.2.7 SISSupportedOptions 该字段包含SIS文件支持的选项。在安装过程中询问用户,要求其从选项中选择。 SISSupportedOptions Length Options SISArray<SISSupportedOption>

4.2.7.1 Options 该字段是SIS文件支持的选项队列。SIS文件支持每个选项在队列中占一项,它的size可以是0或更大。

4.2.8 SISSupportedOption 该字段包含SIS文件支持的选项的名字集合。SIS文件中每种支持的语言在队列中占一项,与SISSupportedLanguages字段中定义的顺序一致。 SISSupportedOption Length Names SISArray<SISString>

4.2.9 SISPrerequisites 该字段表示安装SIS文件之前必须满足的前提条件。支持的前提条件类型如下:已安装SIS包的版本。设备必须是SIS文件预安装标识的设备列表中的一种。 SISPrerequisites Length Target Devices SISArray<SISDependency> Dependencies SISArray<SISDependency>

4.2.9.1 目标设备(Target Devices)该字段是一个SISDependency队列,标示这个SIS文件可以安装在哪些设备上。每个设备有一个预安装的SIS文件,标示那个设备。如果目标设备队列包含任何SISDependencies,那么为了安装这个SIS文件到某设备上,至少要满足一种Dependency。如果目标设备队列为空,那么该SIS文件可以安装在任何设备上。

4.2.9.2 依赖关系该字段是一个依赖关系队列,标示为了安装这个SIS,需要依赖的SIS包。可以是0依赖,也可以是多个。为了能够继续安装,所有该SISArray中包含的SIS文件必须已安装在设备上。

4.2.10 SISDependency 该字段标示一个必须已安装在设备上的SIS包。 SISDependency Length UID SISUid Version Range SISVersionRange Dependency Names SISArray<SISString>

4.2.10.1 UID 该字段表示为了满足依赖关系,这个UID对应的SIS包必须已经安装在设备上。

4.2.10.2 版本范围该字段表示需要已经安装在设备上的SIS包的版本范围。该字段是可选的。如果不存在,表示任何已经安装在设备上的该SIS包的版本都可以满足依赖关系。

4.2.10.3 依赖关系名称这个队列包括依赖的SIS文件每种支持的语言的名字列表。它们必须是一个SISString对应一种支持的语音。

4.2.11 SISProperties 该属性块包含SIS包的属性。它们用于旧格式的能力,但是为了避免跟平台安全能力混淆,已经被重命名。 SISProperties Length Properties SISArray<SISProperty>

4.2.12 SISProperty 该字段表示一种属性,形式是SIS包相关的一个key,value对。 SISProperty Length Key TInt32 4 bytes Value TInt32 4 bytes

4.2.13 SISLogo 该字段可能包含一个在安装过程中显示的Logo。 SISLogo Length Logo file SISFileDescription

4.2.13.1 Logo file 该字段包含一个log文件的SISFileDescription,用于在安装开始时显示。SISFileDescription的MIME类型字段用于确定logo是哪种类型。如果SISFileDescription的目标字段不是空字符串,那么这个logo也会被安装到设备上。 SISFileDescription Length Target SISString MIME Type SISString Capabilities SISCapabilities Hash SISHash Operation TUint32 4 bytes Operation Options TUint32 4 bytes Length TUint64 8 bytes Uncompressed Length TUint64 8 bytes File Index TUint32 4 bytes

4.2.14.1 Target 该字段表示安装文件到什么位置。它只用于指定实际copy文件到设备什么路径下。它可能是空字符串,表示该文件不被安装。例如当你想运行某文件,或显示为log,而不是安装它到设备上。

4.2.14.2 MIME Type 该字段表示文件描述的MIME类型。用于以MIME类型运行某文件,也包括在安装过程中显示一个图片时需要确定图片解码器的类型。

4.2.14.3 能力可选字段。仅当SISFileDescription指向一个可运行文件时才使用。该字段包含它描述的可运行程序的能力。

4.2.14.4 Hash 该字段包含未压缩的文件数据的散列。

4.2.14.5 Operation 该字段标识在安装过程中如何处理该文件。 Enum TSISFileOperation { EOpInstall = 1, //安装文件 EOpRun = 2, //运行文件 EOpText = 4, //显示文本文件 EOpNull = 8, //文件不显示,但是卸载时删除 };

4.2.14.6 操作选项表示安装过程中哪个选项适合该文件的操作。该操作决定哪个选项是有效的。

4.2.14.6.1 EOpInstall的有效选项 Enum TSISFileOperationOption {

EInstVerifyOnRestore = 1<<15; //修复时验证

}; 用于安全备份和还原,标示该文件安装后不被写入,所以它的内容跟它被安装时保持一致。在从一个备份还原文件时检查Hash来验证。

4.2.14.6.2 EOpRun的有效选项 Enum TInstFileRunOption { EInstFileRunOptionInstall = 1<<1; //安装时运行 EInstFileRunOptionUninstall = 1<<2, //卸载时运行 EInstFileRunOptionByMimeType = 1<<3, //使用MIME类型运行 EInstFileRunOptionWaitEnd = 1<<4, //继续安装前等待结束 EInstFileRunOptionSendEnd = 1<<5, //安装(卸载)结束后中止 }; EInstFileRunOptionInstall 安装时运行,如果目标字段有效,该文件安装到目标路径,否则该文件不被拷贝到设备上。 EInstFileRunOptionUninstall 卸载时运行。目标字段必须有效,因为安装程序会拷贝该文件到设备上以便卸载时运行它。 EInstFileRunOptionByMimeType 在安装或卸载过程中,以MIME类型运行该文件。如果没设置该选项,那么该文件以可执行类型运行。 EInstFileRunOptionWaitEnd 安装程序等待该文件运行结束再继续安装过程。安装程序会实现一个超时机制来确保万一有恶意程序或残缺程序运行,永远不结束,从而影响了其他程序调用安装程序(只能重启手机)。如果没设置该选项,安装程序不等待该应用运行结束就继续后续安装过程。如果设置了EInstFileRunOptionSendEnd,就一定不能设置该选项。 EInstFileRunOptionSendEnd 安装程序结束时,如果该程序尚未结束,则中止该程序的运行。如果设置了EInstFileRunOptionWaitEnd,就一定不能设置该选项。

4.2.14.6.3 EOpText的有效选项 Enum TInstTextOption { EInstFileTextIOptionContinue = 1<<9, //继续按钮 EInstFileTextIOptionSkipIfNo = 1<<10, //Yes/No - 如果用户选择No,进行下一个文件 EInstFileTextIOptionAbortIfNo = 1<<11, //Yes/No - 如果用户选择No,取消安装 EInstFileTextIOptionExitIfNo = 1<<12, //Yes/No - 如果用户选择No,卸载 }; EInstFileTextIOptionContinue 安装程序显示文字和1个按钮,对话框退出后继续安装。 EInstFileTextIOptionSkipIfNo 安装程序显示文字和2个按钮,一个yes一个on,如果选择no,安装程序跳过当前处理的文件,否则照常进行。 EInstFileTextIOptionAbortIfNo 安装程序显示文字和2个按钮,一个yes一个on,如果选择no,安装程序中止。否则照常继续安装。安装程序显示一个对话框提示安装被中止。 EInstFileTextIOptionExitIfNo 安装程序显示文字和2个按钮,一个yes一个on,如果选择no,安装程序中止。否则照常继续安装。该选项与EInstFileTextIOptionAbortIfNo唯一的区别是安装程序不会显示安装被中止的对话框。

4.2.14.7 Length SIS文件本身的SISFileDescription的经过压缩的文件数据的长度。

4.2.14.8 Uncompressed Length SIS文件本身的SISFileDescription的未压缩的文件数据的长度。是解压缩之后的长度。

4.2.14.9 File Index SISFileData字段,包含SISDataUnit的DataUnits字段的实际文件数据的索引。。

4.2.15 SISCapabilities SIS文件包含的可执行程序的能力。 SISCapabilities Length Capabilities Variable Length

4.2.15.1 Capabilities 用bit位来标识可执行程序的能力。该字段变长,但是长度总是4字节的倍数。是SISField中的唯一字段,因此有一个在Header中给定的SISField的长度。最低位标识可执行程序能力对应TCapability枚举值的0,第二低位对应capability 1。 以此类推。

4.2.16 SISHash 标识一种散列。 SISHash Length Hash Algorithm TUint32 4 bytes Hash Data SISBlob

4.2.16.1 Hash Algorithm 目前支持的散列算法: Enum TSISHashAlgorithm {

ESISHashAlgSHA1 = 1 //SHA-1 散列算法

};

4.2.16.2 Hash Data 包含SISBlob字段的散列数据。长度取决于采用的散列算法。

4.3 签名新SIS格式(区别于Symbian 2nd的旧SIS格式)被设计成支持使用多项证书链进行签名。每个链也支持多次签名,每种签名可用不同的算法。软件安装程序只需要判断其中一种签名是否有效。

图3 - SIS文件中的签名和证书链的分布示意图

4.3.1 SISSignatureCertificateChain 包含用于签署的签名和使签署有效的证书链。 SISSignatureCertificateChain Length Signatures SISArray<SISSignature> Certificate Chain SISCertificateChain

4.3.1.1 签名包含签名队列。

4.3.1.2 证书链包含用于验证签名的证书链。

4.3.2 SISCertificateChain 包含ASN.1编码的X509证书链格式的证书数据。 SISCertificateChain Length Certificate Data SISBlob

4.3.3 SISSignature 包含签名和用于生成签名的散列算法标识符。 SISSignature Length Signature Algorithm SISSignatureAlgorithm Signature Data SISBlob

4.3.3.1 签名算法包含用于签署的算法,和用于散列数据的算法,以使签名有效。

4.3.3.2 签名数据包含签名文件的数据,SISBlob格式。

4.3.4 SISSignatureAlgorithm 签名和生成签名的散列算法的细节。 SISSignatureAlgorithm Length Algorithm Identifier SISString

4.3.4.1 Algorithm Identifier 用'.'分隔的字符串,代表算法的类型。目前支持的算法是: "1.2.840.113549.1.1.5" - SHA-1 with RSA签名 "1.2.840.10040.4.3" - SHA-1 with DSA签名

4.4 表达式 SIS文件是由PKG生成(一种文本格式的包描述)。该描述支持一种简单格式的判断,使用if,then,else来判断哪些文件要被安装。它以以下字段编码到SIS包中。

4.4.1 SISIf 代表if条件判断。 SISIf Length Expression SISExpression Install Block SISInstallBlock Else ifs SISArray<SISElseIf>

4.4.1.1 Expression 安装过程中需要判断的表达式

4.4.1.2 安装块包含当判断为true时需要递归处理的块。

4.4.1.3 Else ifs 如果表达式判断为false,则按顺序判断每个else字段。如果一个表达式判断为true,那么相应的安装块被执行,没有其他else会再被检查。这个字段可以为0,或者多个。

MakeSIS可以在包里模拟一个else条件,通过添加一个永远判断为true的else字段。

4.4.2 SISElseIf SISElseIf Length Expression SISExpression Install Block SISInstallBlock

4.4.3 SISInstallBlock 包含SIS包中需要被安装的文件列表。嵌入式SIS文件列表,SISIf的列表。每个队列可以是0,也可以是多个。 SISInstallBlock Length Files SISArray<SISFileDescription> Embedded SIS Files SISArray<SISController> If blocks SISArray<SISIf>

4.4.3.1 文件需要处理的文件列表。最常见的操作是执行安装这些文件,但是根据选项,它们可能显示或运行,更多信息见SISFileDescription。该字段可以是0或多个。

4.4.3.2 嵌入式SIS文件 SIS文件的元数据中标识的嵌入式SIS文件列表。该字段可以是0或多个。

4.4.3.3 If 块包含SISIf字段的列表。安装程序将检查这些块中的每项,如果true就执行。该字段可以是0或多个。

4.4.4 SISExpression 表达式被分为很多部分,整个表达式是SISExpression字段的树状结构。 SISExpression Length Operator TUint32 4 bytes Integer Value TInt32 4 bytes String Value SISString Left Expression SISExpression Right Expression SISExpression

4.4.4.1 运算符 Enum TOperator { //位运算符 EBinOpEqual = 1, //equal to EBinOpNotEqual, //not equal to EBinOpGreaterThan, //greater than EBinOpLessThan, //Less than EBinOpGreaterOrEqual. //greater than or equal to EBinOpLessOrEqual, //less than or equal to

//逻辑运算符 ELogOpAnd, //逻辑与 ELogOpOr, //逻辑或

//一元运算符 EUnaryOpNot, //NOT() - 逻辑非

//函数 EFuncExists, //EXISTS() - 检查文件是否存在 EFuncAppProperties, //APPPROP() - 查询应用程序属性 EFuncDevProperties, //PACKAGE() - 查询一个已安装的包

//基元 EPrimTypeString, //该表达式表示一个字符串值 EPrimTypeOption, //该表达式是一个选项,用整型表示 EPrimTypeVariable, //该表达式是一个变量 用整型表示 EPrimTypeNumber //该表达式表示一个数值 };

4.4.4.1.1 函数描述 EXIST(String1) (EFuncExists) 该函数入参是String类型,表示一个文件名。在安装过程中,如果该文件在设备上存在,那么该函数返回ETure,否则返回EFalse。如果使用EFuncExists运算法,则SISExpression字段包含一个SISString字段包含安装时要检查的文件名。

APPPROP(expression1, expression2) (EFuncAppProperties)该函数查询一个已安装的SIS文件的属性。 属性是key,value对。第一个参数是已安装SIS文件,或者当前正在被安装的SIS文件的UID。第二个参数是key,value对中的key。该函数返回key对应的value,如果key没找到或者表达式判断不是一个整型值,则返回0。SIS中的key必须是唯一的,这样避免找到多个value。

如果使用EFuncAppProperties,则SISExpression将包含Left,Right SISExpression。 Left字段对应第一个参数,Right字段对应第二个参数。

PACKAGE(expression1) (EFuncDevProperties)该函数查询一个安装包是否已安装在设备上。整型入参是需要查找的pUID。如果找到就返回'1',否则返回0。

如果使用EFuncDevProperties, 则使用Left Expression。

4.4.4.1.2 Variables SIS文件格式支持使用变量创建表达式。大部分变量跟设备属性相关,可以通过HAL::Get()查询。其他支持的变量是“语言”,由用户在安装过程中选择语言。“远程安装”。更多见附录B。变量以以下枚举的整型保存。 Enum TVariableIndex { //0-0x1000保留给HALData值,见附录B 允许的值 EVarLanguage = 0x1001, EVarRemoteInstall = 0x1002 };

4.4.4.2 整型值有效类型是EPrimTypeNumber, EPrimTypeVariable, EPrimTypeOption。

4.4.4.3 字符串型值该字段可选。用于EPrimTypeString, EFuncExists。

4.4.4.4 左表达式可选。用于EBinOpEqual, EBinOpNotEqual, EBinOpGreaterThan, EBinOpLessThan, EBinOpLessOrEqual, EBinOpGreaterOrEqual, 或逻辑运算符ELogOpAnd, ELogOpOr, 或函数运算符eFuncAppProperties, EFuncDevProperties.

4.4.4.5 右表达式可选。用于除了EPrimTypeString, EPrimTypeOption, EPrimTypeVariable, 或EPrimTypeNumber 或函数EFuncExists。

4.5 SIS文件数据这部分包括安装过程中需要用到的实际文件数据。它由一个Data Units队列组成。每个Data Units包含在一个SISController中。如果有嵌入式SIS,那这里可能就不止有一个Data Unit。每个SISController有一个字段包含SISData字段中的Data Units的索引。它包含了SISController要安装的文件。这使得添加和删除嵌入式SIS非常容易。

图4 - 包含嵌入式SIS文件的SIS文件格式示意图

4.5.1 SISData SISData Length Data Units SISArray<SISDataUnit> 一个SISController有一个Data Unit。可能有多个SISController和Data Unit。

4.5.2 SISDataUnit SISDataUnit Length File Data SISArray<SISFileData> 可能经过压缩的SISFileData字段队列。每个可能被安装的文件在队列中占一项。

4.5.3 SISFileData 包含实际的文件数据,可能经过压缩。 SISFileData Length File Data SISCompressed<Raw File Data>


附录A - ESISFieldType值 Invalid SISField 0 SISString 1 SISArray 2 SISCompressed 3 SISVersion 4 SISVersionRange 5 SISDate 6 SISTime 7 SISDateTime 8 SISUid 9 Unused 10 SISLanguage 11 SISContents 12 SISController 13 SISInfo 14 SISSupportedLanguages 15 SISSupportedOptions 16 SISPrerequisites 17 SISDependency 18 SISProperties 19 SISProperty 20 SISSignatures 21 SISCertificateChain 22 SISLogo 23 SISFileDescription 24 SISHash 25 SISIf 26 SISElseIf 27 SISInstallBlock 28 SISExpression 29 SISData0 30 SISDataUnit 31 SISFileData 32 SISSupportedOption 33 SISControllerChecksum 34 SISDataChecksum 35 SISSignature 36 SISBlob 37 SISSignatureAlgorithm 38 SISSignatureCertificateChain 39 SISDataIndex 40 SISCapabilities 41

附录B - 变量名 SIS和包文件格式运行内建复杂的表达式来决定在安装过程中哪些文件被拷贝到设备上。安装程序会在安装过程中设置这些值。以下是提供的可以在设备上获取信息的变量。每一个都对应HALData::Get()的不同属性的返回值。变量名(在.pkg文件中定义的关键字) 用于HALData::Get()的属性 (C++语言) Manufacturer HALData::EManufacturer ManufacturerHardwareRev HALData::EManufacturerHardwareRev ManufacturerSoftwareRev HALData::EManufacturerSoftwareRev ManufacturerSoftwareBuild HALData::EManufacturerSoftwareBuild Model HALData::EModel MachineUid HALData::EMachineUid DeviceFamily HALData::EDeviceFamily DeviceFamilyRev HALData::EDeviceFamilyRev CPU HALData::ECPU CPUArch HALData::ECPUArch CPUABI HALData::ECPUABI CPUSpeed HALData::ECPUSpeed SystemTickPeriod HALData::ESystemTickPeriod MemoryRAM HALData::EMemoryRAM MemoryRAMFree HALData::EMemoryRAMFree MemoryROM HALData::EMemoryROM MemoryPageSize HALData::EMemoryPageSize PowerBackup HALData::EPowerBackup Keyboard HALData::EKeyboard KeyboardDeviceKeys HALData::EKeyboardDeviceKeys KeyboardAppKeys HALData::EKeyboardAppKeys KeyboardClick HALData::EKeyboardClick KeyboardClickVolumeMax HALData::EKeyboardClickVolumeMax DisplayXPixels HALData::EDisplayXPixels DisplayYPixels HALData::EDisplayXPixels DisplayXTwips HALData::EDisplayXTwips DisplayYTwips HALData::EDisplayYTwips DisplayColors HALData::EDisplayColors DisplayContrastMax HALData::EDisplayContrastMax Backlight HALData::EBacklight Pen HALData::EPen PenX HALData::EPenX PenY HALData::EPenY PenDisplayOn HALData::EPenDisplayOn PenClick HALData::EPenClick PenClickVolumeMax HALData::EPenClickVolumeMax Mouse HALData::EMouse MouseX HALData::EMouseX MouseY HALData::EMouseY MouseButtons HALData::EMouseButtons CaseSwitch HALData::ECaseSwitch LEDs HALData::ELEDs IntegratedPhone HALData::EIntegratedPhone DisplayBrightness HALData::EDisplayBrightness DisplayBrightnessMax HALData::EDisplayBrightnessMax KeyboardBacklightState HALData::EKeyboardBacklightState AccessoryPower HALData::EAccessoryPower NumHalAttributes HALData::ENumHalAttributes FPHardware HALData::EFPHardwareFloatingPoint

以下增加的变量提供了关于用户在安装过程中选择的信息。变量名 描述语言 这个变量将设置成用户选择的语言。整型值对应TLanguage枚举值。选项N (N是SIS文件中从1到选项总数的数值 ) SIS文件中每个不同选项有一个值,选中是1,否则是0。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值