1 SWC介绍
swc是将事先做好的公共程序封装到一个包内,提供给其他开发人员使用,类似于JAVA的jar包。通常swc可以封装UI素材、组件或控件、工
具类等。可以用Flash Builder建立一个库项目,生成一个swc包。请参考
swc的链接方式有两种:
1 合并到代码中(静态链接库),将swc编译到swf文件中,swf运行时不需要外部程序包,swf会产生比较大的文件以及更长的下载时间
2 RSL(Runtime Shared Library)。swf文件在运行时才调用swc中的程序,即动态调用,类似于dll技术。使用RSL的应用程序载入时间短且文件比较小,只是在开始需要花点时间下载RSL。RSL的强大体现在多个应用程序共享公共代码时,因为RSL只需要被下载一次,多个应用程序动态链接到相同的RSL,访问其中已经缓存在客户端的资源。
2.RSL简述
RSL分为两种:未签名和签名的。
1 未签名的RSL,比如标准的和跨域的SWF文件,存储在浏览器缓存里(XP系统:C:\Documents and Settings\{username}\Local Settings\Temporary Internet Files)。下图中as3corelib.swf为第三方的一个工具类,采用的是未签名的RSL。
2 签名的RSL,这是经过Adobe签名过的,扩展名为.swz,存储在Flash Player 缓存中。只有Adobe才可对RSL进行签名,以此提高安全防止第三方工具注入攻击及执行代码,目前只有flex的sdk才是签名的RSL。签名的RSL 会优先被缓存在Flash Player中, (XP系统:C:\Documents and Settings\${username}\Application Data\Adobe\Flash Player\AssetCache)而且可以被任何应用程序访问, 即使是和原先程序不同的domain也能.
下图是签名的RSL。
swz文件只需下载一次, 就算是浏览器缓存被清除, swz也可以从disk重新读出. 而未签名的RSLs(以swf以形式存在) 只能缓存在各个浏览器中, 如果浏览器的清除了缓存, 就需要再次下载, 而且被限定为只能在Application同一domain内被访问.
3 如何添加swc包。
直接把swc包复制到flex工程的libs目录下不就ok了吗?
以上做法确实可以引用swc包中的内容了,但是有一点你得注意下:直接复制到libs下的swc链接类型只能是静态链接,不能修改为RSL。
正确的做法是在flex工程上点击右键---》属性---》Flex 构建路径 中选择库路径,点击添加SWC按钮,就可以正确的添加swc文件了,此种做法可以设置swc的链接类型为RSL。
下图中flexlib.swc是通过直接复制到libs下,as3corelib是通过库路径中选择的。
另外,你也可以添加一个flex库项目来添加swc包。但是此种方法并不适用,因为在实际的flex工程中,一般swc库工程,不会让所有flex开发人员下载的。
添加as3corelib.swc后,会在.actionScriptProperties配置文件中添加如下代码:
<libraryPathEntry applicationDomain="default" forceLoad="false" kind="3" linkType="4" path="${FLEX_SWC}/as3corelib.swc" useDefaultLinkType="false">
<crossDomainRsls>
<crossDomainRslEntry autoExtract="true" policyFileUrl="" rslUrl="as3corelib.swf"/>
</crossDomainRsls>
</libraryPathEntry>
从上面的代码中,我使用了路径变量${FLEX_SWC},为什么要适用变量呢?从flex工程整体开发框架来考虑,可以把flex用到的swc包统一管理,放在svn上的一个目录下,A项目的人可以从这个svn地址下载swc包,B项目也可以下载,便于swc版本的统一管理。关于Flex路径变量,请参考 创建Flash Builder构建路径变量。
4 RSL 改进
RSL将 Flex 框架打包到应用程序启动时链接并载入的库中。默认情况下,Flex 4 开启 Flex 框架 RSL,这意味着 Flex 编译器链接到框架 RSL 供 Flex 应用程序使用。
Flex 4.5 发行版为 Flex 中的 RSL 基础结构增加了一些令人兴奋的改进。对于 Flex 4.5 编译器,只有真正依赖于应用程序代码的 RSL 将链接到您的应用程序。例如,这意味着不使用 OSMF 的应用程序不会导致链接和载入 OSMF RSL 的成本。此外,纯 Spark 或纯 MX 项目只会链接它们所对应的特定项目类型所需的组件和架构件。
在上面的工程中,如果我们项目没有用到as3corelib的任何类,那么就不会生成as3corelib.swf文件,客户端也就减少了下载文件的大小。
Flex 4.5 中的模块及其 RSL 链接逻辑也得到了改进(重复加载RSL问题)。模块现在可以理解其父应用程序或兄弟模块何时已载入它所依赖的 RSL 中。在这种情况下,模块将避免所需 RSL 中的重新链接和载入。如果开发人员不希望编译器自行反省并判断依赖性,他们可使用编译器配置选项强制实现某些模块中的链接。为此,Flex 4.5 引入了一种借助于子应用程序和模块的应用程序功能,它可以载入一组所需的 RSL 而不是由主应用程序将它们全部预先载入。
5 总结
1 adobe的rsl固然是好的,但是flex目前也最适合用于公司内部系统,作为互联网项目,swz的版本太多了(adobe的sdk什么时间能稳定下来,直接可以嵌入到flash player中就好了),swz的优势就不能体现出来了。
2 swc对开发人员的技术水平要求比较高,而且swc必须经过严格的测试才能作为公用库。
3 公用组件最好做成rsl形式,例如分页组件。便于以后的维护升级。
4 swc上一定要版本的控制。