增量更新的概念:

  当我们手机上安装的app版本与服务器的最新版本不一致的时候,传统做法是重新下载安装一个最新版的apk文件,不过这种方式比较耗流量,不利于用户体验。增量更新就是只下载当前app版本与最新版本的差异内容,然后与当前版本就行合并成最新版本再安装。目前支持增量更新的应用市场 有GooglePlay、360手机市场等。

增量更新的原理:

  使用开源工具bsdiff对新版apk和旧版apk进行二进制文件比较,得到patch补丁文件,然后使用开源工具bspatch将旧版apk和补丁文件合并,重新安装。实际开发中我们app端只需要编写native方法,调用.so文件实现旧版apk与patch补丁文件的合并和安装即可,patch补丁文件是由服务器端产生的。

增量更新的代码实现:使用增量更新框架SmartAppUpdates

  

 //先加载so库
static {
System.loadLibrary("ApkPatchLibrary");
}

public void downloadNewApk(View view){
//由于是个耗时操作,需要异步任务
new AsyncTask<Void,Void,Integer>(){
//3.合成后的新apk文件路径
String newApkPath = Environment.getExternalStorageDirectory()+"/WeiboNew.apk";
@Override
protected Integer doInBackground(Void... params) {
//1.先从服务器下载patch补丁包
File patchFile = downloadPatchFile();
String patchPath = patchFile.getAbsolutePath();
//2.获取当前版本apk文件的路径
String appPath = "/data/app/com.sina.weibo-1.apk";
return PatchUtils.patch(appPath,newApkPath,patchPath);
}

@Override
protected void onPostExecute(Integer integer) {
super.onPostExecute(integer);
if(integer==0){
//说明合成成功,那么开始安装
Toast.makeText(MainActivity.this, "合成成功!", Toast.LENGTH_SHORT).show();
ApkUtils.installApk(MainActivity.this,newApkPath);
}else {
Toast.makeText(MainActivity.this, "合成失败!", Toast.LENGTH_SHORT).show();
}
}
}.execute();
}

private File downloadPatchFile() {
return new File(Environment.getExternalStorageDirectory(),"weibo.patch");
}

最新文章

  1. 编译安装php5.5和php-fpm
  2. 老毛桃u盘装系统制作工具
  3. JavaScript学习05 定时器
  4. js实现一套代码来控制所有的运动,图片的淡入淡出,winth,height的变宽
  5. Android Studio开发RecyclerView遇到的各种问题以及解决
  6. 【LeetCode 229】Majority Element II
  7. Java IO (2) - OutputStream
  8. 2015北京网络赛 F Couple Trees 暴力倍增
  9. git、githup使用
  10. iOS 纯代码适配iPhone6,6+
  11. 状态(State)模式
  12. Linux中安装opencv-3.3.1
  13. 未找到导入的项目“C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\DotNet\Microsoft.DotNet.Props”
  14. C#语言struct结构体适用场景和注意事项
  15. ubuntu安装qq、微信
  16. vue webpack配置解决跨域问题
  17. kali linux 更新问题
  18. WebApp开发技术搭配
  19. 常用adb操作命令详解
  20. [洛谷P3293] [SCOI2016]美味

热门文章

  1. 高端技巧:怎样使用#define定义变量
  2. hdu 5087 Revenge of LIS II ( LIS ,第二长子序列)
  3. Hdfs的ACL測试
  4. 在EasyUI的DataGrid中嵌入Combobox
  5. 简单了解eMMC
  6. Matplotlib绘图基础
  7. Servlet访问Javabean并传结果给jsp
  8. [IT学习]华为全连接大会2017
  9. 阐述Linux操作系统之rpm五种基本操作
  10. 代理ip proxy