1.bsdiff工具生成差分补丁包命令

bsdiff.exe old.apk new.apk patch.apk

bsdiff.exe 是差分工具

  • 第一个参数是旧的apk
  • 第二个参数是新的apk
  • 第三个参数是生成的补丁包,后缀名称随意写什么都行

在cmd执行上边的命令就会生成patch.apk 差分补丁包

2.bspatch工具使用补丁包和旧的apk生成新的apk

bspatch.exe old.apk new2.apk patch.apk

bspatch.exe是通过补丁包生成新文件的工具

  • 第一个参数是旧的apk
  • 第二个参数是要生成的新的apk文件
  • 第三个参数是生成的补丁包

在cmd执行上边的命令就可以通过旧的apk和补丁包生成新的apk

3.Android项目中进行增量更新流程

3.1.在服务器使用差分工具生成补丁包
3.2.在客户端启动apk的时候检测是否存在补丁包,判断是否需要更新
3.3.如果需要更新下载补丁包,并跟手机上安装的apk进行合并生成新的apk进行下载安装

整个流程的核心就是如何在应用程序上进行旧的安装包和补丁包的合并操作

4.客户端演示补丁包和apk的合成过程

4.1.新建一个带ndk环境的android工程
4.2.在cpp路径下面导入bspatch.c的补丁包合成源码,需要借助这个进行补丁合成
4.3.同时需要导入bzip2的源码,因为bspatch.c需要用到
4.4.在CmakeLists.txt进行配置
cmake_minimum_required(VERSION 3.18.1)project("mshotfix")aux_source_directory(bzip2 B_SOURCE)  #批量导入源文件
include_directories(bzip2)  #指定头文件的查找目录add_library(patchupdateSHAREDnative-lib.cppbspatch.c${B_SOURCE}
)find_library(log-liblog)target_link_libraries(patchupdate${log-lib})
4.5.声明Native方法
4.6.项目截图

4.7.在c++中实现native方法doPatch
extern "C"
JNIEXPORT jint JNICALL
Java_com_meishe_patchupdate_MSPatchUtils_doPatch(JNIEnv *env, jclass clazz, jstring old_apk_path,jstring new_apk_path, jstring patch_path) {int args = 4;//参数长度char *argv[args];argv[0] = "bspatch";argv[1] = (char *) env->GetStringUTFChars(old_apk_path, JNI_OK);argv[2] = (char *) env->GetStringUTFChars(new_apk_path, JNI_OK);argv[3] = (char *) env->GetStringUTFChars(patch_path, JNI_OK);//进行补丁包合并操作int result = doPatch(args, argv);//释放资源env->ReleaseStringUTFChars(old_apk_path, argv[1]);env->ReleaseStringUTFChars(new_apk_path, argv[2]);env->ReleaseStringUTFChars(patch_path, argv[3]);return result;
}
4.8.进行合并以及安装操作
public void doPatch(View view) {File newFile=new File(getExternalFilesDir("apk"),"app.apk");File patchFile=new File(getExternalFilesDir("apk"),"patch.apk");String oldApkPath=getApplicationInfo().sourceDir;String newApkPath= newFile.getAbsolutePath();String patchPath=patchFile.getAbsolutePath();Log.d("lpf","oldApkPath="+oldApkPath);Log.d("lpf","newApkPath="+newApkPath);Log.d("lpf","patchPath="+patchPath);int result = MSPatchUtils.doPatch(oldApkPath,newApkPath, patchPath);if (result==0){install(newFile);}}private void install(File newFile) {Intent intent=new Intent(Intent.ACTION_VIEW);intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.N){Uri apkUri= FileProvider.getUriForFile(this,getPackageName()+".fileProvider",newFile);intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);intent.setDataAndType(apkUri, "application/vnd.android.package-archive");}else{intent.setDataAndType(Uri.fromFile(newFile), "application/vnd.android.package-archive");}startActivity(intent);
}
4.9.申明安装权限
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>

5.演示增量更新流程

5.1.先生成一个apk文件,取名字为old.apk
5.2.修改文案生成一个新的apk,取名字为new.apk
5.3.在本地执行命令生成patch.apk 补丁包
5.4.在手机上部署old.apk,并将补丁包手动放置到手机:
/sdcard/Android/data/com.meishe.patchupdate/files/apk/patch.apk
5.5.点击按钮即可触发补丁合并操作,并进行安装操作

项目源码地址

