flash的动态加载技术
这里所说的动态加载技术, 主要是指代码模块(可以是swc也可以是swf)的动态加载。即主swf在运行的时候, 可以根据需要动态加载所需的代码模块。
为了讨论方便, 下面所说的代码模块都用swc表示,用以与主swf的区分。 因为swc实际是swf + xml + 文件夹的一个压缩包, 所以动态加载swc比动态加载swf只多了一个步骤, 即解压的过程。
这里有一个常识, 如果是在fb中或其他as开发环境中开发, 一个主swf工程如果想引用一个swc库, 那么必须在主swf工程中引用swc库本身或者直接包含swc所对应的工程,而这种引用都有两种方式:
Merged into code,即把所需的swc中的代码在编译时编译到主swf里。
External, 不会把所需的swc中的代码在编译时编译到主swf里。
动态加载技术则需要采用External这种方式引用swc, 这里引用只是告诉编译器可以找到所用到的代码(类), 但是不会把实际的代码编译到swf中, 所以如果在运行swf时, 如果不在合适的时机加载的swc, 就会报找不到某个类的运行时错误。错误信息类似于:
VerifyError: Error #1014: 无法找到类 test.swc::BaseEntity。
假设模块间的引用如下图:

其中模块间的虚线代表外部引用, 实线代表嵌入式引用。
BaseEntity是定义在ExternalSwc中的一个类, Entity继承于BaseEntity, EntityProxy引用到BaseEntity, 后两者可以根据需要定义在Client或者EmbededSwc中。
这里提及的对象间的引用, 比如EntityProxy引用到BaseEntity, 主要是指下述三种情况:
1、BaseEntity作为EntityProxy的成员变量。
2、BaseEntity作为EntityProxy的成员函数的参数。
3、BaseEntity在EntityProxy的成员函数中作为局部变量。
对于BaseEntity定义在ExternalSwc中的类, 在Client和EmbededSwc中只能发生第3种引用方式, 否则会报错。
对于Entity这种直接继承与BaseEntity的类, 且是定义在Client或者EmbededSwc中。如果在Client中被引用到, 那么无论Entity是位于Client还是位于EmbededSwc中(也就是最终Client中会包含Entity的代码), 都会报如下类似错误:
VerifyError: Error #1014: 无法找到类 Entity。
原因在于虽然Client包含Entity的代码, 却没有包含Entity的基类代码, 而flash player在运行Client的时候首先会对Client的代码做初步的验证。
对于EntityProxy这种引用到BaseEntity的类, 如果在Client中被引用到, 那么它是位于Client还是位于EmbededSwc中稍微有点区别。
如果是位于Client中, 则EntityProxy只能发生第3种引用方式, 否则会报错。
如果是位于EmbededSwc中, 则可以发生上述任意一种引用方式。
为什么有上述区别, 原因尚不清楚, 难道这时候flash player不是把编译好的Client和EmbededSwc的代码看作一个整体。
flash的动态加载技术的更多相关文章
- 插件化开发—动态加载技术加载已安装和未安装的apk
首先引入一个概念,动态加载技术是什么?为什么要引入动态加载?它有什么好处呢?首先要明白这几个问题,我们先从 应用程序入手,大家都知道在Android App中,一个应用程序dex文件的方法数最大不能超 ...
- 【转】Android类动态加载技术
http://www.blogjava.net/zh-weir/archive/2011/10/29/362294.html Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的 ...
- Android动态加载技术初探
一.前言: 现在,已经有实力强大的公司用这个技术开发应用了,比如淘宝,大众点评,百度地图等,之所以采用这个技术,实际上,就是方便更新功能,当然,前提是新旧功能的接口一致,不然会报Not Found等错 ...
- classLoader动态加载技术
//加载器,apkPath为包含dex文件的.apk或jar路径,dexPath是优化后的dex文件路径,第三个表示libraryPath表示Native库的路径,最后是父类加载器 DexClassL ...
- 【Android编程实战】源码级免杀_Dex动态加载技术_Metasploit安卓载荷傀儡机代码复现
/文章作者:MG193.7 CNBLOG博客ID:ALDYS4 QQ:3496925334/ 在读者阅读本文章前,建议先阅读笔者之前写的一篇对安卓载荷的分析文章 [逆向&编程实战]Metasp ...
- Android动态加载技术(插件化技术)
No1: 插件化技术的好处: 1)减轻应用的内存和CPU占用 2)实现热插拔,即在不发布新版本的情况下更新某些模块 No2: 插件化方案必须要解决三个基础性问题:资源访问.Activity生命周期的管 ...
- js 页面图片等元素在普通元素中滚动动态加载技术
/*! * 2012-01-13 v1.1 偏移值计算修改 position → offset * 2012-09-25 v1.2 增加滚动容器参数, 回调参数 * 2015-11-17 v1.3 只 ...
- Android 插件技术:动态加载dex技术初探
1.Android动态加载dex技术初探 http://blog.csdn.net/u013478336/article/details/50734108 Android使用Dalvik虚拟机加载可执 ...
- liteos动态加载(十三)
1. 概述 1.1 基本概念 动态加载是一种程序加载技术. 静态链接是在链接阶段将程序各模块文件链接成一个完整的可执行文件,运行时作为整体一次性加载进内存.动态加载允许用户将程序各模块编译成独立的文件 ...
随机推荐
- jq验证码换一换
<!DOCTYPE html><html><head> <meta charset="utf-8"> <meta http-e ...
- iOS一些系统事件的生命周期
1.- (void)applicationWillResignActive:(UIApplication *)application 说明:当应用程序将要入非活动状态执行,在此期间,应用程序不接收消息 ...
- kubernetes 1.3 的安装和集群环境部署
简介: Docker:是一个开源的应用容器引擎,可以为应用创建一个轻量级的.可移植的.自给自足的容器. Kubernetes:由Google开源的Docker容器集群管理系统,为容器化的应用提供资源调 ...
- bbs网站 models
bbs网站 models #!/usr/bin/env python #_*_coding:utf-8_*_ from django.db import models from django.cont ...
- This application is modifying the autolayout engine from a background threa-线程错误
警告提示:This application is modifying the autolayout engine from a background thread, which can lead to ...
- 微信端应用 ionic实现texarea 自适应高度
最近公司项目,做微信端用到texarea 需要实现自适应高度的功能 当然自适应高度的方法很多网上找一大片,最直接的方式就是在使用到texarea的controller中添加js代码事件来实现,这中方式 ...
- MFC通过ODBC方式连接mysql
一. 要安装mysql-connector-odbc驱动 二. 配置数据源 电脑的控制面板-管理工具-数据源ODBC-系统DSN-添加-选择刚刚安装的mysql odbc Driver 参考 http ...
- Together
- Elasticsearch(入门篇)——Query DSL与查询行为
ES提供了丰富多彩的查询接口,可以满足各种各样的查询要求.更多内容请参考:ELK修炼之道 Query DSL结构化查询 Query DSL是一个Java开源框架用于构建类型安全的SQL查询语句.采用A ...
- 《Node.js开发指南》的少许坑儿~
由于express升级到3.0,造成这本书看起来more and more蛋疼.记录少许坑儿,方便后来人. 一.node.js在windows下的安装 书中在两处介绍了两种方式,其实现在的node.j ...