Android OTA系统升级

587 阅读2分钟

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