1. 程式人生 > >Android app版本升級的問題

Android app版本升級的問題

方式一:APP自身提示有更新,使用者點選升級就在後面下載更新包

詳細的請跳轉

以下是我的理解。

效果圖:

第一步:存放資源的後臺,存放一個包含最新版本資訊的update.txt檔案和一個.apk檔案就夠了

第二步:獲取到最新的版本號,然後與當前APP的版本號進行對比。如果低於最新版本,就開執行緒到下載地址中去下載。

從伺服器中獲得update.txt資訊並解析出來變成一個物件的具體做法就不細說,這裡假設已經獲得了一個物件UpDateInfo的資訊。

public class UpdateInfo
{
    private String versionName;
    private int 
versionCode; private String description;//描述 private String url;//apk下載地址 }

文章頭部的連結的作者通過判斷兩個版本的versionName是否相等來判斷,不相等表示有新版本,一開始我覺得很不合理,到處查詢也沒有找到合理的,所以自己想了下面的辦法,先去判斷versionCode,再去把versionName去掉“.”,然後轉換為int型比較,現在覺得好麻煩,同時也可能出現其他問題,細細想來,通過對比是否相等應該是可以實現的,因為你請求伺服器的地址是唯一的,伺服器上的升級一般都會讓你上傳升級後的安裝包,然後覆蓋掉版本低的那個apk,所以伺服器上存在的要不就是和你正用的app的versionName相等的,不相等的就是版本更高的,我在360應用寶上上傳過應用,如果升級就會覆蓋掉之前的版本,不過,360裡面也有一個降級處理,所以如果用相等去判斷,也就順發布者的意,想升級也可以,想降級也可以,

/**
 * 與當前版本好對比,是否需要升級
 * @return
*/
private boolean isNeedUpdate(UpdateInfo info) {
    String versionName = info.getVersionName; // 最新版本的版本號
int versionCode=info.getVersionCode;
    int currentVersionCode=getCurrentVersion().getVersionCode;//獲得
String currentVersionName=getCurrentVersion().getVersionName;
if(versionCode>=currentVersionCode){//先判斷VersionCode是否有更改,更改了一定版本變化 try{ int vName=Integer.getInteger(versionName.replace(".",""); int cVName=Integer.getInteger(currentVersionName.replace(".",""); if(vName>cVName){ return true; }else{ return false; } }catch (FormatException e){ return false; } }else{ return false; } } /** * 獲取當前版本的軟體資訊 * @return */ private PackageInfo getCurrentVersion() { try { PackageInfo packageInfo = getPackageManager().getPackageInfo(getPackageName(), 0); return packageInfo; } catch (NameNotFoundException e) { e.printStackTrace(); return "版本號未知"; } }

方式二:Android APP增量升級的實現方式

詳情跳轉

自從 Android 4.1 開始,Google引入了應用程式的增量更新。

  • 實現原理
增量更新的原理非常簡單,就是將本地apk與伺服器端最新版本比對,並得到差異包,使用者更新App時只需要下載差異包。例如,當前安裝新浪微博V3.5,12.8 MB,新浪微博最新版V4.0,15.4MB,經過對兩個版本比較之後,發現差異只有7、8M,這時候使用者更新的時候只需要下載一個7、8M的差異包便可,不需要整包下載15.4M的新版微部落格戶端。下載差異包後,在手機端使用舊版apk+差異包,合成得到微博最新版V4.0,提醒使用者安裝即可。 

  • 實現
以新浪微部落格戶端的升級為例,假設手機上安裝的是V3.5,現在最新版是V4.0,使用者需要從V3.5升級到V4.0。 


弄清楚原理之後,我們就需要解決兩個問題: 
1.如何比對兩個版本的apk生成差異包; 
2.如何使用舊的apk+差異包,生成一個新apk; 

(1)生成差異包


這一步需要在伺服器端來實現,一般來說,apk有新版本之後,需要往後臺管理端上傳新apk,上傳時就應該生成每一箇舊版與最新版本的差異包。 
假設,你的apk已經發布了3個版,1.0,2.0,3.0,這時候你要在後臺釋出4.0,在你上傳時,就應該生成 
1.0——>4.0的差異包; 
2.0——>4.0的差異包; 
3.0——>4.0的差異包;

(2)使用舊apk+差異包,在客戶端合成新apk


差異包已經在伺服器端生成,我們只需要在客戶端提示使用者有更新,然後讓使用者來下載差異包,下載成功之後, 
使用本地apk與差異包,生成新版apk。 

這一步需要在Android應用中開發。 
1.首先NDK編譯出一個*.so,APKPatch工程負責生成 libapkpatch so,生成的so檔案位於APKPatch/libs/libapkpatch.so下,其他Android工程便可以使用該so檔案來合成apk。 

2.呼叫該so檔案。 
任意一個Android工程,使用該so檔案,拷貝至libs\armeabi中,便可以呼叫patch()方法,來和成舊apk+差異包。 
附件中,test工程,就是一個呼叫該so檔案的例子。 
  • 注意事項
1.新包和成之後,還需要對合成升級版本的apk包及最新版本apk包進行MD5或SHA1校驗,如果校驗碼不一致,說明合成過程有問題,新合成的包將不能被安裝。 

2.增量升級成功的前提是,使用者手機端必須有能夠讓你拷貝出來且與你伺服器用於差分的版本一致的apk,這樣就存在,例如,系統內建的apk無法獲取到,無法進行增量升級;對於某些與你差分版本一致,但是內容有過修改的(比如破解版apk),這樣也是無法進行增量升級的,為了防止合成補丁錯誤,最好在補丁合成前對舊版本的apk進行校驗,保證基礎包的一致性。