OTA 知识点整理从添加分区到界面设计
  HvTJUzsxOBtS 2023年11月25日 20 0



文章目录

  • OTA 知识点整理##
  • 1、OTA之分区添加
  • 1)先去配置添加分区的挂载
  • 2)拷贝烧写的镜像文件到目标包
  • 3)烧写misc.img镜像
  • 2、对于制作升级包时获取 目标包里面的镜像文件的路径
  • 3、升级包时不同时间的版本可以相互升级
  • 4、升级界面显示
  • 1)、自定义图片 test.png
  • 5、控制进度条的快慢或者旋转
  • 6、android 9.0 以上有时遇到问题
  • 1)编译ota 显示fstab 文件缺少分区挂载
  • 2) ota 升级过程中可能出现 matrix 系统验证问题
  • 3 ) avb 验证问题
  • 4) sha256 dm-verity签名验证 问题
  • 5) 制造 ota 差分包出错,找不到 bsdiff,imgdiff singlejar.apk 等
  • 7、总结:


OTA 知识点整理##

这是建立在有完整的recovery 模式下面的添加。

1、OTA之分区添加

添加 misc 分区为例,把misc 换成 data system boot modem 等分区同样适用

1)先去配置添加分区的挂载

一般在:
device/项目名/平台名/conf/fssrab.recovery.项目名

