apk增量更新

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;
                }
            }
        }
    }
 
  
 
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值