为什么我的标准RSL没有加载?

时间:2011-09-12 02:03:40

标签: actionscript ant flash rsl

我创建了一个模块化应用程序,其中父SWF按需加载了许多其他SWF。为了优化,我创建了一个standard RSL

我已经将公共代码编译成swc,并重新编译应用程序swfs以引用此swc,使用我的build.xml ANT任务中的以下内容(对于我的应用程序中的每个swf):

<static-link-runtime-shared-libraries>false</static-link-runtime-shared-libraries>
<runtime-shared-library-path path-element="${lib.loc}/RSL.swc">
    <url rsl-url="RSL.swf"/>
</runtime-shared-library-path>

我从RSL.swc中提取了RSL.swf并将其放在我的网络服务器上,与应用程序swfs和容器html文件放在同一目录中。

现在,当我加载应用程序时,收到消息:

VerifyError: Error #1014: Class mx.core:BitmapAsset could not be found.

我可以看到这个类包含在RSL.swc / RSL.swf中的类中。

我用fiddler来观察发生了什么,我可以看到我的应用程序swf文件已加载,但没有尝试获取RSL.swf。

设置Application.swf文件以使用RSL后,我原本希望它在初始化之前尝试加载RSL.swf,但这不会发生。任何人都可以建议为什么?

1 个答案:

答案 0 :(得分:0)

来自http://livedocs.adobe.com/flex/3/html/help.html?content=rsl_02.html

“如果基类是Sprite或MovieClip,则不能在仅ActionScript项目中使用RSL .RSL要求应用程序的基类(如Application或SimpleApplication)了解RSL加载。”

由于我的基类是Sprite,我遇到了这个错误。

在我的情况下,最好使用以下步骤将所有必需的类编译到我的Application swf文件中:

  1. 使用compc创建包含我想要包含在我的应用程序swf文件中的文件的SWC
  2. 将mxmlc与指向要包含的SWC文件的include-libraries一起使用。使用link-report
  3. 生成链接文件报告(xml)
  4. 使用指向链接文件报告(xml)的load-externs编译每个额外的子swf - 这将链接到Application.swf的文件排除在编译到每个子swfs
  5. 之外

    要实现第1步:

    <!-- We define the global classes which will be compiled into the parent Application   
         swf, but excluded from the tool swfs. As pure actionscript projects with base 
         class of Sprite can't usually use RSLs, we are forcing these classes to be loaded 
         into the parent application, and excluded from the child applications, allowing an 
         "Rsl-like" optimisation -->
    
    <fileset id="rsl.inclusions" dir="${main.src.loc}">
        <include name="${main.src.loc}/path1/**/*.as"/>
        <include name="${main.src.loc}/path2/**/*.as"/>
        ...
    </fileset> 
    
    <pathconvert property="rsl.classes" pathsep=" " refid="rsl.inclusions">
    <chainedmapper>
        <globmapper from="${main.src.loc}\*" to="*"/>
            <mapper type="package" from="*.as" to="*"/>
    </chainedmapper> 
    </pathconvert>
    
    <!-- Compile SWC -->
    <compc output="${lib.loc}/MySwc.swc" 
           include-classes="${rsl.classes}">
    <static-link-runtime-shared-libraries>true</static-link-runtime-shared-libraries>   
    <source-path path-element="${main.src.loc}"/>
    </compc>
    

    要实现第2步:

    <mxmlc file="${main.src.loc}/pathToApp/Application.as" 
       output="${bin.loc}/Application.swf" 
       debug="${debug}"
       use-network="true"
       link-report="WorkbenchLinkReport.xml"
       fork="true">
        <compiler.source-path path-element="${main.src.loc}" />
    <static-link-runtime-shared-libraries>true</static-link-runtime-shared-libraries>
    <include-libraries dir="${lib.loc}" append="true">
        <include name="MySwc.swc" />
    </include-libraries>
    </mxmlc> 
    

    要实现第3步:

    <mxmlc file="${main.src.loc}/pathToChildSwf1/Child1.as"      
           output="${bin.loc}/Child1.swf" 
           debug="${debug}" 
           load-externs="WorkbenchLinkReport.xml" 
           fork="true">
    <compiler.source-path path-element="${main.src.loc}" />
    <static-link-runtime-shared-libraries>true</static-link-runtime-shared-libraries>
    <compiler.headless-server>true</compiler.headless-server>           
    </mxmlc>
    

    另一个方便的提示:使用fork =“true”可以防止Java VM在内存中耗尽许多swfs。

    希望这有用!