apk增量更新
现在很多应用市场已经实现增量更新功能了,相信大家也很熟悉,名词就不解释了。咱们直接入主题吧。
先说下测试性能
前提手机:小米3c
原apk 21M、新apk 15M(变小了 哈哈 我们apk做了优化)
差分包10M左右
结果:
合并新包的耗时:3777ms
技术实现如下
1、apk的差分、合并:
bsdiffbspatch 进行apk的差分和合并
生成差异包
./
bsdiff v1.0.apk
v2.0
.apk
diff
.
patch 生成的是diff.path差异包
合成
v2
.
0
_diff_patch
.
apk
./
bspatch v1
.
0.apk
v2
.
0
_diff_patch
.
apk
./
diff
.
patch
关于怎么制作工具可以参考这篇文章
2、android代码实现:
主要过程是获取当前apk地址-获取差异包地址-合成新apk-校验新apk
其中md5 sha1校验什么的就不多说了
贴下测试用的核心代码
参考
这篇文章
private class PatchApkTask extends AsyncTask<String, Void, Integer> { @Override protected void onPreExecute() { super.onPreExecute(); mProgressDialog.show(); mResultView.setText(""); mBeginTime = System.currentTimeMillis(); } @Override protected Integer doInBackground(String... params) { PackageInfo packageInfo = ApkUtils.getInstalledApkPackageInfo(mContext, AppConstants.TEST_PACKAGENAME); if (packageInfo != null) { // requestOldMD5(packageInfo.versionCode, packageInfo.versionName); String oldApkSource = ApkUtils.getSourceApkPath(mContext, AppConstants.TEST_PACKAGENAME); if (!TextUtils.isEmpty(oldApkSource)) { int patchResult = PatchUtils.patch(oldApkSource, AppConstants.NEW_APK_PATH, AppConstants.PATCH_PATH); if (patchResult == 0) { // 校验一下合成APK的MD5是不是和真实的MD5一致 if (SignUtils.checkMd5(AppConstants.NEW_APK_PATH, mNewRealMD5)) { return WHAT_SUCCESS; } else { return WHAT_FAIL_GEN_MD5; } } else { return WHAT_FAIL_PATCH; } } else { return WHAT_FAIL_GET_SOURCE; } } else { return WHAT_FAIL_UNKNOWN; } } @Override protected void onPostExecute(Integer result) { super.onPostExecute(result); if (mProgressDialog.isShowing()) { mProgressDialog.dismiss(); } mEndTime = System.currentTimeMillis(); mResultView.setText("耗时: " + (mEndTime - mBeginTime) + "ms"); switch (result) { case WHAT_SUCCESS: { String text = "新apk已合成成功:" + AppConstants.NEW_APK_PATH; showToast(text); ApkUtils.installApk(TestActivity.this, AppConstants.NEW_APK_PATH); break; } // case WHAT_FAIL_OLD_MD5: { // String text = "现在安装的WeiboV5.5的MD5不对!"; // showToast(text); // break; // } case WHAT_FAIL_GEN_MD5: { String text = "合成完毕,但是合成得到的apk MD5不对!"; showToast(text); break; } case WHAT_FAIL_PATCH: { String text = "新apk已合成失败!"; showToast(text); break; } case WHAT_FAIL_GET_SOURCE: { String text = "无法获取微博客户端的源apk文件,只能整包更新了!"; showToast(text); break; } } } }