增量更新的概念:
當我們手機上安裝的app版本與服務器的最新版本不一致的時候,傳統做法是重新下載安裝一個最新版的apk文件,不過這種方式比較耗流量,不利於用戶體驗。增量更新就是只下載當前app版本與最新版本的差異內容,然后與當前版本就行合並成最新版本再安裝。目前支持增量更新的應用市場 有GooglePlay、360手機市場等。
增量更新的原理:
使用開源工具bsdiff對新版apk和舊版apk進行二進制文件比較,得到patch補丁文件,然后使用開源工具bspatch將舊版apk和補丁文件合並,重新安裝。實際開發中我們app端只需要編寫native方法,調用.so文件實現舊版apk與patch補丁文件的合並和安裝即可,patch補丁文件是由服務器端產生的。
增量更新的代碼實現:使用增量更新框架SmartAppUpdates
//先加載so庫 static { System.loadLibrary("ApkPatchLibrary"); } public void downloadNewApk(View view){ //由於是個耗時操作,需要異步任務 new AsyncTask<Void,Void,Integer>(){ //3.合成后的新apk文件路徑 String newApkPath = Environment.getExternalStorageDirectory()+"/WeiboNew.apk"; @Override protected Integer doInBackground(Void... params) { //1.先從服務器下載patch補丁包 File patchFile = downloadPatchFile(); String patchPath = patchFile.getAbsolutePath(); //2.獲取當前版本apk文件的路徑 String appPath = "/data/app/com.sina.weibo-1.apk"; return PatchUtils.patch(appPath,newApkPath,patchPath); } @Override protected void onPostExecute(Integer integer) { super.onPostExecute(integer); if(integer==0){ //說明合成成功,那么開始安裝 Toast.makeText(MainActivity.this, "合成成功!", Toast.LENGTH_SHORT).show(); ApkUtils.installApk(MainActivity.this,newApkPath); }else { Toast.makeText(MainActivity.this, "合成失敗!", Toast.LENGTH_SHORT).show(); } } }.execute(); } private File downloadPatchFile() { return new File(Environment.getExternalStorageDirectory(),"weibo.patch"); }