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;
                }
            }
        }
    }


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章