2011年7月22日星期五

老乔所最痛恨的东西——Flash .swf播放器上了AppStore

众所周知,苹果的老乔一贯讨厌Flash。这应该和从Macromedia时代开始,Mac OS X的Flash插件一贯优化差,极端情况下可以让Mac笔记本仅仅开浏览器的情况下,电池待机时间减少一半以上有关。
基于这个理由,加上Flash并非为触摸屏设计的东西,从2007年iPhone初代开始,苹果一贯不准备把Flash引入到iOS上,App Store早期甚至明令禁止任何通过模拟/虚拟手段而非原生的应用。当然这个禁令取消了,Adobe让Flash Builder能做出半原生的iOS App,后来也曾经出现过不少能通过在线代理之类间接支持Flash的app,包括很多浏览器类app,但是它们几乎无一例外只对Flash视频网站有较好的支持,而对Flash游戏、Flash PV和广告(啪!)支持不好。
真正能运行.swf文件的iPhone app,之前越狱界曾经出现过移植开源Flash播放器gnash的。然而,有这样一个真正的SWF player,这两个月出现在了App Store上。

它的名字当然就是——中国卡通。
这个应用的iTunes介绍如下:

(PC/Mac请打开http://itunes.apple.com/jp/app/id432260573?mt=8)
其中并未提到任何和Flash有关的介绍。然而,通过简单的研究,很容易就能发现它其实是播放SWF的。

根据这堆破图,应该能够判断这个程序是从其网站(具体地址需要抓包才知道,反正那个游戏列表是http://m.jqbar.com/。)下载某些东西到本地,然后运行的玩艺。
此App有个把网站上的那些可以播放的小游戏或者PV之类下载到本地的选项。

随便点了一个纵版、一个横版的小游戏和一个PV(某神曲的),下载到本地。
由于这个Touch四代乃越狱机,直接用iFunBox打开这个App的安装目录。Documents下没有内容,再找了一下,发现存在本地的东西在/var/mobile/Applications/安装目录/Library/Documentation/local/下,里面赫然放着三个swf文件。果断拷出来丢进浏览器,结果神了,真是Flash的swf文件无疑。

至于那个cfg文件呢?打开来看,有两种。游戏的是一种,动画的是另一种。
它们都是UTF-8编码的类XML文件,其共有结构如下:
<?version="1.0" encoding="UTF-8" ?>
<!DOCTYPE config SYSTEM "config.dtd">
<!-- 文件类型声明 -->
<defines>
<file_info content_ID="1b97fb3e99db3bc7" content_level="10" zcontent_type="media" mobile_operate_type="Touch_Nopad" />
<!-- 文件ID(貌似是某种UUID?),其他的除了游戏多一个hotkey_for_zoom属性外没有 -->
<operate_define />
<display_define screen_direction="Horizon" zoom_size="Fit" quality="high" />
<!-- 显示定义,横屏竖屏(Horizon和Vertical),放大,Flash的质量之类 -->
<sound_define />
</defines>
<!-- 定义部分 -->

对于游戏,operate_define、sound_define里还包了东西,而且还有另外结构。。
 <operate_define default_mouse_move_pace="." default_long_press_lock_time="." touchsize="." >
<mouse_normal_define name="模拟鼠标" />
<mouse_table_define name="模拟菜单" />
<!-- 和鼠标模拟触屏相关的参数,默认移动速度,长按锁定,触摸屏感应大小什么的 -->
<touch_define>
<touch_map button_name="left" org="2" button_hor_pos="10" button_ver_pos="20" button_map_to="37" />
<touch_map button_name="down" org="2" button_hor_pos="70" button_ver_pos="20" button_map_to="40" />
<touch_map button_name="right" org="2" button_hor_pos="130" button_ver_pos="20" button_map_to="39" />
<touch_map button_name="up" org="2" button_hor_pos="70" button_ver_pos="80" button_map_to="38" />
<touch_map button_name="a" org="3" button_hor_pos="20" button_ver_pos="20" button_map_to="17" />
<touch_map button_name="b" org="3" button_hor_pos="20" button_ver_pos="80" button_map_to="32" />
</touch_define>、
<!-- 虚拟键盘,button_name不言而喻,org貌似是组别(?),button_hor_pos和button_ver_pos是按钮的位置(相对于屏幕左下角),
button_map_to是虚拟键盘对应的编码,除开方向键外其它都是对应的ASCII码 -->
</operate_define>
<sound_define mute="false" volume="4" sound_device="Speaker" /> <!--声音音量 -->
<network_define score_type="var" score_var_name="_level0.score" submit_url="http://m.jqbar.com/submit.aspx" autotag="296@297" />
<!--似乎是和在线提交得分相关的,那个score_var_name应该是指AS本地存储的变量名吧 -->
<txt_define> 里面是一个UTF-8的HTML... </txt_define> <!-- 貌似是游戏的帮助信息 -->

下一步得试试看能不能把自己的Flash SWF文件放进这个app让它播放。首先试试IOSYS的几个东方Flash PV,直接套用那个神曲MV的.cfg,也不管那个content_ID了,直接丢进去。出人意料的是,居然直接播放成功。貌似此app目前并不会真正验证那个ID。
至于播放速度,那就很雷了,目测就10-13fps的样子(很可能是touch4本身就不够快的原因)。顺便说说,国内的Flash PV很少像IOSYS的那样,用25fps以上的时基做的,长期以来都是如此,不知为何。



至于游戏,就得根据游戏本身的键位自己修改虚拟键盘touch_define(其实应该还有重力感应的define,我没下重力感应的游戏来研究)。结果测试了三个Flash游戏,DOOM Flash版,两个打飞机,分别用雷电2.cfg、陨石大战.cfg修改,丢进去。
结果,DOOM Flash版无法运行(一直显示正在载入),其他两个游戏运行极为缓慢。然而最要命的是,这个虚拟键盘不支持通过多点触摸实现多个键同时按下,导致这两个STG基本没法玩。。。。


当然这个app最大的问题是,不对应视网膜显示和iPad屏幕。Flash是矢量格式,在高分屏上变成马赛克是非常丑陋的。据某有iPad2的测试,iPad2上这个app运行swf的速度可以比Touch4快1倍。。。
这个App的纪念意义是很大的,毕竟App Store之前没出现过能完全离线播放本地Swf文件的任何App。但是由于该App可以从外部下载任意数据并运行,潜在地违反了开发者协议的某条款。如果有高人分析出了其Flash解释器的漏洞,攻击该app使用的网页,插入恶意Swf,那么就囧了。因此我看苹果一旦再次审核这个,很可能有下架的危险。

进一步从那个http://m.jqbar.com/入手,发现这个jqbar和这个应用开发者之间的关系有待研究,因为jqbar自己也有类似的可以播放Flash的应用——请参考http://www.jqbar.com/Download/。由于日本的Store这个没上架,我只能下左边那个破解专用版来一试。



果然,无论是界面,还是功能来看,甚至是.app的文件名,本地文件与Cache存放的目录,这个集趣游戏都和中国卡通几乎一样,只不过界面控件是原生的。再仔细看那个“大款工作室”,找找他们发布的其他App你肯定会发现它其实就是这个集趣,或者百玩的马甲!有此等神技术的公司,为何还闷着做这种偷偷摸摸,应用介绍里连Flash的大名都不敢提起的app呢?从他们的官方博客来看,他们的程序是今年才开始上架的,貌似性能上还有很多问题。再看他们的论坛,还可以发现早就被广告机所完全占领了。。。
我没仔细看中国卡通和这个集趣吧的.app里面的可执行文件和资源文件,搜索字串adobe找到的都是用ImageReady/PS做PNG写入的metadata,搜shockwave找到的只有一个mimetype。倒是里面那个D.dat,是libmad GPL MP3解码库的一个头文件,又看不到有libmad的动态库,看来这App可能还涉及到违反GPL;fonts.fnt貌似是个结构不明的字体文件;还有几个dat貌似是MP3解码IDCT用的查找表。
估计腾讯什么的可以考虑把这帮人收编过去,好好研究下他们怎么在iOS平台直接播放swf的。我看,很可能还是用了类似Gnash的开源库实现的,除非开发者有这工夫把执行文件里有关Adobe的字串全部干掉或者干脆把可执行文件加壳(PS:AppStore app的可执行文件加了壳,苹果会怎么去审核它呢?)

本来还录了这个中国卡通app的运行视频,可惜在国内网站上。这里干脆从略了。