• 转 swf swc swz RSLs ant


    [备忘] swf swc swz RSLs ant

     

    [本文原创链接: http://www.smithfox.com/?e=135 , 转载请保留此声明, 谢谢 ]

    只要做Flex项目, 终有一天你要涉及到RSLs, 要和swf, swc, swz文件打交道. 希望这篇文章能帮助大家理清楚这些文件的用途和关系.

    RSLs全称是Runtime Shared Libraries, 可见RSL就是"库", 它是Adobe flash平台的二进制模块化技术, 目的类似于动态链接库(DLL, so), 但实现技术的细节是完全不一样. 本文先介绍几种文件格式, 再介绍用Ant编译swc,swf文件时的要点和一些注意事项.

    1. swz 文件

    从flash player 9.0.115以后, adobe支持的一种RSLs,  称之为 "signed framework RSLs".

    Adobe解释: 签名的RSLs(也就是swz) 会优先被缓存在Flash Player中, 而且可以被任何应用程序访问, 即使是和原先程序不同的domain也能. swz文件只需下载一次, 就算是浏览器缓存被清除, swz也可以从disk重新读出. 而未签名的RSLs(以swf以形式存在) 只能缓存在各个浏览器中, 如果浏览器的清除了缓存, 就需要再次下载, 而且被限定为只能在Application同一domain内被访问.

    可以这样简单理解: 一台PC, 只需要下载一次swz文件, 就可以为本机的所有浏览器, 以及AIR, 共享. 为了做到这一点, adobe将swz文件cache在PC上的固定的目录下, 你可以去看看

    MAC:  ~/Library/Caches/Adobe/Flash Player/AssetCache

    Windows 7: C:\Users\${username}\AppData\Roaming\Adobe\Flash Player\AssetCache\

    Windows XP: C:\Documents and Settings\${username}\Application Data\Adobe\Flash Player\AssetCache\.

    只有Adobe公司自己才能创建swz文件, 尽管有人建议也开放给合作的第三方, 但迄今为至还没有.

    swz文件是一种未知加密文件格式, Flash player内部会对swz文件进行签名认证.

    当前只有Flex framework自带的几个库是swz形式, 以Flex SDK 4.1为例, 可以到下面的链接下载:

    http://fpdownload.adobe.com/pub/swz/flex/4.1.0.16076/framework_4.1.0.16076.swz
    http://fpdownload.adobe.com/pub/swz/flex/4.1.0.16076/textLayout_1.1.0.604.swz
    http://fpdownload.adobe.com/pub/swz/flex/4.1.0.16076/osmf_flex.4.0.0.13495.swz
    http://fpdownload.adobe.com/pub/swz/flex/4.1.0.16076/rpc_4.1.0.16076.swz
    http://fpdownload.adobe.com/pub/swz/flex/4.1.0.16076/spark_4.1.0.16076.swz
    http://fpdownload.adobe.com/pub/swz/flex/4.1.0.16076/sparkskins_4.1.0.16076.swz
    http://fpdownload.adobe.com/pub/swz/flex/4.1.0.16076/datavisualization_4.1.0.16076.swz

    (上面的链接信息可以在 D:\flex\flex_sdk_4.1.0.16076_mpl\frameworks\flex-config.xml中看到, 这个文件非常重要, 建议花点时间仔细看看这个文件)

    值得注意的是 D:\flex\flex_sdk_4.1.0.16076_mpl\frameworks\libs\  目录下有好几个swc(不是swz)文件, 和上面的链接对应, 你就会发现  playerglobal.swc,flex.swc,utilites.swc,flash-integration.swc 这几个文件Adobe并没有做成 swz库.

    在引用swz文件时, 需要注意顺序, 否则会有莫名的错误, 上面links的顺序已经是调整过的了.

    对framework的library, 建议尽量用swz, 而不是swf,  同时为了避免在运行时到上述的adobe官方网站去下载(有时会很慢), 你可以将这些swz文件先下载到自己的http server,  通过改变编译参数 runtime-shared-library-path 设定将swz rsl-url放在swf rs-url之前,  来调整下载优先级, 比如我的项目的ant脚本中对framework RSL的写法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!--声明将会使用 framework RSL -->
    <runtime-shared-library-path path-element="${FLEX_HOME}/frameworks/libs/framework.swc">
        <!-- framework.swz 文件已经从adobe官方网站下载到自己Server的相对目录 ../frameworkrsls/ 下了
        如果本 swf 文件 url是                      http://www.smithfox.com/app/modules/module1.swf
        那么这个framework.swz在运行时的实际 url 是 http://www.smithfox.com/app/frameworkrsls/framework.swz
        -->
        <url rsl-url="../frameworkrsls/framework.swz"/>
       
        <!-- swz下载的优先级比swf高, 只有上述swz url不存在时, 才会尝试 swf -->
        <url rsl-url="../frameworkrsls/framework.swf"/>
       
        <!-- 如果上面两个都下载不到, 就到adobe官方网站去下载, 为了避免这种情况, 所以将这个url放在最后 -->
                              policy-file-url="http://fpdownload.adobe.com/pub/swz/crossdomain.xml"/>
    </runtime-shared-library-path>

    你还可以参考Adobe官方有关文章: http://livedocs.adobe.com/flex/3/html/help.html?content=rsl_09.html

    2. swc文件

    swc文件和swz,swf最大的区别在于, 它是用在编译期, 而不是运行期. RSLs 指的是swf和swz, swc不算是RSLs, 尽管它和RSLs有间接关系.

    swc文件是一个zip格式的文件, 用7z打开一个swc后, 如下图:

    library.swf 和 catalog.xml名字是固定的, catalog.xml是对library.swf的描述.

    在编译时, swc可以被静态链接, 也可以被动态链接, 这是由编译参数决定的.

    需要对动态链接的情况做一点明: 只有带有摘要信息的swc文件才能被动态链接, 否则运行时会报错, 让你重新编译. swc文件中的catalog.xml中的信息会编译到app swf中, 而app swf运行时会找原swc中的library.swf文件(需要更名), 并且会校验RSL(原library.swf文件)的摘要信息.  下面是catalog.xml中摘要信息的xml片断:

          <digests>
            <digest type="SHA-256" signed="false" value="00fa9d407aa1bb364a369182736c022a372a9f721c7b625e2e93b2e5cda00eb7"   />
          </digests>

    如果你遇到过 "Flex Error #1001: Digest mismatch with RSL ..."之类的错误, 这是因为:运行时的rsl swf不是编译时swc中的libray.swf.

    如果你只拿到一个test.swc文件, 你需要将这个swc中的library.swf用unzip提取出来, 并且更名为test.swf

    大部分同学不用做这个步骤, 是因为Flash Builder已经自动帮我们做过了,  如果你作手动编译, 就需要自己手动做.

    3. swf文件

    swf分为三种: app swf, library swf, module swf.

    app swf是指可以直接在flash player中运行的, 而library swf是指swc文件中的library.swf文件, module swf指Flex Module产生的swf文件.

    4. 有关RSL的编译参数

    mxmlc和compc是Flex SDK自带的编译命令, 可以用下面的形式来查看其自带的帮助:

    #mxmlc -help list advanced details

    #compc -help list advanced details

    compc默认debug是true, 所以当用compc编译时, 最终的release版本需要指定 debug 为 false,

    相反mxmlc默认debug是false.

    默认值还需要考虑{FLEX_HOME}/frameworks/flex_config.xml文件, 这个文件配置了很多的默认值.

    因为很多的编译参数都有别名(alias), 所以在网上查找这些资料时, 为了不至于搞糊涂, 可以对应上面的两个命令的help来看.

    static-link-runtime-shared-libraries:  是否用动态链接

    runtime-shared-library-path: RSL配置, 可以有多个

    external-library-path: 编译时不要将指定的swc中的类带入, 可以指定多个

    optimize: 编译时是否优化

    keep-as3-metadata: 通过指定metadata, 将未指定的metadata的相关代码清除, 以减少size. 可以指定多个

    上面几个参数, 网上有许多资料, 在此就不多说.

    5. 用Ant编译项目

    IT妖怪 的文章 使用RSL发布flex项目需要的build.xml要诀详解, 是比较流行的一篇用中文中介绍Ant编译Flex项目的文章, 我也从这个文章中受益. 不过结合我自己项目, 他文中的Ant, 有几点需要注意:

    1> createRSL这个task, 值得商榷, 出发点是好的: 想最大地优化swc, 但是通过optmize和digest两个命令去重新update原swc文件, 很容易出问题. 我就吃了这个亏!!

    如果swc是自己的子项目, 完全可以在编译swc时, 用optimize, keep-as3-metadata两个参数来一次性达到优化.

    如果swc是第三方的, 可以用ant createRSL中的思路和步骤, 一次性做好优化后的swc, 而不用每次编译都调用createRSL task, 反复 优化这些已经优化后的swc

    createRSL可以改将优化功能去掉, 只做基本的从swc中抽取swf的功能, 做一个 extractRSL task:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    <target name="extractRSL">
        <macrodef name="extract-rsl">
            <attribute name="rsl-dir" />
            <attribute name="swc-dir" />
            <attribute name="swc-name" />
            <sequential>
                <unzip src="@{swc-dir}/@{swc-name}.swc" dest="@{rsl-dir}">
                    <patternset>
                        <include name="library.swf" />
                    </patternset>
                </unzip>
                <move file="@{rsl-dir}/library.swf" tofile="@{rsl-dir}/@{swc-name}.swf" />
            </sequential>
        </macrodef>
     
        <extract-rsl rsl-dir="${BIN_DIR}/rsls" swc-dir="${LIBS_DIR}" swc-name="sparktree" />
        <extract-rsl rsl-dir="${BIN_DIR}/rsls" swc-dir="${LIBS_DIR}" swc-name="SWFAddress" />
        <extract-rsl rsl-dir="${BIN_DIR}/rsls" swc-dir="${LIBS_DIR}" swc-name="flex4_ofc2" />
        <extract-rsl rsl-dir="${BIN_DIR}/rsls" swc-dir="${LIBS_DIR}" swc-name="smf" />
    </target>

    2> runtime-shared-library-path option应该将Server自己的swz url放在最前面, 见文章前面的例子

    3> 根据情况可以再增加 额外的swc 的 external-library-path

    6.  我的项目的例子

    例子不太方便直接放出, 如果有同学想借鉴, 可以email我, 或是在此留言.

    [本文原创链接: http://www.smithfox.com/?e=135 , 转载请保留此声明, 谢谢 ]

    smithfox | Thursday 21 April 2011 at 9:58 pm | | UI                 | Used tags: ant, rsls, swc, swf, swz

    four comments

    zrong

    很详细!
    我最开始用RSL的时候碰到过很多稀奇古怪的问题,现在考虑RSL这个东东,是否真的需要。如果模块化做得够好的话,似乎不需要这个东东了。

    zrong,  (URL) - 06-05-’11 09:20
    Darkness

    您好,我在使用

    Darkness,   - 07-05-’11 23:13
    haroel

    你好,我在毕业设计时碰到一个问题,就是用FB4.5编译生成的一个swf文件就100多KB,放在服务器上,给别人测试时说是访问要很慢,而我自己访问是没问题的,觉得很邪门,看了你这篇文章才知道原来是flashplayer的缓存问题,关于这问题有没有比较好的解决方法,模块化能解决吗?

    haroel,   - 08-05-’11 21:59
    smithfox

    haroel, 总的来说Flex生成的swf就是比较大, FB默认应该是用RSLs的, 所以, 别人第一次访问你的程序时, 会下adobe下载swz文件, 所以比较慢.

    如果别人访问你的Server比较快的话, 你可以将swz文件按文章中的访问放到你的server上.

    如果你很在意用户的第一次访问的体验, 可以不用RSLs, 就用静态编译, 尽管swf会更大一点, 但第一次访问时, 总的下载size反而会更小.

    如果这些方法还不能改善, 你可以看我之前写的一篇文章: http://www.smithfox.com/?e=83http://www.smithfox.com/?e=99

    如果这Preloader还不够, 你就需要考虑用 AS3来写, 而不是Flex.

    smithfox,  (URL) - 09-05-’11 09:37
     
    下篇(转)Flex compc & ant 编译       http://www.cnblogs.com/xbglbc/archive/2012/02/08/2342525.html
  • 相关阅读:
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    Swift
    将Ojective-C代码移植转换为Swift代码
    Swift
    房费制——报表(1)
  • 原文地址:https://www.cnblogs.com/xbglbc/p/2097186.html
Copyright © 2020-2023  润新知