[备忘] 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}AppDataRoamingAdobeFlash PlayerAssetCache Windows XP: C:Documents and Settings${username}Application DataAdobeFlash PlayerAssetCache. 只有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 (上面的链接信息可以在 D:flexflex_sdk_4.1.0.16076_mplframeworksflex-config.xml中看到,这个文件非常重要,建议花点时间仔细看看这个文件) 值得注意的是 D:flexflex_sdk_4.1.0.16076_mplframeworkslibs 目录下有好几个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的写法: <!--声明将会使用 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放在最后 --> <url rsl-url="http://fpdownload.adobe.com/pub/swz/flex/4.1.0.16076/framework_4.1.0.16076.swz" 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> 如果你遇到过 "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: <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,谢谢 ] (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |