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; } } } }
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校驗什麼的就不多說了
貼下測試用的核心代碼
參考這篇文章
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.