项目地址:https://github.com/aystshen/Android-RomUpgrade.
这是一个负责 Android OTA 升级的后台应用,开机后自动运行后台 Service,支持系统升级和应用升级,支持本地升级(tf卡、u盘)和在线升级(百度),支持推荐升级和静默升级。
已知兼容版本:
● Android 5.1
● Android 6.0
● Android 7.1
● Android 8.1
本地升级(tf卡、u盘)
此固件升级应用也对外提供下面 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使用
1.在 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);
}
2.实现下面代码:
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();
}
}
}
集成
这里讲述如何将此升级应用内置到您定制的系统固件中
前提条件
● 系统签名
● root 权限(应用升级默认采用静默安装,因此需要 root 权限)
内置
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)
6.修改 vendor/xxx/common/apps/apps.mk,如下:
PRODUCT_PACKAGES += \
RomUpgrade
配置属性
将下面属性配置到系统 build.prop 中
# 百度ota平台产品线id
ro.baidu.product.id=10000
# 百度ota平台产品线密钥
ro.baidu.product.secret=NTUyOGFhOTVjODRlxxxxxx==
# 可升级的内置应用包名(多个包名通过逗号分隔,无应用升级可不配)
ro.baidu.presetapp=com.ayst.sample1,com.ayst.sample2
# 系统固件版本号
ro.fw.version=1.0.0
本地升级(tf卡、u盘)
本地应用升级
本地系统升级
本地应用与系统同时升级
#OTA升级包版本号,如:1.0.0
PACKAGE_VERSION=1.0.0
注册百度OTA平台账号
注册 百度安全 OTA 平台 账号,申请开通产品线,将『产品线ID』和『产品线秘钥』通过属性配置到系统
上传升级包
进入对应 『产品线』配置页面,进入『升级资源库』,点击『上传升级包』。
参数说明:
● 上传文件 选择 OTA 升级包文件(应用升级请上传 apk 文件)。
● 类型 勾选『系统升级』『整包』。
● 版本号 版本号格式:1.0.0.0,不足4段补0(系统固件的版本号默认从『ro.topband.sw.version』属性读取)。
● 标签 忽略。
配置测试任务
添加测试设备分组
进入『设备分组管理->测试设备分组』,点击『添加测试设备分组』,勾选『填写设备ID』。
参数说明:
● 设备ID CPU 序号。可以通过命令『cat /proc/cpuinfo』查看。
创建测试任务
进入『测试任务列表』,点击『创建测试任务』。
参数说明:
● 任务名称 自定义。
● 升级范围 勾选『指定测试设备分组』,点击『选择设备分组』,选择上一步添加的『测试设备』分组。
● 升级类型 选择『系统升级』『整包升级』。
● 系统升级资源 点击『资源库选择』,选择上一步上传的升级包。
● 升级方式 勾选『提示升级』。如果不希望 Android 弹出升级提示,而是直接安装升级包,可以勾选『静默升级』。
● 升级提示 一般填写此次升级的修改点,当 Android 弹出升级提示时,会显示这些内容。
● 优先级 默认值。
设备端检查升级
确保设备端网络连接正常,重启设备后会立即检查升级(稍后会每30分钟检查一次),当检查到新版本升级时,会弹出下面升级提示框:
点击『立即升级』开始下载,下载完成后将自动重启安装(安装过程中切勿断电)
配置正式任务
测试任务验证正常后,按照同样方法配置正式任务即可。
在线应用升级(百度)
应用升级配置步骤同配置系统升级。唯一需要注意的是支持配置应用安装完成后动作,比如:安装后重启系统,安装后重新启动应用。
配置应用安装后动作
升级配置界面,滚动到『其他配置』项,打开『自定义字段』,按下面表格配置『字段名称』和『值』,点击『添加』。