我正在调查Flex应用程序的问题,该应用程序试图从意外的URL下载(至少)一个Flex框架RSL。我无法重现这个问题,但我对mxmlc
构建配置中RSL规范的某些方面也有些不确定。
考虑到所有这些,能够检查列出RSL依赖关系的SWF文件以确切了解存在哪些依赖关系以及与之关联的URL将是有帮助的。
有没有这样做的方法?我已经尝试了Adobe的SWF调查员,但我没有看到任何明显的地方出现这种依赖关系。 (我猜它们是由mxmlc
生成的代码处理的,而不是Flash Player本身生成的代码,因此它们不会作为SWF的属性列出?)
该应用程序是针对Flex 4.6,FWIW构建的。
答案 0 :(得分:1)
我没有找到一个以自动方式执行此操作的工具,但我发现通过研究SWF的反汇编版本(使用Adobe SWF Investigator tool提供)来查找信息非常容易。< / p>
为此,将指定RSL依赖关系的SWF加载到SWF调查器中,然后在“SWF反汇编程序”选项卡上查看反汇编代码(最简单的方法是使用“打开文本视图...”按钮弹出外部编辑器)。
RSL依赖项在SWF的info()
函数的定义中指定,该块以这样的结尾开头:
function info():Object /* disp_id=0 method_id=57 nameIndex = 75 */
跨域RSL依赖项列在cdRsls
属性中,其他属性列在rsls
属性中。这些列表中填充了许多RSLData
个对象,很容易看到RSLData构造函数的参数被压入堆栈。例如,以下部分添加了两个可能的URL来检索Flex 4.6“框架”库:
13 findpropstrict mx.core::RSLData //nameIndex = 6
15 pushstring "http://fpdownload.adobe.com/pub/swz/flex/4.6.0.23201/framework_4.6.0.23201.swz"
18 pushstring "http://fpdownload.adobe.com/pub/swz/crossdomain.xml"
21 pushstring "abd49354324081cebb8f60184cf5fee81f0f9298e64dbec968c96d68fe16c437"
24 pushstring "SHA-256"
27 pushtrue
28 pushtrue
29 pushstring "default"
31 constructprop mx.core::RSLData (7) //nameIndex = 6
34 findpropstrict mx.core::RSLData //nameIndex = 6
36 pushstring "framework_4.6.0.23201.swz"
39 pushstring ""
41 pushstring "abd49354324081cebb8f60184cf5fee81f0f9298e64dbec968c96d68fe16c437"
44 pushstring "SHA-256"
47 pushtrue
48 pushtrue
49 pushstring "default"
51 constructprop mx.core::RSLData (7) //nameIndex = 6
54 newarray [2]
底部的newarray [2]
行似乎表示这些代表同一文件的两个可能位置(即后备网址)。如果提供了单个URL,则会创建一个RSLData对象和一个newarray [1]
行。
此代码对应于Flex SDK捆绑的标准flex-config.xml文件中的以下定义:
<!-- Framework SWC -->
<runtime-shared-library-path>
<path-element>libs/framework.swc</path-element>
<rsl-url>http://fpdownload.adobe.com/pub/swz/flex/4.6.0.23201/framework_4.6.0.23201.swz</rsl-url>
<policy-file-url>http://fpdownload.adobe.com/pub/swz/crossdomain.xml</policy-file-url>
<rsl-url>framework_4.6.0.23201.swz</rsl-url>
<policy-file-url></policy-file-url>
</runtime-shared-library-path>
最后,作为参考,这里是RSLData类的构造函数的签名,以查看值对应的参数:
public function RSLData(rslURL:String = null,
policyFileURL:String = null,
digest:String = null,
hashType:String = null,
isSigned:Boolean = false,
verifyDigest:Boolean = false,
applicationDomainTarget:String = "default")