1、配置编译环境
source build/envsetup.sh xxx
lunch xxx-userdebug-native
2、编译整包与 target 包
(1)、编 译 OTA 整 包。
make otapackage
在此刻,如果需要打基础包烧录到系统,可以在此刻打基础包。
生成OTA整包目录如下,此zip包用于OTA整包升级。
out/target/product/product_id/xxx.zip。
同时,生成target资源包目录如下,此zip包用于制作差分包,需要做好备份。
out/target/product/product_id/obj/PACKAGING/target_files_intermediates/xxx.zip。
(2)、制作差分包
保存以上的target资源包,重命名为: 1-target.zip。
清除整个工程后修改代码,再次编译,然后保存此版本的target包,重命名为: 2-target.zip。
根目录下执行以下命令:
./build/tools/releasetools/ota_from_target_files -k build/target/product/security/release/releasekey -i 1-target.zip 2-target.zip 1-2_update.zip
降级差分包可以从新版本反向升级到较老版本,只需在做包指令中加入“--downgrade”参数即可, 并调整target包的顺序即可,
./build/tools/releasetools/ota_from_target_files -i 2-target.zip 1-target.zip 2-1_update.zip
3、App触发ota升级代码实现:
App从服务端下载差分包比如1-2.zip ,下载到系统能识别到的ota升级,比如data/media/0.
代码升级:
RecoverySystem.*installPackage*(mContext, file);
4、本地测试:
将 生 成 的“ 升 级 包” 比如1-2_update.zip 重 命 名 为 update.zip。 adb push 到/data/media/0 目录下。
adb root
adb push update.zip /data/media/0
进入设置->关于->系统软件更新,选择本地升级选项后,系统会自动重启并进行升级。
注意: (1)、OTA权限:除了App自身权限外,还需要:
uses-permission android:name="android.permission.REBOOT"
uses-permission android:name="android.permission.RECOVERY"
uses-permission android:name="android.permission.WRITE_MEDIA_STORAGE"
uses-permission android:name="android.permission.READ_MEDIA_STORAGE"
系统权限还需要在这里声明: frameworks/base/data/etc/privapp-permissions-platform.xml
(2)、RecoveryUI 修改为横屏:
bootable\recovery\minui\graphics.cpp
int gr_init() {
.....
gr_backend = backend.release();
int overscan_percent = android::base::GetIntProperty("ro.minui.overscan_percent", 0);
overscan_offset_x = gr_draw->width * overscan_percent / 100;
overscan_offset_y = gr_draw->height * overscan_percent / 100;
gr_flip();
gr_flip();
if (!gr_draw) {
printf("gr_init: gr_draw becomes nullptr after gr_flip\n");
return -1;
}
std::string rotation_str =
android::base::GetProperty("ro.minui.default_rotation", "ROTATION_NONE");
if (rotation_str == "ROTATION_RIGHT") {
gr_rotate(GRRotation::RIGHT);
} else if (rotation_str == "ROTATION_DOWN") {
gr_rotate(GRRotation::DOWN);
} else if (rotation_str == "ROTATION_LEFT") {
gr_rotate(GRRotation::LEFT);
} else { // "ROTATION_NONE" or unknown string
gr_rotate(GRRotation::NONE);
}
rotation = GRRotation::LEFT;
//修改这里 add rotation = 3 for recoveryUI landscape
含义:
rotation = GRRotation::LEFT; 270
rotation = GRRotation::DOWN; 180
rotation = GRRotation::RIGHT; 90