項目地址:https://github.com/aystshen/Android-RomUpgrade
這是一個負責 Android OTA 升級的后臺應用省古,開機后自動運行后臺 Service粥庄,支持系統(tǒng)升級和應用升級,支持本地升級(tf卡豺妓、u盤)和在線升級(百度)惜互,支持推薦升級和靜默升級。
已知兼容版本:
- Android 5.1
- Android 6.0
- Android 7.1
- Android 8.1
預覽
本地升級(tf卡琳拭、u盤)
在線升級(百度)
API
此固件升級應用也對外提供下面 API训堆,供第三方應用調用 安裝、驗證白嘁、刪除 升級包坑鱼。
// IRomUpgradeService.aidl
package com.ayst.romupgrade;
// Declare any non-default types here with import statements
interface IRomUpgradeService {
public void checkUpdate();
boolean installPackage(String packagePath);
boolean verifyPackage(String packagePath);
void deletePackage(String packagePath);
}
API使用
- 在 APP 源碼 **aidl/com/ayst/romupgrade **目錄下新建 IRomUpgradeService.aidl,如下:
// IRomUpgradeService.aidl
package com.ayst.romupgrade;
// Declare any non-default types here with import statements
interface IRomUpgradeService {
public void checkUpdate();
boolean installPackage(String packagePath);
boolean verifyPackage(String packagePath);
void deletePackage(String packagePath);
}
- 實現(xiàn)下面代碼:
Intent intent = new Intent();
intent.setPackage("com.ayst.romupgrade");
intent.setAction("com.ayst.romupgrade.UPGRADE_SERVICE");
mContext.bindService(intent, mRomUpgradeServiceConnection, Context.BIND_AUTO_CREATE);
private ServiceConnection mRomUpgradeServiceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.d(TAG, "IRomUpgradeService, onServiceConnected...");
mRomUpgradeService = IRomUpgradeService.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
Log.d(TAG, "IRomUpgradeService, onServiceDisconnected...");
mRomUpgradeService = null;
}
};
/**
* 檢查升級
* 接口為異步操作絮缅,無法直接返回檢查結果鲁沥,當有新版本可升級時直接彈出升級提示窗
*/
public void checkUpdate() {
if (null != mRomUpgradeService) {
try {
mRomUpgradeService.checkUpdate();
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
/**
* 安裝升級
*
* @param packagePath ota升級包
* @return
*/
public boolean installPackage(String packagePath) {
if (null != mRomUpgradeService) {
try {
return mRomUpgradeService.installPackage(packagePath);
} catch (RemoteException e) {
e.printStackTrace();
}
}
return false;
}
/**
* 驗證升級包
*
* @param packagePath ota升級包
* @return
*/
public boolean verifyPackage(String packagePath) {
if (null != mRomUpgradeService) {
try {
return mRomUpgradeService.verifyPackage(packagePath);
} catch (RemoteException e) {
e.printStackTrace();
}
}
return false;
}
/**
* 刪除升級包
*
* @param packagePath ota升級包
*/
public void deletePackage(String packagePath) {
if (null != mRomUpgradeService) {
try {
mRomUpgradeService.deletePackage(packagePath);
} catch (RemoteException e) {
e.printStackTrace();
}
}
}
集成
這里講述如何將此升級應用內置到您定制的系統(tǒng)固件中。
前提條件
- 系統(tǒng)簽名
- root 權限(應用升級默認采用靜默安裝耕魄,因此需要 root 權限)
內置
- 編譯 release 版本 apk 文件(或者直接下載已發(fā)布的 release 版本)画恰。
- 在 Android 源碼 vendor/xxx/common/apps/ 路徑下新建“RomUpgrade”目錄。
- 將升級應用 apk 文件復制到“RomUpgrade”目錄吸奴,并重命名為“RomUpgrade.apk”阐枣。
- 將升級應用 apk 文件中的 so 庫提取出來,復制到“RomUpgrade/lib/arm/”(如果是64系統(tǒng)請?zhí)崛?4庫到“RomUpgrade/lib/arm64/”)奄抽。
- 新建 Android.mk 文件,內容如下:
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := RomUpgrade
LOCAL_MODULE_CLASS := APPS
LOCAL_MODULE_TAGS := optional
LOCAL_BUILT_MODULE_STEM := package.apk
LOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)
#LOCAL_PRIVILEGED_MODULE :=
LOCAL_CERTIFICATE := PRESIGNED
#LOCAL_OVERRIDES_PACKAGES :=
LOCAL_SRC_FILES := $(LOCAL_MODULE).apk
#LOCAL_REQUIRED_MODULES :=
LOCAL_PREBUILT_JNI_LIBS := \
lib/arm/libotaso.so \
lib/arm/libnative-lib.so
include $(BUILD_PREBUILT)
- 修改 vendor/xxx/common/apps/apps.mk甩鳄,如下:
PRODUCT_PACKAGES += \
RomUpgrade
配置屬性
將下面屬性配置到系統(tǒng) build.prop 中:
# 百度ota平臺產品線id
ro.baidu.product.id=10000
# 百度ota平臺產品線密鑰
ro.baidu.product.secret=NTUyOGFhOTVjODRlxxxxxx==
# 可升級的內置應用包名(多個包名通過逗號分隔逞度,無應用升級可不配)
ro.baidu.presetapp=com.ayst.sample1,com.ayst.sample2
# 系統(tǒng)固件版本號
ro.fw.version=1.0.0
使用
本地升級(tf卡、u盤)
本地應用升級
- 在 tf 卡或 u 盤根目錄新建“exupdate”目錄妙啃。
- 將待安裝 apk 文件復制到“exupdate”目錄下档泽。
- 插入 tf 卡或u盤插入 Android 設備俊戳。
- 等待5秒左右,會彈出升級提示對話框馆匿,請根據提示完成升級抑胎。
本地系統(tǒng)升級
- 將待升級系統(tǒng) ota 包復制到 tf 卡或 u 盤目錄下,并重命名為“update.zip”渐北。
- 插入 tf 卡或 u 盤插入 Android 設備阿逃。
- 等待5秒左右,會彈出升級提示對話框赃蛛,請根據提示完成升級恃锉。
本地應用與系統(tǒng)同時升級
- 在 tf 卡或 u 盤根目錄新建“exupdate”目錄。
- 將待安裝 apk 文件復制到“exupdate”目錄下呕臂。
- 將待升級系統(tǒng) ota 包復制到 tf 卡或 u 盤目錄下破托,并重命名為“update.zip”。
- 插入 tf 卡或 u 盤插入Android設備歧蒋。
- 等待5秒左右土砂,會彈出升級提示對話框,請根據提示完成升級谜洽。
配置推薦升級或靜默升級
- 在tf卡或u盤根目錄新建“exupdate”目錄萝映。
- 在“exupdate”目錄下新建“config.ini”文件,文件內容如下:
#升級類型褥琐,1:推薦升級锌俱,2:靜默升級
UPDATE_TYPE=2
配置升級包版本號
此版本號可以配可以不配。如果配置了該版本號則當前系統(tǒng)版本小于此版本時才會升級敌呈,否則不升級贸宏。如果沒有配置該版本號則一律升級。
#OTA升級包版本號磕洪,如:1.0.0
PACKAGE_VERSION=1.0.0
在線系統(tǒng)升級(百度)
注冊百度OTA平臺賬號
注冊 百度安全 OTA 平臺 賬號吭练,申請開通產品線,將『產品線ID』和『產品線秘鑰』通過屬性配置到系統(tǒng)析显。
上傳升級包
進入對應 『產品線』配置頁面鲫咽,進入『升級資源庫』,點擊『上傳升級包』谷异。
參數說明:
- 上傳文件 選擇 OTA 升級包文件(應用升級請上傳 apk 文件)分尸。
- 類型 勾選『系統(tǒng)升級』『整包』。
- 版本號 版本號格式:1.0.0.0歹嘹,不足4段補0(系統(tǒng)固件的版本號默認從『ro.topband.sw.version』屬性讀嚷嵘堋)。
- 標簽 忽略尺上。
配置測試任務
添加測試設備分組
進入『設備分組管理->測試設備分組』材蛛,點擊『添加測試設備分組』圆到,勾選『填寫設備ID』。
參數說明:
- 設備ID ** CPU 序號卑吭⊙康可以通過命令『cat /proc/cpuinfo**』查看。
創(chuàng)建測試任務
進入『測試任務列表』豆赏,點擊『創(chuàng)建測試任務』挣菲。
參數說明:
- 任務名稱 自定義。
- 升級范圍 勾選『指定測試設備分組』河绽,點擊『選擇設備分組』己单,選擇上一步添加的『測試設備』分組。
- 升級類型 選擇『系統(tǒng)升級』『整包升級』耙饰。
- 系統(tǒng)升級資源 點擊『資源庫選擇』纹笼,選擇上一步上傳的升級包。
- 升級方式 勾選『提示升級』苟跪。如果不希望 Android 彈出升級提示廷痘,而是直接安裝升級包,可以勾選『靜默升級』件已。
- 升級提示 一般填寫此次升級的修改點笋额,當 Android 彈出升級提示時,會顯示這些內容篷扩。
- 優(yōu)先級 默認值兄猩。
設備端檢查升級
確保設備端網絡連接正常,重啟設備后會立即檢查升級(稍后會每30分鐘檢查一次)鉴未,當檢查到新版本升級時枢冤,會彈出下面升級提示框:
點擊『立即升級』開始下載,下載完成后將自動重啟安裝(安裝過程中切勿斷電)铜秆。
配置正式任務
測試任務驗證正常后淹真,按照同樣方法配置正式任務即可。
在線應用升級(百度)
應用升級配置步驟同配置系統(tǒng)升級连茧。唯一需要注意的是支持配置應用安裝完成后動作核蘸,比如:安裝后重啟系統(tǒng),安裝后重新啟動應用啸驯。
配置應用安裝后動作
升級配置界面客扎,滾動到『其他配置』項,打開『自定義字段』罚斗,按下面表格配置『字段名稱』和『值』虐唠,點擊『添加』。
功能 | 字段名稱 | 值 |
---|---|---|
配置安裝后重啟系統(tǒng) | after | 1 |
配置安裝后啟動應用 | after | 2 |