Android系統(tǒng)升級(jí)A/B分區(qū)OTA升級(jí)應(yīng)用層調(diào)用UpdateEngine代碼

最近在搞 Android A/B 分區(qū) OTA 升級(jí)踩官,手機(jī)方案公司出來(lái)之后就好久沒(méi)搞過(guò)源碼開(kāi)發(fā)了却桶,開(kāi)始以為挺簡(jiǎn)單的一個(gè)事,沒(méi)想到折騰了幾天,還好終于搞定颖系!

最開(kāi)始以為還是走 RecoverySystem.installPackage 這種方式嗅剖,確認(rèn)之后得用UpdateEngine方式了。

另外有點(diǎn)坑的是嘁扼,代碼調(diào)用其實(shí)就那么點(diǎn)信粮,但是參數(shù)之類(lèi)的很關(guān)鍵,還有權(quán)限也很關(guān)鍵趁啸,搬磚過(guò)來(lái)走不通强缘,我就是卡了2天,一些莫名的錯(cuò)誤不傅,沒(méi)法定位欺旧。
如:
ErrorCodeConstants.DOWNLOAD_TRANSFER_ERROR = 9

后面各種查資料,結(jié)合系統(tǒng)代碼蛤签,寫(xiě)了一個(gè)解析類(lèi) 只需傳入update.zip包(當(dāng)然也可以解壓之后再傳對(duì)應(yīng)的參數(shù))辞友,解析后升級(jí),爽的一批震肮。

需要注意的坑在代碼里也備注了称龙,有需要的碼友要注意下,特別是如果卡住了找不到原因所在的情況戳晌。

源碼APK我也放在csdn上了鲫尊,供參考。

下載鏈接 =====> 應(yīng)用層調(diào)用UpdateEngine代碼Apk源碼

調(diào)用代碼大致如下:

package com.system.ota;

import android.content.Context;
import android.os.UpdateEngine;
import android.os.UpdateEngineCallback;
import android.util.Log;

import java.net.MalformedURLException;
import java.text.DecimalFormat;

public class SystemUpdateManager {

    private static final String TAG = "ota";

    UpdateEngine mUpdateEngine;

    public SystemUpdateManager(Context context) throws MalformedURLException {
        mUpdateEngine = new UpdateEngine();
    }

    UpdateEngineCallback mUpdateEngineCallback = new UpdateEngineCallback() {
        @Override
        public void onStatusUpdate(int status, float percent) {

            Log.d(TAG, "onStatusUpdate  status: " + status);

            switch (status) {
                case UpdateEngine.UpdateStatusConstants.UPDATED_NEED_REBOOT:
                    rebootNow();
                    break;
                case UpdateEngine.UpdateStatusConstants.DOWNLOADING:// 回調(diào)狀態(tài)沦偎,升級(jí)進(jìn)度
                    //mProgressBar.setProgress((int) (percent * 100));
                    DecimalFormat df = new DecimalFormat("#");
                    String progress = df.format(percent * 100);

                    Log.d(TAG, "update progress: " + progress);

                    break;
                default:
                    // noop
            }

        }

        @Override
        public void onPayloadApplicationComplete(int errorCode) {
            Log.d(TAG, "onPayloadApplicationComplete errorCode=" + errorCode);

            if (errorCode == UpdateEngine.ErrorCodeConstants.SUCCESS) {// 回調(diào)狀態(tài)
                Log.d(TAG, "UPDATE SUCCESS!");
            }
        }
    };


    public void startUpdateSystem(UpdateParser.ParsedUpdate parsedUpdate) {
        mUpdateEngine.bind(mUpdateEngineCallback);// 綁定callback

        mUpdateEngine.applyPayload(
                parsedUpdate.mUrl, parsedUpdate.mOffset, parsedUpdate.mSize, parsedUpdate.mProps);
    }

    /**
     * Reboot the system.
     */
    private void rebootNow() {
        Log.e(TAG, "rebootNow");
    }
}

相關(guān)代碼接口說(shuō)明如下

一疫向、framwork層 應(yīng)用接口

源代碼位置:framwork/base/core/java/android/os/UpdateEngine.java
framwork/base/core/java/android/os/UpdateEngineCallback.java

二、app應(yīng)用調(diào)取applyUpdate方法我這里只說(shuō)一下大致流程

當(dāng)然得系統(tǒng)權(quán)限的App了豪嚎,需要系統(tǒng)簽名搔驼,這些Api也是@SystemApi的

1、創(chuàng)建 UpdateEngineCallback 的對(duì)象 mUpdateEngineCallback

2侈询、創(chuàng)建 UpdateEngine 的對(duì)象 mUpdateEngine, 創(chuàng)建后服務(wù)開(kāi)啟

3舌涨、使用mUpdateEngine.bind(mUpdateEngineCallback) 因?yàn)閎ind方法時(shí)接受的callback對(duì)象,而我們創(chuàng)建的類(lèi)繼承了callback,傳入當(dāng)前類(lèi)的對(duì)象即可

4扔字、調(diào)用 applyPayload(String url,long offset,long size,String[] headerKeyValuePairs) 方法具體執(zhí)行升級(jí)

5囊嘉、在重寫(xiě)的onStatusUpdate(int status, float percent)方法中根據(jù)拿到的狀態(tài)執(zhí)行進(jìn)度邏輯

在重寫(xiě)的onPayloadApplicationComplete(int errorCode);方法中執(zhí)行升級(jí)完成后的邏輯

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市革为,隨后出現(xiàn)的幾起案子扭粱,更是在濱河造成了極大的恐慌,老刑警劉巖震檩,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琢蛤,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)虐块,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén)俩滥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)嘉蕾,“玉大人贺奠,你說(shuō)我怎么就攤上這事〈沓溃” “怎么了儡率?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)以清。 經(jīng)常有香客問(wèn)我儿普,道長(zhǎng),這世上最難降的妖魔是什么掷倔? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任眉孩,我火速辦了婚禮,結(jié)果婚禮上勒葱,老公的妹妹穿的比我還像新娘浪汪。我一直安慰自己,他們只是感情好凛虽,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布死遭。 她就那樣靜靜地躺著,像睡著了一般凯旋。 火紅的嫁衣襯著肌膚如雪呀潭。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,262評(píng)論 1 308
  • 那天至非,我揣著相機(jī)與錄音钠署,去河邊找鬼。 笑死荒椭,一個(gè)胖子當(dāng)著我的面吹牛踏幻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播戳杀,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼该面,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了信卡?” 一聲冷哼從身側(cè)響起隔缀,我...
    開(kāi)封第一講書(shū)人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎傍菇,沒(méi)想到半個(gè)月后猾瘸,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年牵触,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了淮悼。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡揽思,死狀恐怖袜腥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情钉汗,我是刑警寧澤羹令,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站损痰,受9級(jí)特大地震影響福侈,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卢未,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一肪凛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧辽社,春花似錦伟墙、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至失息,卻和暖如春譬淳,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盹兢。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工邻梆, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人绎秒。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓浦妄,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親见芹。 傳聞我的和親對(duì)象是個(gè)殘疾皇子剂娄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容