android增量更新详细解读
1 增量更新的意义
a 神马是增量更新?
这个概念很早就被提出,但是目前的形式,小厂用的很少,大厂用的比较多;企鹅的QQ和微信里面都有增量更新着玩意;到底神马是增量更新? 首先增量更新主要用于新版本apk替换旧版本apk, 跟热修复鸟关系都没有,热修复是撸bug的,增量更新是升级apk的, 我们用一张图来说明下 。。。。
也就是我们只需要下载一个很小很小的差分包再跟本地apk合并就可以更新版本了 。。。
b 存在的作用或是意义
不仅仅是为了装13,没有人会这么无聊了,现在WiFi更新免费,4G流量又便宜不差钱
节约大厂带宽
小厂的App就不多解释,下载的人都没有;大厂就不同了,像百度,企鹅等,android的apk更新都是直接从官方网站往下拉,企鹅好几亿的用户,每人多一兆。。。好了。不解释了。。。至少我们在微信官方apk上发现了 增量更新的痕迹,别不服,上图,也就是企鹅的微信用了增量更新
不只是企鹅,大部分有头有脸的网络公司都会撸这一把 。。。。。。
2 生成差分包
首先,差分包是比较两个版本的不同而生成的一个补丁文件 ,也就是比较一个 新的 apk和 旧的apk 通过开源算法而得出的一个补丁,新包的大小可以比旧包大,也可以比旧包小,甚至大小相同都可以,因为大小都不重要,重要的是里面的内容 。。。。。,首先,开源算法哪里可以搞得到了 ???? 这不重要,稍后代码会共享的
差分包一般都是有服务器生成
我说的是一般情况, 不一般的也有服务器端如果2的话,那么只有android端自己搞起了 。。。。 虽然android端生成差分包毫无压力,我们还是得详细的说下。。。网上也有教程,我擦,那帮孙子写的教程我猜过几天自己都看不懂。。。。
a 新建android studio项目 勾上 支持C++
项目名称改成自己的 。。。。。
然后会得到这样的一个项目 。。。。。。
我们可以干一个事情,就是把native-lib 这个名称改下 ,改为自己的名称 ,如果直接重命名是会报错的。。。 需要改动如下几个地方。。。
这三个地方, 名称保持一致就可以了 。。。。 然后我们写一个工具类
编译下没错, 那么到现在为止Java层和JNI层的对接是没有问题的 。。。 现在我们来导入 bzip2 的包因为差分的过程其实是将apk解压比较解压后的比较 ,所有我们需要导入bzip 还有 计算差分的开源框架 。。 分别将下面文件复制到项目中 。。。
然后修改 CMake.txt 里面的配置文件 。。。。 注意路径 。。。。
然后需要修改 bsdiff.c 这个文件中两个地方 。。。。
然后编译运行 。。。。。
那么到现在为止,C层的apk差分工作已经准备就绪 。。。。。 我们这个时候要注意个 so库 , 因为这个so库会用的上的。。。 Java工程或者是其他的android工程都能够用的上的。。。。
因为C代码部分已经实现了 , 都是开源框架的功劳 ,开源框架牛逼啊 。。。。
我们需要将我们的 cpp 代码调用 开源框架的代码 。。。。。。
下一步 我们需要将我们的代码调用C代码 。。.。。。。。
我们需要新建一个叫 bsdiff.h 的文件 。。。。。
并且在 bsdiff.c 中引入
创建这个.h文件的目的是为了 .cpp代码 调用.c代码中的函数 。。。
然后我们生成一个旧版 ,和 一个新版的apk 来 搞一个差分看看 。。。。。 我们现在在手机上差分 。。。。。
然后 , 我就要开始差分了。。。。。。
package hebiao.online.bsdiffapk;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void diff(View v){
new Thread(){
@Override
public void run() {
doDiffAction();
}
}.start();
}
private void doDiffAction(){
System.out.println("xxxxxxxxxxxxxxxxxx start");
String oldFileName = getSdCardPath()+"/aaa/app_old.apk";
String newFileName = getSdCardPath()+"/aaa/app_new.apk";
String diffFileName = getSdCardPath()+"/aaa/apk_diff.patch";
DiffUtil.diff(oldFileName,newFileName,diffFileName);
System.out.println("=============== end");
}
public static boolean isSdCardExist() {
return Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
}
public static String getSdCardPath() {
boolean exist = isSdCardExist();
String sdpath = "";
if (exist) {
sdpath = Environment.getExternalStorageDirectory()
.getAbsolutePath();
}
return sdpath;
}
}
差分生成成功。。。。。。。。
我们可以发现,差分包比新版本的更新包小 , 因为当前apk是不到1.8M ,但是差分包只有1M左右 。。。。不得不服啊 。。 差分包的确比新版本的包小。。。。。。
3 合成差分包
其实合成差分包和生成差分包的配置大部分是相同的,有个地方要注意下 。。。。。
合成差分是 bspatch.c ,而生成差分是 bsdiff.c 只有这两个地方的差别 。。。。。
我们新建一个文件夹,名称叫 bbb ,我们把生成的patch文件 和 旧的 old_apk文件 合并看下 。。。。。。。
package hebiao.online.patchapk;
import android.os.Environment;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
// Used to load the 'native-lib' library on application startup.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void buttonAction(View v){
new Thread(){
@Override
public void run() {
doPatchAction();
}
}.start();
}
private void doPatchAction(){
System.out.println("开始 合成 ");
String oldFileName = getSdCardPath()+"/bbb/app_old.apk";
String newFileName = getSdCardPath()+"/bbb/app_new.apk";
String diffFileName = getSdCardPath()+"/bbb/apk_diff.patch";
PatchUtil.patch(oldFileName,newFileName,diffFileName);
System.out.println("合成 结束");
}
public static boolean isSdCardExist() {
return Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED);
}
public static String getSdCardPath() {
boolean exist = isSdCardExist();
String sdpath = "";
if (exist) {
sdpath = Environment.getExternalStorageDirectory()
.getAbsolutePath();
}
return sdpath;
}
}
安装发现。。。。。。 可以 。。。。。.。。.。。
下载链接 https://download.csdn.net/download/chmod_r_755/10303657
没有积分的可以私信我。。。。
或者 https://github.com/hebiao6446/patchAndDiff