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 基本概念 动态加载是一种程序加载技术. 静态链接是在链接阶段将程序各模块文件链接成一个完整的可执行文件,运行时作为整体一次性加载进内存.动态加载允许用户将程序各模块编译成独立的文件 ...
随机推荐
- android如何获取到启动类的包和类路径
ArrayList<String> list = new ArrayList<String>(); private List<ResolveInfo> mApps; ...
- asp.net如何在前台利用jquery Ajax调用后台方法
一 :最近因为帮同事开发项目使用到了asp.net,而我又想实现Ajax异步请求....从网上查询了一下资料之后,原来在asp.net中利用Ajax调用后台方法同样很简单,为了便于自己以后查看,特将此 ...
- JAVASE02-Unit01: API文档 、 字符串基本操作
API文档 . 字符串基本操作 文档注释 package day01; /** * 文档注释只能定义在三个地方: * 类,方法,常量 * * 文档注释是功能注释,用来说明功能作用 * 在类上使用的目的 ...
- JSP 运行
Tomcat 上运行 JSP 应用程序 完成一些包装工作后,才能在 Tomcat 上运行 index.jsp 程序.通常需要按照以下步骤操作: 创建 JSP 应用程序.如果只使用一个页面,则称它为 i ...
- RFC-2068-http
本文档规定了互联网社区的标准组协议,并需要讨论和建议以便更加完善.请参考 “互联网官方协议标准”(STD 1)来了解本协议的标准化状态.本协议不限流传发布. 版权声明 Copyright (C) Th ...
- 对java多线程的认识
多线程的概念:多线程是一种机制,它允许在程序中并发的执行多个线程,且每个线程间相互独立. 实现多线程的两种方式: 1.继承java.lang.Thread类,并且重写它的run方法,将线程的执行主体放 ...
- WinForm中跨线程操作控件
在WinForm编程时会遇到通过后台线程操作界面的情况,直接在后台线程执行的方法中直接操作控件会报错,这时候就要使用跨线程方式间接操作控件.下面是两种实现方式. 1.采用定义delegate的方式 ...
- 【转】PowerShell入门(一):PowerShell能干什么?
转至:http://www.cnblogs.com/ceachy/archive/2013/01/30/WhatCanPowerShellDo.html PowerShell能干什么呢?就像序言中提到 ...
- [Effective JavaScript 笔记]第63条:当心丢弃错误
管理异步编程的一个是错误处理.同步代码中只要使用try语句块包装一段代码很容易一下子处理所有的错误. try{ f(); g(); h(); } catch(e){ //这里用来下得出现的错误 } t ...
- 反编译ILSpy 无法显式调用运算符或访问器 错误处理方法 转
反汇编一个dll类库,导出的项目会报出很多bug,其中主要的就是“无法显式调用运算符或访问器”这个错误,看了一下,发现问题是在调用属性的时候,都 变成了方法,例如:pivotPoint.set_X(0 ...