Android平台应用更新的一点想法
扫描二维码
随时随地手机看文章
目前主流的两个种apk更新方式:
通过市场更新通过app内部下载更新 不过,根据随着android系统的发展,apk的体积变得越来越庞大,这种更新方式的时间成本和流量成本不断增加。Google显然也发现了这个问题,提供了Smart App update,即差分升级方式。通过提供不同版本apk间的差异档来减小需要下载的数据量。
可惜的是,到目前为止,差分升级也没有成为主流,主要是对于差分档的管理太过复杂,新版本推出以后,需要对之前的每一个版本制作差分档,对开发者来说,也是个不小的负担。
相比较起来,PC端的程序更新做的更加完善,比较成熟的解决方案是,通过更新部分dll库和图片/音频等其他资源来实现增量更新。原则上来说,Android应用也可以移植这样的更新方案。但是,需要解决两个问题:
需要自定义ClassLoader来加载下载的jar文件需要基于事先约定的接口,或者反射等方式来调用下载的jar文件中的类
原则上,这种方案有以下优势:
增量更新,减少数据下载量,减少更新所需时间,提升了用户体验无需再向市场上传更新包,减少了繁琐的审核,可以自由的控制应用更新
当然,也有一定的劣势:
下载的jar档以应用数据的方式存在,容易被删除(Setting中的清空应用数据功能)服务器端和客户端要提供更加复杂的版本检查机能最后的,应该也是最困难的,在已经成型的产品上,使用这种更新方式,需要重构整个框架,约定高可扩展性的接口,大部分厂商应该都是不乐意接受这个成本的。
目前来看,一些大型游戏程序(>100MB)经常会用类似的方式更新资源包(主要是图片音频视频),还没有发现能够动态更新jar档的应用。希望以后随着Android的发展,能够在Android应用上看到这种更新方式。
PS:暂不确定通过网络更新so文件的可行性
对于差异化更新的进一步分析:
1. 最容易实现的方案:
整个app只包含一个Activity,所有的内容通过Fragment来展现,每一个fragment编译为.class文件,实现动态更新。
缺点:
对于原先就使用了Fragment的app,会出现fragment套fragment的情形,需要进一步研究。
如果需要更新Service/Receiver/ContentProvider等组件,还是需要更新apk才能实现。
2.最佳的实现方案:
实现四大组件的动态注册(注册到PackageManager),这样,四大组件的实现都可以编译为.class文件,实现动态更新。
缺点:
动态注册的可行性待研究
如果apk试图更新权限(permission),应该还是需要更新APK,才能实现。