UpdatePlugin:輕鬆定製出屬於你自己的app更新神器

Haoge發表於2017-12-21

簡單的說。UpdatePlugin是一款可以讓你任意作的、用於進行app更新的簡單框架。為什麼你會需要用此框架呢?

我們都知道,雖然app更新功能其實很簡單:

訪問更新介面api -> 與本地應用判斷是否需要更新 -> 下載apk -> 安裝。 so easy!

但是耐不住這世間有種叫做PM的生物,腦洞能突破天際的,就算一個app更新,都能給你玩出花來。老司機都懂的。。。當然也有各種技術原因。所以,這也是為啥這個框架能存在的主要原因。

話不多說。先上鍊接:github.com/yjfnypeu/Up…

原理

幸好雖然需求是多變的,但是基本流程還是一致的。所以,這也是UpdatePlugin的主要原理所在:

基於對更新流程的梳理,UpdatePlugin針對整個更新流程中,所有可能需要被定製的節點,都分別拆分出來了對應的介面。下方的流程圖展示了各個節點以及其觸發的順序

UpdatePlugin:輕鬆定製出屬於你自己的app更新神器

可以看出,框架提供了非常強大的可定製性,目前提供的可定製介面已達到13個之多.

下面將向你展示出所有的可定製節點及其作用說明, 你可以結合上方的流程圖。對照著進行檢視。

當然從這裡看起來。好像太麻煩了。大部分的其實就只需要一個拿來就能用的就行了。所以框架對上面提供的介面節點。大部分都提供了預設實現。大部分使用者都可以直接拿來後進行簡單配置後直接使用。且經過長時間的維護。保證了穩定性:

// 建立使用的更新配置,此配置建議在Application中進行初始化
UpdateConfig.getConfig()
            // url 與 checkEntity方法可任選一種填寫,且至少必填一種。
            // 資料更新介面資料,此時預設為使用GET請求
            .setUrl(url)
            // 類似url方法。CheckEntity方法可填寫url,params,method。可在此設定為使用post請求
            .setCheckEntity(checkEntity)
            .setUpdateParser(new UpdateParser() {
                @Override
                public Update parse(String response) throws Exception {
                    /* 此處根據上面url介面返回的資料response進行update類組裝。框架內部會使用此組裝的update例項判斷是否需要更新以做進一步工作*/
                    return update;
                }
            })

// 然後在啟動頁。啟動後臺更新任務(可選項)
// 後臺更新邏輯為:當此更新任務檢查更新失敗、或者檢查到當前無更新時:
// 延遲指定時間time(毫秒)後。重啟更新任務。
UpdateBuilder.create().checkForDaemon(time);

// 在關於設定頁面。點選檢查更新時。進行前臺更新
UpdateBuilder.create().check();
複製程式碼

以上即是最簡單的用法。

特性

最大的特性:非常強大的可定製性!且得益於此類設計,框架本身提供的預設實現中。也提供了非常多的友好的特性:

  1. 支援斷點下載
  2. 支援Android 7.+ 應用安裝方式
  3. 支援接入任意更新api
  4. 支援定製強制更新、忽略此版本更新邏輯
  5. 支援對apk進行安全檢查,防止類似DNS劫持後被替換更新apk包的情況
  6. 支援指定apk下載檔案地址
  7. 支援定製各種網路任務。適配更多網路使用場景
  8. 支援定製各種更新策略。比如預設使用的WIFI下預設直接下載後再通知更新,非WIFI下先通知更新再啟動下載等。
  9. 支援定製安裝策略。比如在外掛化、熱修復環境下進行定製使用
  10. 支援任意定製更新流程中的各種通知:檢查到有更新時的通知、下載時的進度條通知、下載完成後安裝之前的通知。
  11. 支援兩種不同的檔案校驗方式:MD5檔案驗證或者PackageManager解析Apk驗證。

若你有更多需要的特性。歡迎結合上方的可定製節點作用說明來進行靈活定製。

進階

下面列出了一些你可能會感興趣的問題:

  • 如何快速定位問題?

    你可以通過對控制檯使用標籤UpdatePluginLog進行日誌過濾,以方便的進行快速問題定位:

UpdatePlugin:輕鬆定製出屬於你自己的app更新神器

  • 如果我不需要進行api版本檢查,而是直接從下載檔案開始走流程可以嗎?

    這種情況雖然很少,但是有朋友的確遇到過...佩服一波腦洞...

    這種情況。可以考慮直接建立出UpdateBuilder與Update物件。然後直接通過 Launcher.launchDownload(update, builder) 方法進行啟動。

  • 如何在熱修復、外掛化等其他環境下進行使用?

    對於這種非正式的app更新操作。建議的做法是:對不同的執行環境,建立對應的不同的UpdateConfig例項提供使用,比如:

    // 此為外掛化環境。配置更新外接外掛邏輯
    UpdateConfig pluginUpdateConfig = 
            // 使用createConfig建立一個單獨的更新配置
            UpdateConfig.createConfig()
                        // 針對你當前的外掛化環境進行各種介面定製配置
                        ...
                        // 配置外掛化環境下所需要使用的安裝策略。
                        .setInstallStrategy(pluginInstallStrategy);
    
    // 儲存好外掛更新配置。並在外掛化環境下需要下載對應外掛的時候。啟動外掛更新任務
    UpdateBuilder.create(pluginUpdateConfig)// 指定使用外掛更新配置
                .setUrl(pluginCheckUrl)
                .check();
    複製程式碼

    熱修復、應用商城等的使用方式均類似。都建立一個自身的更新配置提供使用即可!

相關文章