Android增量更新
概述
不讲原理只讲实现方式,利用的工具就是diff,如何编译打包也不讲,我已经将代码整理编译完成。
我会将这部分代码上传供大家参考,我也把so库导出来了,如果不想编译jni可以直接使用so库,使用方式也非常简单,即支持分差也支持合成,一般移动端只会用到合成,分差的功能则有服务端处理。
使用
方法1:
下载c++源码使用lib库,然后编译使用
方法2(推荐):
直接使用so库
/**
* @author Tangren
*/
public class MainActivity extends AppCompatActivity {
@InjectView(R.id.oldApkPath)
TextView oldApkPath;
@InjectView(R.id.newApkPath)
TextView newApkPath;
@InjectView(R.id.patchPath)
TextView patchPath;
@InjectView(R.id.button1)
Button button1;
@InjectView(R.id.button)
Button button;
private static final String PATH = Environment.getExternalStorageDirectory().getPath();
private static final String newPath = PATH + File.separator + "patchdemo-release.apk";
private static final String oldPath = PATH + File.separator + "patchdemo-release_old.apk";
private static final String OUT_APK = PATH + File.separator + "out.apk";
private static final String paPath = PATH + File.separator + "patch.patch";
@SuppressLint("SetTextI18n")
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.inject(this);
oldApkPath.setText("旧:" + oldPath);
newApkPath.setText("新:" + newPath);
patchPath.setText("拆分:" + paPath);
}
@OnClick({R.id.button1, R.id.button})
public void onViewClicked(View view) {
switch (view.getId()) {
case R.id.button1://生成差分包
Toast.makeText(this, "正在生成分差包稍等……", Toast.LENGTH_LONG).show();
new Thread(new Runnable() {
@Override
public void run() {
if (PatchUtil.diff(oldPath, newPath, paPath)) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "patch包已经生成到" + patchPath, Toast.LENGTH_SHORT).show();
}
});
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "patch包生成失败!", Toast.LENGTH_SHORT).show();
}
});
}
}
}).start();
break;
case R.id.button://合并差分包
new Thread(new Runnable() {
@Override
public void run() {
if (PatchUtil.make(oldPath, OUT_APK, paPath)) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "apk生成到" + OUT_APK, Toast.LENGTH_SHORT).show();
startActivity(new Intent(Intent.ACTION_VIEW).setDataAndType(Uri.fromFile(new File(OUT_APK)),
"application/vnd.android.package-archive"));
}
});
} else {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "合并差分包失败!", Toast.LENGTH_SHORT).show();
}
});
}
}
}).start();
break;
}
}
}
演示
[未更新时界面]
[未更新是大小]
有图有真相
我总共添加了大概20个小音源以及10张图片生成了帧动画,patch包总共4.13M,这就是热修复做不到的。
服务端
虽然有c++源码但是我不知道怎么生成windows使用的.dll文件,无奈我们服务器又是windows系统只能另想办法了,于是百度,找到了大神提供的供windows使用的bsdiff.exe文件,这里就不做演示了,资源里面有demo。
结束
其中很多细节这里没有怎么提及,注意合并的时候一定要效验签名的完整性,是时候把热修复改成增量更新了(ps:我们公司两种都用)!!