需求描述
通过上层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上会自动添加上