【问题标题】:Runtime introspection of linked SWC using ActionScript 3.0 + Flash/Flex使用 ActionScript 3.0 + Flash/Flex 链接 SWC 的运行时自省
【发布时间】:2011-04-21 13:37:03
【问题描述】:

哇,我在 Stack Overflow 上的第一篇文章。我“到达”了吗?

好的,这是一个奇怪的问题。我正在尝试确定是否有某种编程方式可以在运行时自省链接的 SWC 中的类。

为了提供更多背景信息(也许有一种完全不同的方式来做这件事),我正在考虑一个字体嵌入的通用框架。目前,要嵌入字体(使用链接的 SWC,而不是 [embed] 元标记),您需要使用 Flash IDE 将字体嵌入到您的 SWC 中,然后您需要在您的代码(可能由其他人创建,使用不同的 IDE - 例如 FlashDevelop)。

现在,如果可以在运行时自省 SWC 并迭代它公开的类,理论上可以通过编程方式实例化/注册这些字体,而不必(在编译时)知道这些字体可能是什么。

因此问题是:是否有人知道在运行时将 SWC 作为实体访问并内省其暴露的类的任何方法?


顺便说一句,这种事情的基本原理是对设计和应用程序逻辑职责的清晰分离的简单愿望。设计师可以轻松嵌入字体、作者和 SWC,并编辑相应的外部 CSS 文件。指望他们更新代码中对类的硬引用,或者指望客户端在编译和发布作业后不会改变他们对字体使用的想法,这要危险得多。

【问题讨论】:

  • describeType() 在运行时适用于各种对象,并且易于解析。但是,我似乎找不到包含由编译的 SWC 公开的类和属性的顶级对象。我想我需要了解 SWC 类的加载范围。
  • 我从 Senocular 和其他人那里得到的信息似乎表明,自 FP10 起,SWC 中的类尚未公开。

标签: flash actionscript-3 introspection swc embedded-fonts


【解决方案1】:

您可以将文件作为二进制文件加载(或者如果它是主文件,则使用阶段的 LoaderInfo 的字节属性),查看 ABC 数据的“标签”,解析它,然后查找您需要的数据.虽然很麻烦。

有诸如字体标签之类的东西。 DefineFont2(标签类型 48)包含 FontID 和 FontName,DefineFontName(标签类型 88)还包含 FontID 和 FontName。也许这就是您需要的数据。如果是这样,那么即使是最大的文件也可以快速浏览。

您可以在此处阅读 .swf 文件格式规范:http://www.adobe.com/devnet/swf.html

【讨论】:

  • 是的,事实证明,在 Adob​​e 支持某种 getDefninitions() 方法之前,这可能是唯一的解决方案。有几个人已经这样做了,尽管 AFAICT 他们并没有按类型过滤。 bytearray.org/?p=175 (SWFExplorer)、etcs.ru/pre/ClassExplorer (ClassExplorer),然后是奇怪的 etcs.ru/pre/FontLoaderDemo/srcview (FontLoader),它在 SWF 的 textFields 中查找嵌入的字体,然后使用 byteArray 为该字体创建一个 Class。
  • 我还掌握了 SWF 技术规范和 AVM2 规范,并且能够确定标签类型。但老实说,即使仔细研究了 SWFExplorer 和 ClassExplorer 的代码,我也无法真正弄清楚如何修改或创建一个可以根据标签类型进行过滤的解析器。
  • 好吧,如果您能确定标签类型,那么您就成功了一半。过程是这样的。读取标签类型,如果不是您要查找的类型,则读取当前标签的长度(检查 swf 规范中的标签类型,了解读取长标签和短标签长度的区别)。跳过该字节数并重新开始。如果它是您要查找的标签,则使用 swf 规范。并通读字节,直到获得所需的信息。
  • 须知:UI8 = byte (readUnsignedByte()), UI16 = short (readUnsignedShort()), UI32 = Int (readUnsignedInt()), UI8[FontNameLen] 是一个 UTF-8 字符串与普通的 ByteArray UTF-8 字符串略有不同,因为长度前缀是一个字节,而不是短,因此使用 readUTF() 不起作用,请改用 readUTFBytes(length)。
  • 另外,一些代码可能很方便,我相信我们可以解决它。
【解决方案2】:

你应该看看 FLexSpy (fxspy) http://code.google.com/p/fxspy/

还有一些其他的也会有所帮助:

KapInspect:http://lab.kapit.fr/display/kapinspect/Kap+Inspect

DeMonster 调试器:http://demonsterdebugger.com/

【讨论】:

  • 感谢您的回复。不幸的是,这些都是在已编译(并且可能正在执行)的目标代码上运行的外部程序。我正在寻找一种(可能是本机)方法来在运行时内省 SWC,使用与 SWC 已编译到的相同代码库。
猜你喜欢
  • 2011-07-03
  • 2010-12-06
  • 2010-09-12
  • 2010-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
相关资源
最近更新 更多