http://help.adobe.com/zh_CN/AIR/1.5/devappshtml/WS5b3ccc516d4fbf351e63e3d118666ade46-7fd6.html
使用 AIR Developer Tool (ADT) 可以为基于 SWF 和基于 HTML 的 AIR 应用程序创建 AIR 安装文件。(如果您使用适用于 Dreamweaver® 的 Adobe® AIR® 扩展创建应用程序,则还可以使用“AIR 应用程序和安装程序设置”对话框中的“创建 AIR 文件”命令生成 AIR 包。请参阅使用 AIR Extension for Dreamweaver。)
ADT 是一个可从命令行运行的 Java 程序,也可以是一个生成工具(例如 Ant)。SDK 包含为您执行 Java 程序的命令行脚本。有关配置系统以运行 ADT 工具的信息,请参阅安装 HTML 开发工具。
打包 AIR 安装文件
每个 AIR 应用程序必须至少包含一个应用程序描述符文件和主 SWF 或 HTML 文件。安装的任何其他应用程序资源必须打包在 AIR 文件中。
必须使用数字证书对所有 AIR 安装程序文件签名。AIR 安装程序使用该签名验证应用程序文件自签名之后是否未发生任何更改。可以使用证书颁发机构颁发的代码签名证书,也可以使用自签名证书。由受信任证书颁发机构颁发的证书向应用程序用户提供一定的发行商身份保证。自签名证书无法用于验证发行商身份。此缺点还会削弱未对包进行更改的保证,因为合法安装文件在到达用户之前可能会被伪造安装文件取代)。
使用 ADT -package 命令,一步即可对 AIR 文件进行打包和签名。还可以使用 -prepare 命令创建未签名的中间包,然后在另一步中使用 -sign 命令对中间包签名。
当对安装包签名时,ADT 将自动连接时间戳签发机构服务器以验证时间。时间戳信息包含在 AIR 文件中。您可以在将来任一时间安装包含已经过验证的时间戳的 AIR 文件。如果 ADT 无法连接到时间戳服务器,则取消打包。您可以覆盖时间戳设置选项,但是如果没有时间戳,在对安装文件签名所使用的证书过期后,AIR 应用程序将停止安装。
如果要创建一个包以便更新现有 AIR 应用程序,则必须使用与原始应用程序相同的证书或具有相同标识的证书对此包进行签名。若要具有相同标识,两个证书必须具有相同的识别名称(所有信息字段均匹配),并且根证书必须具有相同的证书链。因此,只要未更改任何标识信息,则可以使用通过证书颁发机构续订的证书。
从 AIR 1.1 起,可以使用 -migrate 命令迁移应用程序,使其使用新证书。迁移证书需要使用新证书和旧证书对 AIR 文件进行签名。通过证书迁移,您可以将自签名证书更改为商用代码签名证书,或者将自签名证书或商用证书更改为其他自签名证书或商用证书。当迁移证书时,现有用户无需在安装现有应用程序的新版本之前卸载该应用程序。默认情况下,迁移签名带有时间戳。
在一个步骤中对 AIR 文件进行打包和签名

