在2010年11月28日,我在盛大举办的WeDoSwf会议上,我做了一个演讲,主题就是关于Swf的文件格式和Abc文件的混淆。
最近一个多月的时间里面,各种零零总总的事情特别多,一直没有时间把这个东西整理好放到博客中。
首先呢,把我的演讲的视频的ppt放上来:
视频:
http://v.ku6.com/show/MwjMgfhEgUFoiZhx.html
PPT:
http://www.slideshare.net/swfsh/swfabc
然后呢,经过我们的努力,我们已经将这个东西做成了一个产品,有兴趣的朋友可以去我们的公司主页上下载试用:
http://www.orandea.com/product?lang=cn
回到正题。在上一篇博客中,我已经说明了为什么需要对Swf文件进行加密,那接下来说说Swf文件和Swf内嵌的Abc文件的文件格式:
Swf文件格式
Swf文件格式呢,是Flash Player所使用的文件格式。Swf文件格式具有一下几个特点:
- 基于Tag的流媒体技术
- 内建压缩支持
这两个技术,尤其是第一个技术对于Flash的发展起到了至关重要的作用。
基于Tag的流媒体技术
Swf文件是由文件头和一系列的Tag组成的,下面这张图很好的说明了Flash的文件结构:
我们可以将Swf文件看成一个串流,然后顺序的从头读到尾来进行播放。
那么有那些种类的Tag呢?
这里说几个经典的:
- SetBackgroundColor
这个顾名思义就是设定swf的背景颜色的,我们在编译Flash的时候,设定的背景颜色最终就会生成这个Tag
- ShowFrame
接触Flash比较早的朋友应该都知道,在很久很久以前(我是慢羊羊村长),网络上的大部分Flash是可以一边下载一边播放的,这在当初56kbps的小猫时代可谓是惊天地泣鬼神的功能啊,当时互联网上涌现出了一大批的优秀的Flash动画作品;哎呀,扯远了,回来回来。说说ShowFrame的用途吧:在Flash里面,你可以通过其他的Tag定义位图,定义图形,定义补间动画,然后再放到舞台上去,而这个ShowFrame的作用就是把这一帧的画面显示出来,意义重大吧:)
- DoAbc
我们都知道,从Flash 9开始,Flash引入了Avm2虚拟机、Abc文件格式和AS3语言,大大提高了Flash中脚本的执行效率。所以Flash9应该算是划时代的一个版本啊。DoAbc类型的Tag的作用就是把Abc文件嵌入到Flash中
我们先来用Swfspy看看,我们的Swf文件到底包含些什么东西:
具体Tag的定义,大家可以参考一下参考文件中的“swf_file_format_spec_v10.pdf”。
内建压缩支持
从Flash6开始Swf文件格式开始支持压缩功能,主要的压缩算法采用的是zlib中的deflate算法。
通过Swf文件的第一个字节我们就可以分辨出这是压缩的Swf文件还是平铺的Swf文件。
第一个字节是Signature byte,如果是'F'表示该Swf文件没有压缩过,如果是'C'表示该Swf文件采用了deflate算法压缩。
这里需要注意的是,Swf文件的压缩从容是从SWF File Header的第9个字节开始的,也就是从FrameSize字段开始,就全是压缩的内容了。
这里同时给大家提供一个建议就是,对于纯位图的资源文件,建议不要采用压缩的文件。因为本身所有的位图数据不是采用JPEG格式压缩的就是采用zlib格式压缩的,如果再采用压缩格式的Swf,那就会导致用户的Flash Player需要解码两次才能访问图片数据。
Abc文件格式
Adobe在设计Avm2和Abc文件格式的时候,大量参考了Java的设计。Abc文件格式几乎是Java中的class文件格式的翻版。
此外Adobe在Swf文件格式和Abc文件格式使用了大量的相似但是不同的基本数据格式,最典型的例子就是可变长无符号整形的存储,在Swf文件格式中是U30格式,最多使用4个字节,但是到了Abc文件里面就变成了AbcU30,最多使用5个字节。给开发工作带来了很多麻烦。
Abc文件格式是一种结构化的文件格式,主要由以下几个部分组成:
- 版本号
Abc文件格式的版本号,现在只有一种可能,就是16.20
- 常量池
常量池是Flash为了减小Swf的体积,加快Swf的运行速度设计的一个基础设施,主要包括了“整形常量”、“无符号整形常量”、“双精度浮点常量”、“字符串常量”、“命名空间常量”、“命名空间集常量”、“Multiname常量”,非常多,但是对于咱们程序员而言并不复杂。
- 元数据
主要是各种类、方法、函数、常量、属性等等等等的声明信息
- 方法体
方法具体包含的的指令都在这个部分保存。
Abc文件格式的具体内容,限于篇幅就放到下篇文章里面吧!
参考资料
- swf_file_format_spec_v10.pdf
http://www.adobe.com/content/dam/Adobe/en/devnet/swf/pdf/swf_file_format_spec_v10.pdf
- avm2_overview.pdf
http://www.adobe.com/content/dam/Adobe/en/devnet/actionscript/articles/avm2overview.pdf