跳到主内容

Adobe Flex 与 SWF 编译信息

“Adobe Flex 3.1”是播放器版本吗?顺着 ProductInfo 留下的出厂条,看看这只 SWF 是怎么编出来的。

Flash 保存计划 · 最近整理于 2026年7月30日

本文目录 · 9 节
  1. Adobe Flex 是什么
  2. ProductInfo 标签
  3. Macromedia Flex for J2EE
  4. Macromedia Flex for .NET
  5. 从服务器产品到独立 SDK
  6. Flex 的版本号很容易串台
  7. 怎样读“Adobe Flex 3.1”
  8. 顺手拆开两个相近的名字
  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,里面有框架、mxmlccompc、调试器和其他命令行工具。

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 / 编译器版本 框架、mxmlccompc 等工具链 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 里找到了可读取的 ProductInfoproduct_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。

相关词条

这些资料从哪来

  1. Adobe SWF File Format Specification, Version 19
  2. Macromedia Flex 1.5 Installation Instructions
  3. Adobe Flex 2 Installation (2.0.1 Update)
  4. Adobe Flex Builder 3 Release Notes
  5. Apache Flex:Project History
  6. Apache Flex:Versioning
  7. Apache Flex SDK:Adobe-era ProductInfo source
  8. Apache Flex SDK:ProductInfo construction in SimpleMovie
  9. Apache Flex SDK:ProductInfo binary encoder
  10. Apache Flex SDK:rename Adobe Flex to Apache Flex in SWF metadata
  11. Ruffle:ProductInfo type and documentation status
  12. Ruffle:ProductInfo reader