OperaMini 资源格式介绍及汉化定制完全教程[一]
[size=3][color=#000000][font=Times New Roman]作者 : Heart[/font][/color][/size][font=Times New Roman][size=3][color=#000000]版权所有: Minisoyo([url=http://forum.minisoyo.com]http://forum.minisoyo.com[/url])[/color][/size][/font]
[font=Times New Roman][size=3][color=#000000]转载请注明上面的信息 [/color][/size][/font]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[size=3][color=#000000][font=Times New Roman][/font][/color][/size]
[size=3][color=#000000][font=Times New Roman]Opera Mini ([/font][font=宋体]以下简称[/font][font=Times New Roman]OPM)[/font][font=宋体]是著名的浏览器厂商[/font][font=Times New Roman]Opera[/font][font=宋体]发布的手机浏览器。具体历史以及恩怨情仇我就不多介绍了。身边有很多高人都是研究这个的。从技术的角度上,[/font][font=Times New Roman]OPM[/font][font=宋体]中包含的技术以及专利可谓登峰造极,非我等开发小辈能企及的。今天斗胆分析一下[/font][font=Times New Roman]OPM[/font][font=宋体]的资源格式,并借此开发了一个基于[/font][font=Times New Roman]HALO[/font][font=宋体]的[/font][font=Times New Roman]OPM[/font][font=宋体]汉化定制工具,方便国内的[/font][font=Times New Roman]OPM[/font][font=宋体]的用户和爱好者。顺便广告一下[/font][font=Times New Roman]Minisoyo[/font][font=宋体]开发的海啸[/font][font=Times New Roman]Wap[/font][font=宋体]浏览器,配合[/font][font=Times New Roman]OPM[/font][font=宋体]的[/font][font=Times New Roman]Web[/font][font=宋体]浏览基本上通吃所有页面了[/font][font=Times New Roman]~[/font][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[size=3][color=#000000][font=宋体]因为本人研究[/font][font=Times New Roman]OPM[/font][font=宋体]时间很短,所以对之前的版本([/font][font=Times New Roman]OPM2,OPM3[/font][font=宋体])等都分不太清,所以我挑选的是最近发布的俄版[/font][font=Times New Roman]205[/font][font=宋体]。[/font][font=Times New Roman][[/font][font=宋体]在[/font][font=Times New Roman]release[/font][font=宋体]出的小版本之间不存在大的差异,也就是说资源格式基本类似,但大版本之间就不太一样。所以会存在以前用于汉化[/font][font=Times New Roman]OPM[/font][font=宋体]的方法放在新版上就失败了[/font][font=Times New Roman]][/font][font=宋体],闲话不多说,我尽量用简明易懂的语言描述,如果有高手对我的措辞有异议,欢迎指正。[/font][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[size=3][color=darkred][b][font=Times New Roman]1 [/font][font=宋体]格式介绍:[/font][/b][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[size=3][color=#000000][font=Times New Roman]1.1 [/font][font=宋体]背景介绍[/font][/color][/size]
[font=宋体][size=3][color=#000000]我们知道一个软件的构成通常包括:[color=red]逻辑,图片,数据[/color]。[/color][/size][/font]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[size=3][color=#000000][font=宋体]所谓[color=red]逻辑[/color]就好比你按键了,该给你显示啥,不显示啥,这就是逻辑,通常都是由源代码完成的。这些都会包含在发布的软件版本中,就是我们打开[/font][font=Times New Roman]Jar[/font][font=宋体]包看到的[/font][font=Times New Roman]class[/font][font=宋体]。[/font][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[font=宋体][size=3][color=#000000][color=red]图片[/color]则是软件的运行过程中需要显示的界面图片,以及内容图片,它往往有两种获得方式:[/color][/size][/font]
[size=3][color=#000000][font=Times New Roman]1[/font][font=宋体]是通过网络获得字节数组[/font][font=Times New Roman], [/font][font=宋体]处理这种方式的图片一般都有程序逻辑完成。在[/font][font=Times New Roman]OPM[/font][font=宋体]中这些由服务器控制转发,所以我们很难干涉。[/font][/color][/size]
[size=3][color=#000000][font=Times New Roman]2[/font][font=宋体]保存在软件发行版本中,一般可以由程序读取,并且显示在手机屏幕的对应位置。比如[/font][font=Times New Roman]OPM[/font][font=宋体]中的图标,[/font][font=Times New Roman]logo[/font][font=宋体]等等。我们可以通过替换这些图片来[/font][font=Times New Roman]hack[/font][font=宋体]软件。[/font][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[font=宋体][size=3][color=#000000][color=red]数据[/color],这个概念比较难理解。我们暂且也分一个类:[/color][/size][/font]
[size=3][color=#000000][font=Times New Roman]1[/font][font=宋体]有语义的数据,例如[/font][font=Times New Roman]OPM[/font][font=宋体]中存储的书签,帮助说明等等。这些数据组织的方式通常都是采用几种标准的方式。存储的方式也有两个地方[/font][font=Times New Roman]:[/font][font=宋体]直接写在[/font][font=Times New Roman]class[/font][font=宋体]中或者存储在软件的资源文件中。这类型的数据我们可以随意的替换和更改[/font][/color][/size]
[size=3][color=#000000][font=Times New Roman]2 [/font][font=宋体]没有语义的逻辑数据。这些数据只有特定的程序才能读得懂,比如一个[/font][font=Times New Roman]RPG[/font][font=宋体]游戏的地图数据,从形式上看,它无非就是一些[/font][font=Times New Roman]1,2,3,4[/font][font=宋体]的数字,但是通过游戏程序可以据此画出地图。嘿嘿,很神秘吧。所以神秘的东西咱就不要动了。这类数据通常都会根据数据大小或者存放在游戏中,或者保存在资源文件中。[/font][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[size=3][color=#000000][font=宋体]至此,我们可以换一个角度来总结上面说的背景知识。在软件中包含的代码:必须包含软件的逻辑,以及可能包含一定数量的数据[/font][font=Times New Roman][[/font][font=宋体]语义数据和逻辑数据[/font][font=Times New Roman]][/font][font=宋体];[/font][font=Times New Roman] [/font][/color][color=green][b][font=宋体]非代码文件则可能是[/font][font=Times New Roman] [/font][font=宋体]图片文件,也可能是逻辑数据[/font][font=Times New Roman] [/font][font=宋体]和[/font][font=Times New Roman] [/font][font=宋体]语义数据。我们能简单修改的可以是图片,代码中的语义数据,和资源文件中的语义数据。[/font][/b][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[color=darkred][b][size=3][font=Times New Roman]1.2 OPM[/font][font=宋体]的资源文件格式[/font][/size][/b][/color]
[color=darkred][b][font=宋体][size=3][/size][/font]
[/b][/color][size=3][color=#000000][font=宋体]如果每个软件都按照我上面说的方式来组织它需要的数据的话,那么汉化人员绝对可以省下一大半功夫去打游戏泡[/font][font=Times New Roman]mm[/font][font=宋体]。事实上,软件的严肃性以及牵扯到的商业利益不允许开发者使用常用的组织方式,他们总是要费尽心思把这些我们可能修改的数据藏起来。并且把找到它门的方式写到晦涩的代码里面,导致我们干瞪眼,这个过程我成为资源打包。粗略的数下来,目前总结的资源打包方式起码上百种,所以我们不可能用一把锤子挨个搞定,只能具体问题具体分析。[/font][font=Times New Roman]OPM[/font][font=宋体]属于这些打包方式中比较[/font][font=Times New Roman]bt[/font][font=宋体]的一种,我们慢慢分析。[/font][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[size=3][color=#000000][font=Times New Roman]OPM[/font][font=宋体]的资源文件只有两个t文件与v文件,可以肯定地是开发者肯定不爱看电视TV.里面包含了所有我上文提到的资源类型[i]图片文件,[color=seagreen]也可能是逻辑数据[/color][/i][/font][/color][color=seagreen][i][font=Times New Roman] [/font][/i][i][font=宋体]和[/font][font=Times New Roman] [/font][/i][i][font=宋体]语义数据[/font][font=Times New Roman].[/font][/i][/color][/size]
[i][font=Times New Roman][size=3][color=#2e8b57][/color][/size][/font][/i]
[size=3][color=#000000][font=宋体]当我们用[/font][font=Times New Roman]UE[/font][font=宋体]打开这两个文件的时候,一眼就能看到包含了[/font][font=Times New Roman]n[/font][font=宋体]多语义数据的[/font][font=Times New Roman][color=red]V[/color][/font][font=宋体][color=red]文件[/color]就是我要找寻的那个她。客观地说,将所有数据打包成一个文件的作法,代价在于在程序中需要浪费宝贵的字节码[/font][font=Times New Roman]—[/font][font=宋体]也就是代码来逐个解析并提取,而且很容易将一些无关的数据也一起读到内存中。比如,这里我只要显示一张图片,我就不得不把整个资源文件都读取一下知道我找到我要的图。[/font][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[font=宋体][size=3][color=#000000]下一步就是要摸清楚它的格式。[/color][/size][/font]
[size=3][color=#000000][font=Times New Roman]… … [/font][font=宋体]摸索的过程是很漫长的[/font][font=Times New Roman]… … [/font][font=宋体]中间用到了很多惨无人道的方式,终于我得到了。如果想知道这个残忍的过程的可以私下找我,这里就直接介绍文件格式了。[/font][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[size=3][b][color=blue][font=Times New Roman][ [/font][font=宋体]偏移量数组[/font][font=Times New Roman] ] [[/font][font=宋体]数据文件[/font][font=Times New Roman]][/font][/color][/b][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[size=3][color=#000000][font=宋体]这个是[/font][font=Times New Roman]V[/font][font=宋体]文件的原型。[/font][font=Times New Roman] [/font][font=宋体]所以偏移量数组的作用在于解决我刚才说到的打包方式带来的附加开销。具体的说,这个偏移量就是记录了,这个文件的什么位置存的是什么类型的数据。后面的数据文件就是[/font][font=Times New Roman] [/font][font=宋体]跟打麻将似的一块块的堆了。所以我们把这个文件格式细化一下[/font][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[color=blue][size=3][b][font=Times New Roman][[/font][font=宋体]偏移量[/font][font=Times New Roman]1] [[/font][font=宋体]偏移量[/font][font=Times New Roman]2] [[/font][font=宋体]偏移量[/font][font=Times New Roman]3]….. [[/font][font=宋体]编译量[/font][font=Times New Roman]n]|[[/font][font=宋体]数据块[/font][font=Times New Roman]1] [[/font][font=宋体]数据块[/font][font=Times New Roman]2] [[/font][font=宋体]数据块[/font][font=Times New Roman]3]..[[/font][font=宋体]数据块[/font][font=Times New Roman]n][/font][/b][/size]
[font=Times New Roman][size=3][/size][/font]
[/color][size=3][color=#000000][font=宋体]说明一下这里的[/font][font=Times New Roman]tips[/font][/color][/size]
[size=3][color=#000000][font=Times New Roman]1.Length{[/font][font=宋体]数据块[/font][font=Times New Roman]n}= [/font][font=宋体]偏移[/font][font=Times New Roman]n+1 - [/font][font=宋体]偏移[/font][font=Times New Roman]n[/font][/color][/size]
[size=3][color=#000000][font=Times New Roman]2.[/font][font=宋体]一般偏移量都是一个较大的整数,所以在[/font][font=Times New Roman]OPM[/font][font=宋体]中使用了[/font][font=Times New Roman]Short[/font][font=宋体]类型[/font][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[size=3][color=#000000][font=宋体]下面重头戏就是数据块的格式了:[/font][font=Times New Roman]OPM[/font][font=宋体]中至少包含了[/font][font=Times New Roman]5[/font][font=宋体]种类型的数据块文件,覆盖我上文提到的[/font][font=Times New Roman]3[/font][font=宋体]类可能存在内容——图片,语义数据,逻辑数据。为什么说是至少是[/font][font=Times New Roman]4[/font][font=宋体]类,因为我只分析了汉化与定制需要的数据块,而剩下的逻辑数据块则统统视为未知。如果需要更加深入的修改程序的逻辑就需要分析这些天书般的数据块了。这就是俄版的魅力,什么都能改,俺佩服佩服。跑题了[/font][font=Times New Roman]-_-[/font][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[font=宋体][size=3][color=#000000]由简单到复杂的介绍一下,这四种数据块文件[/color][/size][/font]
[font=Times New Roman][color=#000000][size=3]1.[/size]
[/color][size=3][color=#000000][b]Unknown [/b][/color][/size][/font][font=宋体][size=3][color=#000000]就是我说的天书逻辑数据,这块数据我没有改动跟解析,所以格式无可奉告。[/color][/size][/font]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[font=Times New Roman][color=#000000][size=3]2.[/size]
[/color][size=3][color=#000000][b]PNG Image[/b] [/color][/size][/font][size=3][color=#000000][font=宋体]包含了完整的程序需要的图片格式文件。这里可以展开着说一些,手机中涉及的图片通常都会用[/font][font=Times New Roman]PNG[/font][font=宋体]格式,它的格式可以查找[/font][font=Times New Roman]BB[/font][font=宋体]写的介绍文章,我就不多说了。而有些变态的程序员为了追求容量的极致,对[/font][font=Times New Roman]PNG[/font][font=宋体]的格式进行了再次压缩,然后运用同样变态的算法,可以方便的在程序中变换中不同颜色的,或者产生不同的效果。幸运的是[/font][font=Times New Roman]OPM[/font][font=宋体]的程序员不是这一类,在这一类型的数据块中包含的是完整的数据格式,也就是说,你随便找张[/font][font=Times New Roman]png[/font][font=宋体]图片的数据替换掉这块数据,那么就可以了。这为我们订制一些图标提供了方便。[/font][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[font=Times New Roman][color=#000000][size=3]3.[/size]
[/color][size=3][color=#000000][b]DATA1 [/b][/color][/size][/font][size=3][color=#000000][font=宋体]格式,实在是找不到取什么好名字了。这里面存的是一些[/font][font=Times New Roman] [/font][font=宋体]与程序逻辑相关的语义数据[/font][font=Times New Roman]—[/font][font=宋体]比较罗嗦哈,不过你看到里面的内容就知道了。具体的格式是[/font][/color][/size]
[font=Times New Roman][size=3][color=blue][b][ UTF 1][UTF 2][UTF 3]…[UTF n][bytes][/b][/color][/size][/font]
[size=3][color=#000000][font=宋体]解释一下,[/font][font=Times New Roman]utf[/font][font=宋体]是一种编码方式,你可以[/font][font=Times New Roman]baidu[/font][font=宋体]就知道了,可以用来存英文中文俄文等诸多变态语言或者方块字,而且没有任何差异,这也就是我们可以直接汉化[/font][font=Times New Roman]OPM[/font][font=宋体]的原因。[/font][/color][/size]
[size=3][color=#000000][font=宋体]最后的[/font][font=Times New Roman]bytes[/font][font=宋体]里面存了一些神鬼莫测的数据,不要碰[/font][font=Times New Roman]-_-[/font][/color][/size]
[size=3][color=#000000][attach]202827[/attach][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[font=Times New Roman][color=#000000][size=3]4.[/size]
[/color][size=3][color=#000000][b]DATA2[/b] [/color][/size][/font][size=3][color=#000000][font=宋体]我称为[/font][font=Times New Roman][b]Bookmark[/b][/font][font=宋体][b]数据[/b],就是[/font][font=Times New Roman]OPM[/font][font=宋体]默认书签的存储方式。它的格式如下[/font][/color][/size]
[color=blue][b][font=Times New Roman][size=3][byte1]|[byte2]|[BookMark1{[UTF1][UTF2][PNG3][Short4]}][ BookMark2]…[/size][/font]
[/b][/color][font=宋体][size=3][color=#000000]解释一下:[/color][/size][/font]
[size=3][color=#000000][font=Times New Roman]Byte1 + Byte2 = BookMark length[/font][font=宋体],也就是说前面两个数字的和就是书签的数量。[/font][/color][/size]
[size=3][color=#000000][font=宋体]每个书签包含[/font][font=Times New Roman]4[/font][font=宋体]个数据,类型分别是[/font][font=Times New Roman]UTF ,UTF, PNG,Short[/font][/color][/size]
[size=3][color=#000000][font=宋体]第一个[/font][font=Times New Roman]UTF[/font][font=宋体]是书签的地址,第二个是书签的名称,[/font][font=Times New Roman]PNG[/font][font=宋体]是书签的图标,[/font][font=Times New Roman]Short[/font][font=宋体]是什么我还不知道,嘿嘿[/font][/color][/size]
[size=3][color=#000000][font=宋体][attach]202829[/attach][/font][/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[font=Times New Roman][color=#000000][size=3]4.[/size]
[/color][size=3][color=#000000]DATA3 [/color][/size][/font][size=3][color=#000000][font=宋体]我称为界面数据,主要就是[/font][font=Times New Roman]OPM[/font][font=宋体]里面出现的大部分文字,属于我上文说的语义数据。格式如下:[/font][/color][/size]
[font=Times New Roman][size=3][color=blue][b][Short][Byte][UTF][Short][UTF1][UTF2]…[UTFn][/b][/color][/size][/font]
[size=3][color=#000000][font=宋体]解释一下[/font][font=Times New Roman]:[/font][/color][/size]
[size=3][color=#000000][font=宋体]第一个[/font][font=Times New Roman]short[/font][font=宋体]与[/font][font=Times New Roman]byte[/font][font=宋体]分别是指示符,与内容无关。[/font][/color][/size]
[size=3][color=#000000][font=宋体]第三个[/font][font=Times New Roman]UTF[/font][font=宋体]是[/font][font=Times New Roman]”zh_cn”[/font][font=宋体]表示中文[/font][/color][/size]
[size=3][color=#000000][font=宋体]第四个[/font][font=Times New Roman]short[/font][font=宋体]是长度,表示后面有多少个文本数据[/font][/color][/size]
[size=3][color=#000000][font=宋体]之后的[/font][font=Times New Roman]UTF[/font][font=宋体]格式就是所有的文本了。这些可能不太直观,我会在下面的汉化定制教程中结合图片再一一表示。[/font][/color][/size]
[size=3][color=#000000][font=宋体][attach]202828[/attach][/font][/color][/size]
[size=3][color=#000000]
[/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[size=3][color=#000000][font=宋体]所以总结一下:这[/font][font=Times New Roman]5[/font][font=宋体]类数据块就是[/font][font=Times New Roman]OPM V[/font][font=宋体]文件中的所有类型。在[/font][font=Times New Roman]V[/font][font=宋体]中可能会有[/font][font=Times New Roman]8-10[/font][font=宋体]块数据,根据每个数据块的长度计算出偏移量,就生成了最后的资源文件了,证明我们通过这个思路去修改资源文件里面的内容,然后重新按照它的格式打包的思路是可行的。[/font][/color][/size]
[size=3][color=#000000]
[/color][/size][size=3][color=#000000][font=宋体]明天我会带来如何使用[/font][font=Times New Roman][b]Halo[/b][/font][font=宋体]来修改[/font][font=Times New Roman]OPM[/font][font=宋体]中的语言以及图片文件达到汉化与定制的效果。如下图 [/font][/color][/size]
[size=3][color=#000000][font=宋体][attach]202752[/attach][/font][/color][/size]
[size=3][color=#000000]
[/color][/size]
[font=Times New Roman][size=3][color=#000000][/color][/size][/font]
[font=Times New Roman][size=3][color=#000000]To be continue….[/color][/size][/font] 沙发一定要占着 强烈支持啊...
抢了H大的板凳后.完美地去学校....:大笑 有块地板也不错 不错,我有地下室吗 你们咋恁不厚道,我的地板啊!!!!!!!!!!!:生气 :生气 :生气 没明白~ [quote]原帖由 [i]宛南[/i] 于 2007-9-17 16:31 发表 [url=http://forum.minisoyo.com/redirect.php?goto=findpost&pid=676118&ptid=40061][img]http://forum.minisoyo.com/images/common/back.gif[/img][/url]
你们咋恁不厚道,我的地板啊!!!!!!!!!!!:生气 :生气 :生气 [/quote]
不好意思,嘴别张那么大,我好怕怕:001 支持个,来学东西的。
:大笑 写完一篇了, 哈哈, 不要吝啬rq啊-_- 没看懂-_-。
期待heart大开坛授课 。 精品!学习中… 顶 UE是指UltraEdit?我用UltraEdit打开v文件的时候,看到的是乱糟糟的一大团,不似heart大大看到的那么规整... 是因为编码方式选择不对么? h大用的是halo,而不是UE!用UE处理v文件要转换格式,想当麻烦 :吹吹 我来支持了 希望继续,学习 看里面急的,我只能站门口了 [quote]原帖由 [i]宛南[/i] 于 2007-10-2 14:38 发表 [url=http://forum.minisoyo.com/redirect.php?goto=findpost&pid=782110&ptid=40061][img]http://forum.minisoyo.com/images/common/back.gif[/img][/url]
h大用的是halo,而不是UE!用UE处理v文件要转换格式,想当麻烦 [/quote]
能具体说说用UltraEdit处理v文件要怎么转换格式么?非常感谢。
页:
[1]
