参阅:http://hi.baidu.com/lozu/blog/item/16787fad1541410e4a36d626.html
原理:类A 被类B引用 也被C引用
那么实际上 会在B中装载一份类A
在C中也装载一份类A
这样公共引用的类A 会被大量的复制到使用它的类中。
无形中,增加了文件的大小。
为了给swf瘦身。我们使用RSL。RSL是 Runtime Shared Library的简称。
步骤:建立类库 Lib 》
生成配套的swf 》 新建空的as项目 ,设置编译参数引入Lib ,发布出useLib.swf
新项目使用
1:建立一个NaikingDll 类库项目。
建立一些类如:com.naiking.ntil.NaikingHello
2 {
3 public class NaikingHello
4 {
5 public function NaikingHello()
6 {
7 }
8 public static function hello(_name:String):String
9 {
10 return("Hello "+_name);
11 }
12 }
13 }
选择:项目--构建项目。
这时FlashBuilder会构建出一个新生成的NaikingDll.swc文件
2:生成配套的swf
建立一个新的actionscript项目NaikingSwf
设置编译参数为-include-libraries ../NaikingDll/bin
这样就把swc里的类都引入进来了。
发布出一个swf:NaikingSwf.swf
查看这个swf ,会发现里面有了NaikingDll.swc里的代码
PS:可以导入多个需要的swc库,从项目--属性里添加
并在 输出文件夹:浏览到 新建项目的bin,这样可以把每个swc 都会导出 对应的多个swf
3:新项目使用这种RSL
所需要的是NaikingDll.swc 和 NaikingSwf.swf
这样做是不是重复了?swc 和 swf 里都是相同的代码。
swc是以引用库方式引入到项目中,并没有嵌入到项目,
链接进来的原因是方便写代码的时候,方便调用那些dll里的类。
发布出的Client.swf运行的时候,是找不到swc的(swc并没有被嵌入进Client.swf)
swf是实际Client.swf运行时靠加载后,读取其内部的类的。
具体做法:
引用所有使用的swc:使用项目--属性--库路径导入
===========================================
所有的类库swc和对应的swf ,都生成后,
新建一个自己的项目(flex ,as)都可以,设置swc的引用,在项目--属性--库路径导入
bin目录有对应的swf文件
使用,随便创建自己的类,这些类都引用了那些swc里的类。
PS:项目的主类不可以使用,尽管你可以import.....发现这些类。
swc实际是通过加载swf们后,才可以用。
新工程的类
{
import com.naiking.core.NaikingHello;
import flash.display.Sprite;
import flash.text.TextField;
public class Facade extends Sprite
{
public function Facade()
{
var txt:TextField=new TextField();
txt.text=NaikingHello.hello("naiking");
addChild(txt);
}
}
}
主类:
{
var loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoader);
loader.load(new URLRequest("UsingDll.swf"),
new LoaderContext(false, ApplicationDomain.currentDomain));
}
private function onLoader(event:Event):void
{
addChild(new Facade());
}
}