文章目录
- 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实现分析