Android使用updater_sample进行OTA升级

需求描述

通过上层apk进行OTA升级,在Android 10/11后很多都采用A/B分区,使用传统的接口RecoverySystem.installpackage()方式升级失败,因此需要采用UpdateEngine方式进行升级,这里我们使用源码自带的使用updater_sample demo升级成功。

实现方案

updater_sample源码路径:bootable/recovery/updater_sample

在这里插入图片描述
使用updater_sample进行升级的准备
<1>安装apk
源码编译出apk:mmma -j bootable/recovery/updater_sample
安装apk:adb install <apk-path>

<2>准备OTA升级包----oat_package.zip
make otapackage

<3> 准备OTA升级的配置文件update_config.json
示例:res/raw/sample.json
生成配置文件:

PYTHONPATH=$ANDROID_BUILD_TOP/build/make/tools/releasetools:$PYTHONPATH bootable/recovery/updater_sample/tools/gen_update_config.py --ab_install_type=NON_STREAMING ota_package.zip update_config.json file:///data/ota_dir/ota_package.zip

该配置文件需要使用源码脚本gen_update_config.py,通过这个命令我们可以知悉:
生成的配置文件为update_config.json,OTA升级包为ota_package.zip,并且该ota_package.zip要放在/data/ota_dir/ota_package.zip,使用updater_sample这个apk升级时需要将update_config.json放在此目录下/data/user/0/com.example.android.systemupdatersample/files/configs/

<4>添加必要的权限
1.修改/data/ota_package/权限为0777
2.关闭SELinux权限:setenforce 0

<5>使用UpdateEngine升级Log保存路径
data/misc/update_engine_log/

更多信息可以查看此文件bootable/recovery/updater_sample/README.md

updater_sample导入Android Studio

1.将源码updater_sample文件夹复制到本地路径,使用Import Project(Gradle,Eclipse,etc)导入
2.解决gradle报错:在Project build.gradle中的repositories添加:google()即可

使用updater_sample apk的注意点
1.UpdateEngine属于SystemAPI,apk使用时需要导入/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/classes.jar
添加方式:
<1>新建app/libs/class.jar,添加依赖到app的build.gradle

dependencies {
    implementation 'com.google.guava:guava:30.1-android'
    compileOnly files('libs/classes.jar')
}

或者compileOnly fileTree(include: [’*.jar’], dir: ‘libs’)
<2>添加如下到顶级build.gradle

allprojects {
    gradle.projectsEvaluated {
        tasks.withType(JavaCompile) {
            options.compilerArgs << '-Xbootclasspath/p:app/libs/classes.jar'
        }
    }
}

2.Cannot resolve method ‘verifyPayloadMetadata’ in ‘UpdateEngine’
这是因为Android Studio默认优先使用SDK API,我们添加的class.jar优先在后面,因此会出现找不到该方法,需要修改jar包优先级,即修改.idea/modules/app/updater_sample.app.iml

3.找不到com.google.common.collect.ImmutableSet
导入com.google.common.collect jar包com.google.guava
导入步骤:
Project Structure — Dependencies — app — + —Library Dependency — search com.google.guava

拓展

1.当使用系统隐藏的SystemAPI时,也可以使用class.jar
<1>Android Studio自带的SDK API位置
D:\Users\AppData\Android\Sdk\platforms\android-30\android.jar
<2>源码全编的System API
/out/target/common/obj/JAVA_LIBRARIES/framework_intermediates/class.jar

2.添加jar包的简单方式
Project Structure — Dependencies — app — + —Library Dependency — search what you want to find — 即可
app的build.gradle上的dependencies上会自动添加上

参考

A/B(无缝)系统更新

Android studio使用SDK隐藏API方法

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android OTA(Over-The-Air)升级是指通过无线网络更新设备系统的方式。在Android开发中,实现OTA升级需要进行以下步骤: 1. 构建OTA包:将新的系统镜像打包成OTA包,OTA包是一个zip文件,其中包含新的系统镜像、ota脚本等。 2. 验证OTA包:验证OTA包的完整性和正确性,以确保OTA包可以正常升级设备。 3. 下载OTA包:通过网络下载OTA包,可以使用HTTP、FTP等协议进行下载。 4. 安装OTA包:将OTA包安装到设备上,安装过程中会运行OTA脚本,该脚本会对设备进行升级。 下面是一个OTA升级的示例代码: ```java public class OtaUpdater { private static final String TAG = "OtaUpdater"; private static final String UPDATE_URL = "http://example.com/update.zip"; private static final String UPDATE_FILE = "/sdcard/update.zip"; // 检查更新 public static void checkUpdate() { // 在后台线程中检查更新 new Thread(new Runnable() { @Override public void run() { try { // 创建HTTP连接 URL url = new URL(UPDATE_URL); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setConnectTimeout(5000); conn.setRequestMethod("GET"); // 获取OTA包大小 int length = conn.getContentLength(); Log.d(TAG, "OTA package size: " + length); // 创建文件输出流 File file = new File(UPDATE_FILE); FileOutputStream fos = new FileOutputStream(file); // 读取OTA包并保存到文件中 InputStream is = conn.getInputStream(); byte[] buffer = new byte[1024]; int len = 0; int total = 0; while ((len = is.read(buffer)) != -1) { fos.write(buffer, 0, len); total += len; // 发送下载进度 broadcastProgress(total, length); } fos.close(); is.close(); // 验证OTA包 if (verifyUpdate()) { // 安装OTA包 installUpdate(); } else { // OTA包验证失败 broadcastError("OTA package verification failed"); } } catch (Exception e) { // OTA包下载失败 broadcastError("OTA package download failed: " + e.getMessage()); } } }).start(); } // 验证OTA包 private static boolean verifyUpdate() { // TODO: 验证OTA包的完整性和正确性 return true; } // 安装OTA包 private static void installUpdate() { // 创建Intent Intent intent = new Intent(Intent.ACTION_VIEW); intent.setDataAndType(Uri.fromFile(new File(UPDATE_FILE)), "application/vnd.android.package-archive"); intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); // 启动系统安装界面 mContext.startActivity(intent); } // 发送下载进度广播 private static void broadcastProgress(int progress, int total) { // TODO: 发送下载进度广播 } // 发送错误信息广播 private static void broadcastError(String error) { // TODO: 发送错误信息广播 } } ``` 上述代码中,`checkUpdate()`方法会在后台线程中下载OTA包,并且在下载过程中会发送下载进度广播。下载完成后,会调用`verifyUpdate()`方法验证OTA包的完整性和正确性,如果验证通过,则会调用`installUpdate()`方法安装OTA包。最后,`broadcastError()`方法会发送错误信息广播。需要注意的是,在AndroidManifest.xml文件中需要添加`android.permission.INTERNET`权限,以允许应用程序访问网络。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值