type
status
date
slug
summary
tags
category
icon
password

流程

  • step1 使用bsdiff生成差异包PATCH.patch
  • step2 在手机上合并base包和差异包,生成新版本的安装包
  • step3 安装新的安装包

准备

  1. bsdiff-4.3 (用于生成差异包,合并新包)
  1. bzip2 (bsdiff要使用到)

试验

  • step1 解压bsdiff4.3的压缩包
  • step2 修改Makefile文件,将**.ifndef.endif**缩进,要么无法进行后面的操作
  • step3 在该文件夹的命令行里执行make命令,会生成bsdiffbspatch两个可执行的文件。如果是从上面的地址下载的bsdiff的话,会爆出bspatch.c:39:21: error: unknown type name 'u_char'; did you mean 'char'?这样的错误。这是由于bspatch.c中缺少了#include <sys/types.h> ,加上即可。然后执行make命令。
<!-- more -->
  • step4 准备两个同一签名的apk,old.apk和*.apk*,放在bsdiff-4.3解压后的文件夹里。
  • step5 使用bsdiff生成差异文件PATCH.patch,命令格式:bsdiff oldfile newfile patchfile(这一步操作可以放在服务端来执行)
  • step6 使用bspatch合成新的apk,dest.apk。命令格式:bspatch oldfile newfile patchfile
  • step7 验证生成的dest.apk和之前的new.apk使用一样,验证两个apk的md5值,即可。

在Android中使用增量更新

ndk部分

  • step1 新建一个PatchUtils的类,用于调用native的方法
  • step2 使用javah命令生成PatchUtils的头文件,或者使用ndk-build里的javah生成头文件。会在jni文件夹下生成一个com_bigademo_updatedemo_PatchUtils.h的文件,其中com_bigademo_updatedemo是我的包名。
  • step3 将bsdiff4.3文件夹中的bspatch.c文件导入到jni文件夹下。
  • step4 将bzip2文件夹导入到jni文件夹下
  • step5 删除bzip2中的除了以c和h结尾的其他文件。 如图:
    • notion image
  • step6 修改bspatch.c。引入bzip的文件,引入com_bigademo_updatedemo_PatchUtils.h,在bspatch.c中重写JNIEXPORT jint JNICALL Java_com_bigademo_updatedemo_PatchUtils_bspatch方法。代码如下
  • step7 在jni下创建Android.mk和Application.mk两个文件
  • step8 在module中的build.gradle中配置ndk。

java部分

创建一个ApkExtract类,用于获取当前app的apk和安装新的apk。因为涉及到Android 7.0的,需要处理Provider的问题,同时在AndroidManifest.xml增加一些代码
androidmanifest.xml
最后在需要更新的时候调用下面这个方法,当然先做一下动态调用读写权限的操作。
仿微信地图的可变化高度的列表页使用gradle使App变种,在一个项目里生成不同的变种