作者:碼農一顆顆
連結:https://www.jianshu.com/p/ebc5b4a3d2fe
由於本人文筆不好,本篇文章只記錄公司專案內部升級的一些關鍵節點以及遇到的一些問題,有些人認為app更新有什麼難的,請看完本篇文章大家是否遇到了這些問題。
一、普通升級
普通升級大家很好理解,就是正常的對話方塊提示是否需要更新,有一些更新文案,兩個按鈕,“是”轉到後臺下載,“取消”取消本次下載。
跳過此版本
如果勾選當前版本不會在提示升級
對話方塊顯示的規則
每次進入app都顯示升級對話方塊對使用者有可能是不友好的,我們可以配置時間多久顯示一次。
二、強制升級
首先強制升級當然是對使用者非常不友好,能少用儘量少用,能不用儘量不用,最好這個功能一次也別用。但是這個功能是必不可少的,大家考慮如下幾個問題:
1、app更換介面
app更換介面大家都覺得不可能,但是現實當中確實存在,假如我們金融行業,一個重要的介面報出安全風險,或者這個介面被盜刷使用者資訊,這是致命的。由於我們的url在app內部都是寫死的,想要修改只能透過強制更新,廢棄老介面,使用新介面,這樣才能保證所有使用者的資訊保安。
2、app更換內建證書
在金融行業很多app或者關鍵路徑的網路傳輸都是https雙向加密的,也就是app本地也會寫死ca證書來進行校驗,但是伺服器證書,域名證書都是有實用年限的。
假如ca證書有效期是2年,我們會在1.5年的時候在app中增加下一個證書例如app版本是v2.0.0,經過幾個版本的迭代,在後臺觀察90%以上的活躍使用者都升級到v2.0.0以上的時候,我們會將所有低於v2.0.0的客戶端強制升級到v2.0.0版本來保證客戶端可用。
強制更新不是隻能強制更新到最高版本,而是根據後臺配置的versioncode來更新到指定的版本。
例如:當前最新版本是v3.0.0,90%的使用者已經是v2.0.0,我們可以在後臺配置所有低於v2.0.0的使用者全部都強制升級到v2.0.0否則不可用。
三、App升級介面
app升級一般有兩個介面:
1、appupload
用於傳回app更新資訊以及更新版本
2、appdownload
用於下載app的apk
由於android p 以上的介面訪問必須都是https形式的,我建議這兩個介面不使用雙向加密,以及信任所有ca證書,保證這兩個介面不受任何影響只要有網路就可以傳回信息進行版本更新。
大家考慮如下場景:
使用者app升級到v1.9.0之後就在也沒開啟過app,我們在v2.0.0 app增加了下一個證書,app v3.0.0的時候將所有低於v2.0.0使用者強制更新到v2.0.0且服務端替換了最新的證書(由於伺服器只能替換證書而不是像客戶端可以新增證書來做相容),那麼如果更新介面也是雙向加密的當使用者開啟v1.9.0他將無法更新而且app也無法使用,只能刪除重新下載,當使用者刪除我們的app的時候我們將90%以上失去這個使用者。
四、備選升級方案
為什麼要有備選升級方案,假設線上app更新模組掛了,會出現什麼情況,將是災難性的所有使用者都無法在app內部更新,android使用者使用內部更新的比例相當大這是不可接受的。
有人會說這個機率非常小,在我看來非常小依然是有機率,如果這個小機率時間出現了將是最為嚴重的線上事故,比出現任何一個崩潰bug都要嚴重。所以我們要有萬無一失的更新機制。
備選升級方案目前來說是在appupload介面中下發標識跳轉到android內部下載機制如下程式碼
Uri uri = Uri.parse(target.getUrl());
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
mContext.startActivity(intent);
總結
app 內部更新如果出現問題屬於單點故障。高可用性或者高可靠度的系統不會希望有單點故障造成整體故障的情形。一般可以透過冗餘的方式增加多個相同機能的部件,只要這些部件沒有同時失效,系統(或至少部分系統)仍可運作,這會讓可靠度提高。以上就是無懈可擊 Android 內部升級模組的設計思路,程式碼有空在擼,這裡只寫原理。
朋友會在“發現-看一看”看到你“在看”的內容