Android 增量更新实战相关推荐

  1. android cpp做成so库,Android增量更新(二)—制作合成文件so库

    ###前言 在上节中,我们已经学习了`Android增量更新`的实现原理,那么在Android开发的移动端,我们需要涉及到的其实是`文件合成`的这个流程. 那么,今天就来讲讲增量更新合成流程的实现吧. ...

  2. Android 增量更新实现

    如果app依赖本地更新,更新比较频繁的话,每次更新都要让用户下载完整安装包,用户体验会比较差.目前,很多应用商店都实现了apk的增量更新 正常apk更新逻辑: 打包V1.0版本,大小30M,用户安装完 ...

  3. Android增量更新框架

    Android增量更新框架 框架介绍 功能简介 简易效果图 增量更新配置 快速使用 Api详解 项目地址 框架介绍 功能简介 Android App更新框架,包含增量更新.多线程下载等功能.一句代码链 ...

  4. android中热更新模式,热更新再牛,也少不了Android 增量更新

    码个蛋(codeegg)第 785 次推文 作者: C_YQ 原文: https://juejin.im/post/5da845cdf265da5b7244c63e 码妞看世界 接骨草~ 虽然没有增量 ...

  5. Android 增量更新实例(Smart App Updates)

    http://892848153.iteye.com/blog/2022851 转自:http://my.oschina.net/liucundong/blog/160436 目录[-] 官方说明 实 ...

  6. Android增量更新——bsdiffbspatch

    原址 现在公司对于app增量更新的需求越来越多,因为增量更新不仅仅可以节省流量,更重要的一点是减少用户更新app的时间,有益于用户体验.    这篇文章将介绍运用patch差分包的形式实现增量更新.为 ...

  7. Android 增量更新

    随着社会的发展,虽然对于一个用户而言,流量不值钱,每个用户的手机会有多少个G的流量,或者不限制流量,或者经常使用wifi.所以目前在Android端流量的优化,可能没有那么重要了.但是当我们的用户更新 ...

  8. android增量更新详细解读

    1 增量更新的意义 a 神马是增量更新? 这个概念很早就被提出,但是目前的形式,小厂用的很少,大厂用的比较多:企鹅的QQ和微信里面都有增量更新着玩意:到底神马是增量更新? 首先增量更新主要用于新版本a ...

  9. Android 增量更新完全解析 是增量不是热修复

    本文在我的微信公众号:鸿洋(hongyangAndroid)首发. 转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/5276165 ...

最新文章

  1. 北大读博手记:怎样完成自己的博士生涯?非常具有指导性!
  2. vsftpd安装及虚拟用户认证
  3. 闭包函数python_Python--函数对象闭包函数
  4. 如何开发一个npm包并发布
  5. 计算机考试打字对齐,2010年职称计算机考试:对齐方式
  6. 利用tensorflow构建AlexNet模型,实现小数量级的猫狗分类(只有train)
  7. Android--使用Camera拍照
  8. 通过Web方式登录USG6000V
  9. 计算机硬件技术基础 统计字符串strl中字符'a'的个数,汕头大学工学院830计算机基础综合历年考研真题202p.doc...
  10. [C/C++][经典探讨]类继承中,通过基类指针delete释放,是否会造成内存泄漏
  11. 英特尔 英特尔 显示器音频_每日新闻摘要:ZombieLoad是对英特尔PC的最新威胁
  12. 开源、绿色,解压即可运行的数据库连接工具推荐
  13. Document Star证件照大师升级版 for Mac(支持ps2021)
  14. 火影忍者 动漫 全集目录 分章节 精彩打斗剧集 思维导图整理
  15. 8086汇编语言:8086CPU的各个引脚的功能讲解
  16. 易优EyouCMS全套插件使用说明
  17. 用C语言短除法求最大公因数用,用短除法求最大公因数
  18. S3C2440之字符设备驱动详解
  19. element tree不刷新视图_00后都开始找工作了,这些都不懂还聊个啥?
  20. websocket自动重连

热门文章

  1. c语言51单片机脉冲计数检测,51单片机计数测速(外部脉冲频率)proteus仿真加源码...
  2. 云原生Envoy边缘服务代理简介和使用指南
  3. 使用 js 实现累乘之和
  4. 修改linux终端命令行颜色
  5. ffmpeg推流到mediasoup
  6. CSDN百度指数提升方法介绍
  7. 866数据结构重点内容
  8. [附源码]java毕业设计宠物店管理系统
  9. 常用网络工具5:网络抓包工具wireshark
  10. 11月23日:PHP中tp框架的入门以及mvc模式的了解