Android11.0系统中添加OTA升级接口供应用层调用
添加OTA升级接口
本文主要描述在RK3568 Android11中通过在自已的系统App中添加OTA升级接口,上层应用开发者在自己的应用中调用此接口进行系统升级。
如何在系统源码中添加开发自己的系统App,可以查看: Android11.0系统中添加开发系统App
参考及说明
OTA系统升级主要分AB系统升级及非AB系统升级,本文实现的是非AB系统的升级,主要参考了services.devicepolicy源码的相关逻辑,路径为:/frameworks/base/services/devicepolicy。

- AB系统:主要是基于UpdateEngine及UpdateEngineCallback,路径:/frameworks/base/core/java/android/os/UpdateEngine.java /frameworks/base/core/java/android/os/UpdateEngineCallback.java
- 非AB系统,主要是调用RecoverySystem.installPackage(mContext, mCopiedUpdateFile)方法,路径为 /frameworks/base/core/java/android/os/RecoverySystem.java;
- RK3568 Android11.0中将OTA升级包adb上传到/storage/emulated/0/update.zip,重启系统,系统中的RKUpdateService服务也会自动检测到升级包,并提示固件升级。
Demo app中添加OTA功能
Demo应用通过其它应用传送的Uri获取OTA升级包文件,并保存为/storage/emulated/0/update.zip,之后调用RecoverySystem.installPackage()方法升级。
- 添加UpdateActivity,路径为 /vendor/yjz/demo/app/src/main/java/com/yjz/demo/update/UpdateActivity.java;
package com.yjz.demo.update;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Color;
import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.view.WindowManager;
import androidx.annotation.Nullable;
import com.yjz.demo.util.SpHelper;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
public class UpdateActivity extends Activity {
private static final String TAG = "UpdateActivity";
private String mOtaFileSavePath;
private int mOtaVersion;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
WindowManager.LayoutParams layoutParams = getWindow().getAttributes();
layoutParams.flags = WindowManager.LayoutParams.FLAG_LAYOUT_NO_LIMITS |
WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL | WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE;
super.onCreate(savedInstanceState);
// 保存文件路径:/storage/emulated/0/update.zip
mOtaFileSavePath = Environment.getExternalStorageDirectory().getAbsolutePath() + File.separator + "update.zip";
Intent intent = getIntent();
mOtaVersion = intent.getIntExtra("ota_version", -1);
StagingAsyncAppTask mStagingTask = new StagingAsyncAppTask();
mStagingTask.execute(getIntent().getData());
}
private void startInstall() {
new Thread() {
@Override
public void run() {
UpdateManager.getInstance(UpdateActivity.this).startOTAUpdate(mOtaVersion, mOtaFileSavePath, new UpdateManager.OTAUpdateReadyListener() {
@Override
public void onReady() {
SpHelper.getInstance(UpdateActivity.this).setOTAVersion(Version.SYSTEM_OTA_VERSION);
}
});
}
}.start()

本文详细介绍了如何在Android11.0的RK3568平台中为自定义系统应用添加OTA升级接口,包括AB和非AB系统升级的区别,以及在Demo应用中通过Uri获取升级包并执行安装的过程。
最低0.47元/天 解锁文章
5868

被折叠的 条评论
为什么被折叠?