/dev/block/platform/****.dwmmc0/by-name/boot            /boot           emmc    defaults                        defaults
/dev/block/platform/****.dwmmc0/by-name/system          /system         ext4    ro                              wait
省略~
+ /dev/block/platform/****.dwmmc0/by-name/misc            /misc           emmc    defaults                        defaults
2)拷贝烧写的镜像文件到目标包

build/core/Makefile
在适当的位置添加

$(hide) mkdir -p $(zip_root)/MISC
	$(hide) $(ACP) "路径/misc.img" $(zip_root)/MISC/misc.img

样就会在目标包生成相应的一个MISC 文件,同时里面有拷贝过来的misc.img

3)烧写misc.img镜像

build/tools/releasetools/ota_from_target_file.py

ota_from_target_file.py 这个文件包含了OTA升级所有步骤,包括全包升级 ,差分包升级,是采用文件烧录方式还是block方式去升级等。

在合适位置添加

#(update modem)
  misc_img = common.GetBootableImage("/tmp/misc.img", "misc.img",
                                      OPTIONS.target_tmp, "MISC")
  common.CheckSize(misc_img.data, "misc.img", OPTIONS.info_dict)
  common.ZipWriteStr(output_zip, "misc.img", misc_img.data)
  script.WriteRawImage("/misc", "misc.img")

这一步就是在OTA升级的时候会烧写你升级包里的misc 分区。

2、对于制作升级包时获取 目标包里面的镜像文件的路径

比如获取target 包里面的 recovery.img 的路径
相关文件:

build/tools/releasetools/ota_from_target_file.py
 recovery_img = common.GetBootableImage("recovery.img", "recovery.img",
                                         OPTIONS.input_tmp, "RECOVERY")

跳转

build/tools/releasetools/common.py
 def GetBootableImage(name, prebuilt_name, unpack_dir, tree_subdir,
525                     info_dict=None):
省略`````````
536
537  prebuilt_path = os.path.join(unpack_dir, "IMAGES", prebuilt_name)
538  if os.path.exists(prebuilt_path):
539    print "using prebuilt %s from IMAGES..." % (prebuilt_name,)

       //这个name, prebuilt_path  就是对应的target 包解压之后,对应的镜像文件的名字,和镜像文件存放的缓存路径。
540    return File.FromLocalFile(name, prebuilt_path)
541
542  print "building image from target_files %s..." % (tree_subdir,)
543
省略````````
549558  if data:
559    return File(name, data)
560  return None
3、升级包时不同时间的版本可以相互升级

build/core/Makefile

$(hide) PATH=$(foreach p,$(INTERNAL_USERIMAGES_BINARY_PATHS),$(p):)$$PATH MKBOOTIMG=$(MKBOOTIMG) \
	   ./build/tools/releasetools/ota_from_target_files -v -n\  (添加 -n 参数)
 	   --block \
	   -p $(HOST_OUT) \
	   -k $(KEY_CERT_PAIR) \
	   $(if $(OEM_OTA_CONFIG), -o $(OEM_OTA_CONFIG)) \
	   $(BUILT_TARGET_FILES_PACKAGE) $@
4、升级界面显示
1)、自定义图片 test.png

(1)把文件拷贝到
bootable/recovery/images/文件
(2)bootable/recovery/screen.h文件 添加定义

+   GRSurface* test;

(3)bootable/recovery/Screen_ui.cpp 加载图片

LoadBitmap("test", &test);

设定图片显示的位置

int ScreenRecoveryUI::GetTestBaseline() {
    return  GetTextBaseline() - PixelsFromDp(50) - gr_get_height(test);
}
int ScreenRecoveryUI::GetTextBaseline() {
    return  GetTextBaseline() - PixelsFromDp(50) - gr_get_height(installing_text);
}

这部分 代码的功能即使确定显示 升级是图片的位置Y坐标。

//获取图片宽度
int test_width = gr_get_width(test);
//获取图片高度
int text_height = gr_get_height(test);
//获取x坐标
int text_x = (gr_fb_width() - gr_get_width(test)) / 2;
//获取Y坐标            
 int text_y = GetTestBaseline();

显示图片

gr_blit(test, 0, 0, test_width, text_height, text_x, text_y);

这样就能把图片在相应的位置显示出来了。(显示不出来可能是图片的格式不对,一些参数设置不正确。)

倘若显示的图片有色彩,但是色彩被改变了:
bootable/recovery/minu/resources.cpp

#if defined(RECOVERY_ABGR) || defined(RECOVERY_BGRA)
    png_set_bgr(png_ptr);
#endif

看一看是不是rgba 转换了

5、控制进度条的快慢或者旋转

void ScreenRecoveryUI::ProgressThreadLoop() {

}
主要是在这个函数里面通过控制progress 来控制进度条。
可以修改此函数,结合上面的图片替换来修改进度条是长条的,还是loop circle.

6、android 9.0 以上有时遇到问题
1)编译ota 显示fstab 文件缺少分区挂载

可以再conf 文件下 新建一个 f’stab 分区文件,用于 ota 升级 对分区的识别
同时修改 BoadCofig.mk 文件,将ota 读写的fstab 文件路径修改成自己的

2) ota 升级过程中可能出现 matrix 系统验证问题

是由于 9.0 之后 system 分区 分成 system vendor 分区,需要两个系统img 镜像版本一样,具体去google 上下载 path 即
replace_img_from_target_files.py 脚本

3 ) avb 验证问题

大多是 avb 验证出现问题 需要同时升级 vbmeta dtbo system boot vendor 分区,同时将 资源包的 recovery_dtbo 来源 由原来的 out 下 dtbo.img 替换为 prebuilt_dtbo.img
可在makefile 里定义修改

avb 可参考 : https://source.android.google.cn/devices/architecture/vintf/match-rules?hl=zh_cn#avb-version-ota

4) sha256 dm-verity签名验证 问题

Android OTA差分包升级失败 img sha 验证问题

参考官网 path:
https://source.android.google.cn/devices/architecture/vintf/match-rules?hl=zh_cn#avb-version

5) 制造 ota 差分包出错,找不到 bsdiff,imgdiff singlejar.apk 等

ota 差分包制作脚本 引用 相对路径和绝对路径来寻找文件工具等,看看项目是不是 在 out 目录, 然后这些 diff 工具 在 out/host 目录下都可以找到

7、总结:

OTA升级主要是这个思想:
1)添加分区挂载
2)添加升级的img到目标包
3)添加升级的img或者img的差异到升级包。

文献参考:
1、实现Recovery形式本地化显示文本定制(recovery_l10n工具的使用

2、实现Recovery模式本地化显示文本定制(recovery_l10n工具的使用)

3、Android Recovery 源码解析和界面定制

4、Android recovery UI实现分析

5、如何修改Recovery的字符串资源(修改显示字体颜色和大小)

6、分享Android recovery updater-script进度条函数的使用经验

7、Android5.0 Recovery源代码分析与定制(一)

8、 Android5.0 Recovery源代码分析与定制—recovery UI相关(二)

9、Android 5.X与Android4.X版本机器人动画的区别以及制作动画的方法

10、Recovery 中的UI知识积累

12、 Android recovery UI实现分析


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月25日 0

暂无评论

推荐阅读
HvTJUzsxOBtS