随着android应用(yòng)體(tǐ)积的不断增大,以及应用(yòng)版本发布的不断更迭,用(yòng)户的升级成了一个问题,google也意识到不断更新(xīn)应用(yòng)对用(yòng)户流量的损耗,在Google I/O 上提及的 Smart App update,即应用(yòng)增量升级,或者叫做差分(fēn)升级的做法,并在新(xīn)版本的Google Play中(zhōng)得到支持,某天在和群友聊天是扯到这方面的话题,好奇就稍微研究了一下。
增量升级的原理(lǐ)
今天我们就来实现类似的应用(yòng)的增量升级。其实增量升级的原理(lǐ)很(hěn)简单,即首先将应用(yòng)的旧版本Apk与新(xīn)版本Apk做差分(fēn),得到更新(xīn)的部分(fēn)的补丁,例如旧版本的APK有(yǒu)5M,新(xīn)版的有(yǒu)8M,更新(xīn)的部分(fēn)则可(kě)能(néng)只有(yǒu)3M左右(这里需要说明的是,得到的差分(fēn)包大小(xiǎo)并不是简单的相减,因為(wèi)其实需要包含一些上下文(wén)相关的东西),使用(yòng)差分(fēn)升级的好处显而易见,那么你不需要下载完整的8M文(wén)件,只需要下载更新(xīn)部分(fēn)就可(kě)以,而更新(xīn)部分(fēn)可(kě)能(néng)只有(yǒu)3、4M,可(kě)以很(hěn)大程度上减少流量的损失。
在用(yòng)户下载了差分(fēn)包之后,需要在手机端将他(tā)们组合起来。可(kě)以参考的做法是先将手机端的旧版本软件(多(duō)半在/data/下),复制到SD卡或者cache中(zhōng),将它们和之前的差分(fēn)patch进行组合,得到一个新(xīn)版本的apk应用(yòng),如果不出意外的话,这个生成的apk和你之前做差分(fēn)的apk是一致的。
增量升级的操作(zuò)
在了解基本的原理(lǐ)之后,我们来逐步解决其中(zhōng)的各个难点。首先是差分(fēn)包patch的生成。如果做过android手机OTA升级的同學(xué)应该注意到,在update.zip中(zhōng)的patch文(wén)件夹中(zhōng)有(yǒu)需要与系统文(wén)件同名(míng)但是以xxx.p 為(wèi)后缀的文(wén)件,他(tā)们就是生成的差分(fēn)patch文(wén)件。我们可(kě)以借鉴OTA系统升级的差分(fēn)生成工(gōng)具(jù)来生成我们单个应用(yòng)apk的差分(fēn)patch文(wén)件。
OTA系统差分(fēn)包的制作(zuò),使用(yòng)命令:
[html] view plaincopyprint?
./build/tools/releasetools/ota_from_target_files -n -i <旧包> <新(xīn)包> <差分(fēn)包名(míng)>
在查阅ota_from_target_files 的代码可(kě)知,是在函数WriteIncrementalOTAPackage里生成差分(fēn)包的,在这个函数里边创建了common.Difference这个类,我们继续跟进,在common.py中(zhōng)的类 class Difference(object):里可(kě)以看到:
[html] view plaincopyprint?
diff_program = DIFF_PROGRAM_BY_EXT.get(ext, "bsdiff")
至此我们就看到了android中(zhōng)提供我们用(yòng)来制作(zuò)差分(fēn)增量升级包的工(gōng)具(jù),"bsdiff",这是一个很(hěn)牛X开源的二进制差分(fēn)工(gōng)具(jù).相关的介绍传送门
相关的代码地址 或者在android的代码目录下 \external\bsdiff
bsdiff是二进制差分(fēn)工(gōng)具(jù),其对应的bspatch是相应的补丁合成工(gōng)具(jù)
需要注意的是增量升级的补丁包,是需要在服務(wù)器端,即PC端完成,大致流程如,制作(zuò)补丁时调用(yòng)bsdiff函数,根据两个不同版本的二进制文(wén)件,生成补丁文(wén)件。
[html] view plaincopyprint?
命令:bsdiff oldfile newfile patchfile
例如: bsdiff xx_v1.0.apk xx_v2.0.apk xx.patch
将生成的补丁包 xx.patch放置在升级服務(wù)器上,供用(yòng)户下载升级,对应多(duō)版本需要对不同的版本进行差分(fēn),对于版本跨度较大的,建议整包升级。
用(yòng)户在下载了 xx.patch补丁包后,需要用(yòng)到补丁所对应的apk,即原来系统安(ān)装(zhuāng)的旧版本apk和补丁合成的bspatch工(gōng)具(jù)。系统旧版本的apk可(kě)以通过copy系统data/app目录下的apk文(wén)件获取,而补丁合成的bspatch可(kě)以通过将bspatch源码稍作(zuò)修改,封装(zhuāng)成一个so库,供手机端调用(yòng)。
[html] view plaincopyprint?
bspatch的命令格式為(wèi):
bspatch oldfile newfile patchfile
和差分(fēn)时的参数一样。合成新(xīn)的apk便可(kě)以用(yòng)于安(ān)装(zhuāng)。
以上只是简单的操作(zuò)原理(lǐ),增量升级还涉及很(hěn)多(duō)其他(tā)方面,例如,升级补丁校验等问题,可(kě)以参考android源码中(zhōng)bootable\recovery\applypatch的相关操作(zuò),本文(wén)只是浅析,在此不表。
增量升级的不足
增量升级并非完美无缺的升级方式,至少存在以下两点不足:
1.增量升级是以两个应用(yòng)版本之间的差异来生成补丁的,你无法保证用(yòng)户每次的及时升级到最新(xīn),所以你必须对你所发布的每一个版本都和最新(xīn)的版本作(zuò)差分(fēn),以便使所有(yǒu)版本的用(yòng)户都可(kě)以差分(fēn)升级,这样操作(zuò)相对于原来的整包升级较為(wèi)繁琐,不过可(kě)以通过自动化的脚本批量生成。
2.增量升级成功的前提是,用(yòng)户手机端必须有(yǒu)能(néng)够让你拷贝出来且与你服務(wù)器用(yòng)于差分(fēn)的版本一致的apk,这样就存在,例如,系统内置的apk无法获取到,无法进行增量升级;对于某些与你差分(fēn)版本一致,但是内容有(yǒu)过修改的(比如破解版apk),这样也是无法进行增量升级的,為(wèi)了防止合成补丁错误,最好在补丁合成前对旧版本的apk进行sha1sum校验,保证基础包的一致性。
增量升级的改善
现在有(yǒu)一项新(xīn)的APP更新(xīn)技(jì )术已经开始应用(yòng)于手游更新(xīn),手游CP将更新(xīn)包上传都CDN服務(wù)器,游戏就能(néng)在玩家玩游戏过程当中(zhōng)完成静默更新(xīn),整个过程玩家毫无察觉,保证玩家的手游什么时候都是最新(xīn)版的。
云计算(cloud computing)是基于互联网的相关服務(wù)的增加、使用(yòng)和交付模式,通常涉及通过互联网来提供动态易扩展且经常是虚拟化的资源。云是网络、互联网的一种比喻说法。过去在图中(zhōng)往往用(yòng)云来表示電(diàn)信网,后来也用(yòng)来表示互联网和底层基础设施的抽象。
手游云更新(xīn)是将CP提供的apk原包上传到云服務(wù)器上,经过云服務(wù)器处理(lǐ)后,将全新(xīn)的apk包投放到渠道上,同时通过云服務(wù)器的高效、快速传输、智能(néng)的处理(lǐ)方式,将apk的更新(xīn)包、更新(xīn)资源实现智能(néng)云更新(xīn):减少用(yòng)户流失,节省CDN开支,避免出现游戏版本更新(xīn)中(zhōng)断或安(ān)装(zhuāng)失败的稳定,保障稳定安(ān)全的透明更新(xīn)无感知更新(xīn)环境。
相比传统的手游更新(xīn)方式,手游云更新(xīn)有(yǒu)以下优势。
节约成本
1、省去渠道商(shāng)務(wù)沟通环节,降低人力成本。
2、省去CP进行整包更新(xīn)时上传渠道环节,云更新(xīn)足以支撑大版本迭代。
3、非强制更新(xīn)选择,可(kě)以让玩家在游戏过程中(zhōng)自动静默更新(xīn)完成。
4、省去昂贵的CDN维护费用(yòng)。
节约时间
1、省去打包环节,让开发从此告别频繁的接入SDK包。
2、接入云更新(xīn),即使全量更新(xīn)也无需渠道配合,方便快捷一站完成。
3、省去停服维护时间,停服更新(xīn)时间。
告别繁琐
1、告别繁琐的渠道-CP-发行配合流程,云更新(xīn)后台帮你快速解决更新(xīn)问题。
2、自主选择强制更新(xīn)与非强制更新(xīn),非强制更新(xīn)状态下,玩家不再纠结于更新(xīn)界面,边玩变更,无缝对接新(xīn)版本。
3、全面支持全量更新(xīn)自动升级,不再反复安(ān)装(zhuāng)游戏包,老玩家直接一键升级免安(ān)装(zhuāng)。
服務(wù)器稳定
1、高性能(néng)的CDN服務(wù)器支撑,实现稳定更新(xīn)。
2、用(yòng)户體(tǐ)验感增强,有(yǒu)效减少用(yòng)户在更新(xīn)环节流失。
3、杜绝网络波动,实现快速更新(xīn)。
4、爱加密游戏方案為(wèi)您的版本保驾护航。
5、独有(yǒu)的破解分(fēn)析和安(ān)全监测,让游戏告别后顾之忧。
目前,这项更新(xīn)技(jì )术只是应用(yòng)于手机游戏,但是我们可(kě)以预测这项技(jì )术将应用(yòng)于其他(tā)APP。
爱加密(www.ijiami.cn)是國(guó)内顶尖的移动信息安(ān)全體(tǐ)系服務(wù)商(shāng),专注于為(wèi)移动领域的金融、游戏、企业级应用(yòng)及移动互联网开发者提供安(ān)全可(kě)靠的移动应用(yòng)保护解决方案,服務(wù)范围覆盖Andriod和iOS两大主流智能(néng)手机系统。
目前,爱加密成功研发出了最新(xīn)的压缩和云更新(xīn)技(jì )术,将游戏包进行压缩,使得游戏安(ān)装(zhuāng)包的内存减小(xiǎo),运行更加流畅。根据测试结果显示,该游戏包體(tǐ)压缩技(jì )术可(kě)将200M大小(xiǎo)的游戏包體(tǐ)压缩至40M,并且对游戏品质(zhì)毫无影响。再配以云更新(xīn)技(jì )术,可(kě)让游戏在云端自动更新(xīn),在玩家操作(zuò)过程中(zhōng)迅速完成余包體(tǐ)下载,完整體(tǐ)验游戏无需另行下载等待,使玩家體(tǐ)验起来更加流畅。
(文(wén)章转载于CSDN博客,爱加密改编)
上一篇: 勒索病毒防范分(fēn)析(爱加密原创)
下一篇: APP代码混淆与破解