Adobe Flex 与 SWF 编译信息
“Adobe Flex 3.1”是播放器版本吗?顺着 ProductInfo 留下的出厂条,看看这只 SWF 是怎么编出来的。
Flash 保存计划 · 最近整理于 2026年7月30日
本文目录 · 9 节
Adobe Flex 是什么
在作品页看到“Adobe Flex 3.1”,很容易把它当成 Flash Player 或 Flash 制作软件的版本。其实这行字指向另一套工具:Adobe Flex,一套面向富互联网应用的框架和编译工具链。开发者通常用 MXML 描述界面、用 ActionScript 写逻辑,再交给 Flex SDK 中的 mxmlc 等工具编译成 SWF。
历史资料里的“Flex”有时指整个产品家族,有时单指 SDK、框架或编译器。Flex Builder 是基于 Eclipse 的开发环境,Flash Player 则负责运行最后的 SWF。三个名字挨得很近,职责却各不相同。
ProductInfo 标签
作品页之所以能写出编译工具,是因为 Flex 在 SWF 里留下了一张小小的“出厂条”:Tag 41,ProductInfo。Adobe 公开的 SWF 19 文档没有收录它;Ruffle 源码也特意注明,这个标签未被 SWF 19 文档化,是 mxmlc 写进去的。
这张条目不长,标准字段刚好 26 字节。本站为了容忍带尾部数据的变体,会接受不少于 26 字节的标签,并读取开头这组字段。Flex SDK、Ruffle 和本馆提取器对它们的读法一致:
| 字段 | 宽度 | 本馆的处理 |
|---|---|---|
product_id |
32 位 | 保留原值,并把已知的 1、2、3 映射为工具名称 |
edition |
32 位 | 保留为数字 |
major_version |
8 位 | 与次版本合并显示,如 3.1 |
minor_version |
8 位 | 与主版本合并显示 |
build_number |
64 位 | 合并高、低 32 位,保存为 build |
compilation_date |
64 位 | 按 Unix 纪元毫秒转为 UTC 的 RFC 3339 时间,省略毫秒 |
Adobe 时代的链接器会从 Flex 版本常量取主、次版本,从 SDK 构建信息取构建号,再用 Java 的 System.currentTimeMillis() 记下当时的系统时间。edition 通常写成 6,意思是不属于某一版本方案。
所以正常情况下,页面上的日期确实来自编译那一刻。不过它也就到这里为止:机器时钟可能不准,旧标签可能被后续工具原样带过来;它不是首次发布日期,更不是抓取或入馆日期。
产品 ID 映射
本馆沿用 Adobe 时代 Flex SDK 源码里的这组名称:
product_id |
本馆名称 | 这串数字原本指向 |
|---|---|---|
0 |
未命名 | 源码中的 unknown;本馆保留数值,但不显示工具名 |
1 |
Macromedia Flex for J2EE | 早期 Macromedia Flex J2EE 产品线 |
2 |
Macromedia Flex for .NET | 早期 Macromedia Flex .NET 产品线 |
3 |
Adobe Flex | Adobe 时代的 Flex 编译器;后来也继续被 Apache 沿用 |
编号 3 在后来留下了一点历史重叠。Apache Flex 到 2013 年只是把源码里的显示文本从 Adobe Flex 改为 Apache Flex,没有换数字。因此,对大部分 Flash 时代馆藏,3 很自然地读作 Adobe Flex;若文件已经进入 Apache 时代,就要顺手再看版本、构建号和日期。本馆目前仍把它显示为“Adobe Flex”。
同一份源码还给 edition 列了 Developer、Full Commercial、Non-Commercial、Educational、NFR、Trial 和 None(0–6)。链接器平时多半写 6。这更像一段遗留下来的产品信息,本馆照录数字,不拿它追认一份十几年前的许可证。
Macromedia Flex for J2EE
最初的 Flex 和后来下载一个 SDK 就能编译的样子很不一样。Macromedia Flex 1.5 的安装文档把它写成部署到 Java 应用服务器的 J2EE Web 应用,随附 flex.war、示例和分析器等 WAR 文件;这是从 Flex 1.0 延续下来的服务器模式。
于是,早期 SWF 里的 product_id = 1 很有年代感。它告诉我们生成器来自哪条产品线,却不会把原站服务器一并封存在文件里。一个当年动态编译的 SWF,完全可能被缓存、复制,离开服务器独自流传很多年。
Macromedia Flex for .NET
product_id = 2 在源码中叫 Macromedia Flex for .NET。它和 J2EE 标识放在同一组早期枚举里,留下了当时按后端平台区分产品线的痕迹。
先别被“.NET”三个字带跑:浏览器端产物仍是 SWF,不会因此变成 .NET 字节码。它也没有记录归档时 ASP.NET 服务是否还在线。
从服务器产品到独立 SDK
Flex 1.x 的编译和服务器部署绑得很紧。到了 Adobe Flex 2,Flex Builder、Flex Data Services、Flex SDK 和 Flash Player 已经可以分别安装。Flex 2 SDK 本身就是一个可单独使用的 ZIP,里面有框架、mxmlc、compc、调试器和其他命令行工具。
Flex 3 延续了这种分工。Flex Builder 3 是 Eclipse IDE,不同更新还会附带多个 SDK,开发者也可以完全绕过 Builder 使用命令行。这样再回头看 ProductInfo 就清楚了:它更接近实际被调用的编译器,而不是操作界面。
2011 年,Adobe 决定把 Flex 交给 Apache Software Foundation。代码和 mxmlc 等模块在 2012 年陆续捐赠;同年,Flex 成为 Apache 顶级项目,并发布 Apache Flex SDK 4.9。项目换了归属,ProductInfo 里的旧编号却继续留了下来。
Flex 的版本号很容易串台
| 页面或文档中的名称 | 描述对象 | 与“Adobe Flex 3.1”的关系 |
|---|---|---|
| Flex SDK / 编译器版本 | 框架、mxmlc、compc 等工具链 |
ProductInfo 的主 / 次版本最直接指向这一层 |
| Flex Builder 版本 | 基于 Eclipse 的 IDE | IDE 可安装或选择多个 SDK;标签没有记录它 |
| Flash Player 版本 | 在浏览器或独立环境运行 SWF | 由编译目标和实际 API 需求决定,不是 3.1 |
| SWF 文件格式版本 | 文件头第四字节声明的格式规则 | 本馆另显示为“Flash N”;与工具版本是独立字段 |
| Flex 兼容版本 | 框架样式与旧行为兼容目标 | 可由 compatibility-version 调整,也不必等于所用 SDK 的版本 |
Flex 编译器还留了三只独立的旋钮:compatibility-version 模拟旧框架的部分样式与行为,target-player 选择目标 Flash Player,swf-version 决定输出的 SWF 格式号。同一个 SDK 因而能产出不同 Player、不同 SWF 目标;新 SDK 也能披上旧版兼容设置。作品页把工具、文件头、ActionScript 和媒体信息分开列,正是因为它们不能靠一个版本号包办。
怎样读“Adobe Flex 3.1”
回到作品页,这行字其实很朴素:SWF 里找到了可读取的 ProductInfo,product_id 是 3,主、次版本字节是 3 和 1。对照 Adobe 时代的 Flex SDK 源码,它正像是 Flex 3.1 编译器留下的记录。构建号和日期若也对得上,这条线索会更扎实。
但标签里没有 IDE 名称。Flex Builder 能选择不同 SDK,命令行 mxmlc 和自动构建服务器也会写同样的东西。“3.1”也不是 Flash Player 版本,更不是页面另一处的“Flash N”;后者来自 SWF 文件头。主、次版本没有细到补丁,想再往下查就要看构建号。
它毕竟是一段普通标签,不是封条。后处理工具可以保留、复制,甚至改写它。反过来,标签缺席也只是“这份文件里没找到”:它可能被发布流程剥掉,生成器可能根本没写,文件也可能只是 Flex 工程里的中间资源。
顺手拆开两个相近的名字
Adobe Flex 和 Adobe Flash Professional 都能生成 SWF,但工作台完全不同:Flex 围绕 MXML、ActionScript、组件框架和编译器;Flash Professional 更靠近舞台与时间轴。ProductInfo 写着 Flex,就不该把它顺手改叫 Flash Professional。
ProductInfo 也不是 XMP。前者是二进制 Tag 41,XMP 则放在 Metadata Tag 77。两者可以各自出现,也可能留下不同的日期和作者线索,像是从同一只文件里翻出的两份记录。
最后是一个很小但值得记下的实现细节:SWF 构建号原本是 64 位整数,本馆目前会把它转成 JavaScript number。日常见到的 Flex 构建号都远低于安全整数上限;只有人为造得特别大的值,才可能丢掉低位精度。真要做逐字节鉴定,还是回到原始 SWF。
相关词条
这些资料从哪来
- Adobe SWF File Format Specification, Version 19
- Macromedia Flex 1.5 Installation Instructions
- Adobe Flex 2 Installation (2.0.1 Update)
- Adobe Flex Builder 3 Release Notes
- Apache Flex:Project History
- Apache Flex:Versioning
- Apache Flex SDK:Adobe-era ProductInfo source
- Apache Flex SDK:ProductInfo construction in SimpleMovie
- Apache Flex SDK:ProductInfo binary encoder
- Apache Flex SDK:rename Adobe Flex to Apache Flex in SWF metadata
- Ruffle:ProductInfo type and documentation status
- Ruffle:ProductInfo reader