adt -package SIGNING_OPTIONS air_file app_xml [file_or_dir | -C dir file_or_dir | -e file dir ...] ...
SIGNING_OPTIONS 该签名选项标识用于对 AIR 文件签名的私钥和证书所在的 keystore。若要使用 ADT 生成的自签名证书对 AIR 应用程序签名,使用的选项包括:
-storetype pkcs12 -keystore certificate.p12
在本例中,certificate.p12 为 keystore 的文件名。(由于未在命令行中提供密码,因此 ADT 提示您提供密码。)ADT 命令行签名选项详细介绍了签名选项。
air_file 创建的 AIR 文件的名称。
app_xml 指向应用程序描述符文件的路径。指定的路径可以是相对于当前目录的相对路径,也可以是绝对路径。(应用程序描述符文件在 AIR 文件中重命名为“application.xml”。)
file_or_dir 要在 AIR 文件中打包的文件和目录。可以指定任意数目的文件和目录,这些文件和目录以空格分隔。如果列出目录,则将该目录中的所有文件和子目录添加到该包中,但隐藏文件除外。(此外,如果指定应用程序描述符文件,则无论该文件是直接指定还是使用通配符或目录扩展指定的,都将忽略该文件,并且不会将其再次添加到包中。)指定的文件和目录必须位于当前目录或其子目录之一。使用 -C 选项更改当前目录。
-C dir 将工作目录更改为 dir 的值,然后处理添加到应用程序包的后续文件和目录。将文件和目录添加到应用程序包的根目录中。–C 选项可以使用任意次,以便包含文件系统多个点的文件。如果为 dir 指定相对路径,该路径则始终从原始工作目录解析。
由于 ADT 处理包包含的文件和目录,因此将存储当前目录和目标文件之间的相对路径。安装包时,这些路径将展开为应用程序目录结构。因此,指定 -C release/bin lib/feature.swf 会将 release/bin/lib/feature.swf 文件放置在根应用程序文件夹的 lib 子目录中。
-e file dir 将指定文件放置到指定包目录中。
ADT 示例
打包当前目录中的特定应用程序文件:
adt –package -storetype pkcs12 -keystore cert.p12 myApp.air myApp.xml myApp.html AIRAliases.js image.gif
打包当前工作目录中的所有文件和子目录:
adt –package -storetype pkcs12 -keystore ../cert.p12 myApp.air myApp.xml .
仅打包主文件和 images 子目录:
adt –package -storetype pkcs12 -keystore cert.p12 myApp.air myApp.xml myApp.html AIRAliases.js images
打包基于 HTML 的应用程序和 HTML、scripts 和 images 子目录中的所有文件:
adt –package -storetype pkcs12 -keystore cert.p12 myApp.air myApp.xml index.html AIRALiases.js html scripts images
打包位于工作目录 (src) 中的 application.xml 文件和主 HTML 文件:
adt –package -storetype pkcs12 -keystore cert.p12 myApp.air src/myApp.xml –C src myApp.html
对生成文件系统的多个位置的资源打包。在本例中,应用程序资源在打包前位于以下文件夹:
/devRoot /myApp /release /bin myApp.xml myApp.html /artwork /myApp /images image-1.png ... image-n.png /libraries /release /libs lib-1.js ... lib-n.js AIRAliases.js
从 /devRoot/myApp 目录运行以下 ADT 命令:
adt –package -storetype pkcs12 -keystore cert.p12 myApp.air release/bin/myApp.xml –C release/bin myApp.swf –C release/bin myApp.html –C ../artwork/myApp images –C ../libraries/release libs
生成以下包结构:
/myAppRoot /META-INF /AIR application.xml hash myApp.swf mimetype /images image-1.png ... image-n.png /libs lib-1.swf ... lib-n.swf AIRAliases.js
/myAppRoot /META-INF /AIR application.xml hash myApp.html mimetype /images image-1.png ... image-n.png /libs lib-1.js ... lib-n.js AIRAliases.js
作为 Java 程序运行 ADT(未设置类路径):
java –jar {AIRSDK}/lib/ADT.jar –package -storetype pkcs12 -keystore cert.p12 myApp.air myApp.xml myApp.swf
java –jar {AIRSDK}/lib/ADT.jar –package -storetype pkcs12 -keystore cert.p12 myApp.air myApp.xml myApp.html AIRAliases.js
作为 Java 程序运行 ADT(将 Java 类路径设置为包含 ADT.jar 包):
java com.adobe.air.ADT –package -storetype pkcs12 -keystore cert.p12 myApp.air myApp.xml myApp.swf
java com.adobe.air.ADT –package -storetype pkcs12 -keystore cert.p12 myApp.air myApp.xml myApp.html AIRAliases.js
ADT 错误消息
下表列出了 ADT 程序可能报告的错误以及可能的原因:
应用程序描述符验证错误
错误代码 | 说明 | 备注 |
---|---|---|
100 | 无法分析应用程序描述符 | 检查应用程序描述符文件中是否有标签未封闭等 XML 语法错误。 |
101 | 缺少命名空间 | 添加缺少的命名空间。 |
102 | 命名空间无效 | 检查命名空间拼写。 |
103 | 意外的元素或属性 | 删除引起错误的元素和属性。描述符文件中不允许使用自定义值。 检查元素和属性名称的拼写。 确保将元素放置在正确的父元素内,且使用属性时对应着正确的元素。 |
104 | 缺少元素或属性 | 添加所需的元素或属性。 |
105 | 元素或属性所含的某个值无效 | 纠正引起错误的值。 |
106 | 窗口属性组合非法 | 如 transparency = true 和 systemChrome = standard 等某些窗口设置不能在一起使用。更改其中某个不兼容的设置。 |
107 | 窗口最小大小大于窗口最大大小 | 更改最小大小或最大大小设置。 |
有关命名空间、元素、属性及其有效值的信息,请参阅设置 AIR 应用程序属性。
错误代码 | 说明 | 备注 |
---|---|---|
200 | 无法打开图标文件 | 检查指定路径是否存在该文件。 使用另一个应用程序确保可以打开该文件。 |
201 | 图标大小错误 | 图标大小(以像素为单位)必须与 XML 标签相匹配。例如,假设有应用程序描述符元素: <image32x32>icon.png</image32x32> icon.png 中的图像必须刚好为 32x32 像素。 |
202 | 图标文件包含的某种图像格式不受支持 | 仅支持 PNG 格式。将应用程序打包之前转换其他格式的图像。 |
错误代码 | 说明 | 备注 |
---|---|---|
300 | 缺少文件,或无法打开文件 | 找不到或无法打开命令行中指定的文件。 |
301 | 缺少或无法打开应用程序描述符文件 | 在指定路径找不到应用程序描述符文件,或无法打开该文件。 |
302 | 包中缺少根内容文件 | 必须向包添加应用程序描述符的 <content> 元素中引用的 SWF 或 HTML 文件(通过将该文件加入 ADT 命令行中列出的文件中)。 |
303 | 包中缺少图标文件 | 必须向包添加应用程序描述符中指定的图标文件,方法是将这些图标加入到 ADT 命令行中列出的文件中。不会自动添加图标文件。 |
304 | 初始窗口内容无效 | 无法将应用程序描述符的 <content> 元素中引用的文件识别为有效的 HTML 或 SWF 文件。 |
305 | 初始窗口内容的 SWF 版本超出命名空间的版本 | 描述符命名空间中指定的 AIR 版本不支持应用程序描述符的 <content> 元素中所引用文件的 SWF 版本。例如,尝试将 SWF10 (Flash Player 10) 文件作为 AIR 1.1 应用程序的初始内容进行打包就会产生这种错误。 |
退出代码 | 说明 | 备注 |
---|---|---|
2 | 用法错误 | 检查命令行参数中是否有错 |
5 | 未知错误 | 此错误表示所发生的情况无法按常见的错误条件作出解释。可能的根源包括 ADT 与 Java 运行时环境之间不兼容、ADT 或 JRE 安装损坏以及 ADT 内有编程错误。 |
6 | 无法写入输出目录 | 确保指定的(或隐含的)输出目录可访问,并且所在驱动器有足够的磁盘空间。 |
7 | 无法访问证书 | 确保正确指定了密钥存储库的路径。 检查能否访问密钥存储库中的证书。可以使用 Java 1.6 Keytool 实用程序帮助排除证书访问权限方面的问题。 |
8 | 证书无效 | 证书文件格式错误、被修改、已到期或被撤消。 |
9 | 无法为 AIR 文件签名 | 验证传递给 ADT 的签名选项。 |
10 | 无法创建时间戳 | ADT 无法与时间戳服务器建立连接。如果通过代理服务器连接到 Internet,则可能需要配置 JRE 的代理服务器设置。 |
11 | 创建证书时出错 | 验证用于创建签名的命令行参数。 |
12 | 输入无效 | 验证命令行中传递给 ADT 的文件路径和其他参数。 |
ADT 命令行签名选项
ADT 使用 Java 加密体系结构 (JCA) 访问对 AIR 应用程序签名所使用的私钥和证书。签名选项标识 keystore 以及该 keystore 中的私钥和证书。
keystore 必须包含私钥和关联的证书链。证书链用于建立应用程序的发行商 ID。如果签名证书链接到某计算机上的受信任证书,则在“AIR 安装”对话框中显示该证书的公共名称作为发行商名称。
ADT 要求证书符合 x509v3 标准 (http://tools.ietf.org/html/rfc3280),并在扩展密钥用法扩展中包含代码签名的相应值。应遵循证书中的约束,并避免使用某些证书对 AIR 应用程序签名。
指定 AIR 签名选项

[-alias aliasName] [-storetype type] [-keystore path] [-storepass password1] [-keypass password2] [-providerName className] [-tsa url]
-alias aliasName — keystore 中的密钥的别名。当 keystore 仅包含一个证书时,则不必指定别名。如果未指定任何别名,ADT 则使用 keystore 中的第一个密钥。
并非所有 keystore 管理应用程序都允许向证书分配别名。例如,当使用 Windows 系统 keystore 时,则使用证书的识别名称作为别名。使用 Java Keytool 实用程序可以列出可用证书以便确定别名。例如,运行以下命令:
keytool -list -storetype Windows-MY
将为证书生成如下输出:
CN=TestingCert,OU=QE,O=Adobe,C=US, PrivateKeyEntry, Certificate fingerprint (MD5): 73:D5:21:E9:8A:28:0A:AB:FD:1D:11:EA:BB:A7:55:88
若要在 ADT 命令行中引用此证书,请将别名设置为:
CN=TestingCert,OU=QE,O=Adobe,C=US
在 Mac OS X 中,Keychain 中的证书别名与在 Keychain Access 应用程序中显示的名称相同。
-storetype type — keystore 类型,由 keystore 实现确定。大多数 Java 安装随附的默认 keystore 实现支持 JKS 和 PKCS12 类型。Java 5.0 包含对 PKCS11 类型和Keychain 类型的支持,前者用于访问硬件标记中的 keystore,后者用于访问 Mac OS X keychain。Java 6.0 包含对 MSCAPI 类型的支持(在 Windows 中)。如果安装和配置了其他 JCA 提供程序,则可能还可以使用其他 keystore 类型。如果未指定任何 keystore 类型,则使用默认 JCA 提供程序的默认类型。
存储类型 | Keystore 格式 | 最低 Java 版本 |
---|---|---|
JKS | Java keystore 文件 (.keystore) | 1.2 |
PKCS12 | PKCS12 文件(.p12 或 .pfx) | 1.4 |
PKCS11 | 硬件标记 | 1.5 |
KeychainStore | Mac OS X Keychain | 1.5 |
Windows-MY 或 Windows-ROOT | MSCAPI | 1.6 |
-keystore path — 基于文件的存储类型的 keystore 文件路径。
-storepass password1 — 访问 keystore 所需的密码。如果未指定,ADT 则提示提供密码。
-keypass password2 — 访问用于对 AIR 应用程序签名的私钥所需的密码。如果未指定,ADT 则提示提供密码。
-providerName className — 指定 keystore 类型的 JCA 提供程序。如果未指定,ADT 则使用该 keystore 类型的默认提供程序。
-tsa url — 指定符合 RFC3161 的时间戳服务器的 URL,以便对数字签名进行时间戳设置。如果未指定任何 URL,则使用 Geotrust 提供的默认时间戳服务器。对 AIR 应用程序签名设置时间戳时,仍可以在签名证书过期之后安装该应用程序,这是因为时间戳验证该证书在签名时是否有效。
如果 ADT 无法连接到时间戳服务器,则取消签名,并且不会生成任何包。指定 -tsa none 可以禁用时间戳。但是,对于打包的没有时间戳的 AIR 应用程序,该应用程序将在签名证书过期后停止安装。
签名选项示例
使用 .p12 文件签名:
-storetype pkcs12 -keystore cert.p12
使用默认 Java keystore 签名:
-alias AIRcert -storetype jks
使用特定 Java keystore 签名:
-alias AIRcert -storetype jks -keystore certStore.keystore
使用 Mac OS X keychain 签名:
-alias AIRcert -storetype KeychainStore -providerName Apple
使用 Windows 系统 keystore 签名:
-alias cn=AIRCert -storeype Windows-MY
使用硬件标签签名(请参考标记制造商提供的 Java 配置相关说明,以便使用该标记并获取正确的 providerName 值):
-alias AIRCert -storetype pkcs11 -providerName tokenProviderName
在不嵌入时间戳的情况下签名:
-storetype pkcs12 -keystore cert.p12 -tsa none
使用 ADT 创建未签名的 AIR 中间文件
使用 -prepare 命令可创建未签名的 AIR 中间文件。必须使用 ADT -sign 命令对 AIR 中间文件签名,才能生成有效的 AIR 安装文件。
-prepare 命令采用的标签和参数与 -package 命令相同(但签名选项除外)。唯一区别在于前者的输出文件未签名。生成的中间文件的文件扩展名为:airi。
若要对 AIR 中间文件签名,请使用 ADT -sign 命令。(请参阅使用 ADT 对 AIR 中间文件进行签名。)
使用 ADT 对 AIR 中间文件进行签名
若要用 ADT 对 AIR 中间文件签名,请使用 -sign 命令。sign 命令仅对 AIR 中间文件(扩展名为 airi)起作用。不能对 AIR 文件进行两次签名。
若要创建 AIR 中间文件,请使用 adt -prepare 命令。(请参阅使用 ADT 创建未签名的 AIR 中间文件。)
对 AIRI 文件签名

adt -sign SIGNING_OPTIONSairi_fileair_file
SIGNING_OPTIONS 该签名选项标识用于对 AIR 文件签名的私钥和证书。ADT 命令行签名选项介绍了这些选项。
airi_file 要进行签名的未签名 AIR 中间文件的路径。
air_file 要创建的 AIR 文件的名称。
ADT 示例
adt –sign -storetype pkcs12 -keystore cert.p12 unsignedMyApp.airi myApp.air
有关详细信息,请参阅对 AIR 文件进行数字签名。