本帖最后由 xusheng 于 2025-12-10 19:57 编辑
【运行环境】 硬件:Hi3751v352 ;软件:Android 9 SDK
【问题描述】 按文档描述无法实现开机视频。
【问题分析】 开机视频播放流程图如下,可见在显示开机Logo后,根据prop.service.bootop.type属性,选择播放开机动画还是开机视频。 相关文档描述摘录: - 默认开机视频播放流程:Kernel启动后播放单板/data/local/bootvideo.mp4
- 开机视频相关配置文件:vendor/hisilicon/modules/hibootvideo/config.xml
- 相关property配置文件:device/hisilicon/bigfish/Hi3751 V350/device_property.mk
【修改过程】
1. 文档描述的配置文件和开机视频存放位置 与 SDK 不一致。
2. 配置文件位置:device/hisilicon/bigfish/prebuilts/config.xml
- <?xml version='1.0'?>
- <config>
- <bootvideo>
- <property key="path1" value="<font color="#ff0000">/data/local/data/bootvideo.mp4</font>"/>
- <property key="path2" value="/data/local/data/bootvideosnd.mp4"/>
- <property key="strPath1" value="/data/local/data/strbootvideo.mp4"/>
- <property key="strPath2" value="/data/local/data/strbootvideosnd.mp4"/>
- <property key="isEnableInput" enable="true"/>
- <property key="isEnableUI" enable="true">
- <property key="isEnableCountDown" enable="true" language="en"/>
- <property key="isEnableVolumeBar" enable="true"/>
- <property key="isEnableVolumeMute" enable="true"/>
- </property>
- </bootvideo>
- </config>
复制代码
3. 将开机视频放入单板/data/local/data 目录,重启,仍显示为开机动画。检查相关属性,发现值不为bootvideo
console:/ # getprop | grep bootop
[prop.service.bootop.type]: [bootanim]
4. 手动修改单板init.rc,强制属性值为bootvideo,重启后没有生效,发现值仍为bootanim
on early-init
# Set init and its forked children's oom_adj.
write /proc/1/oom_score_adj -1000
....
start ueventd
setprop prop.service.bootop.type bootvideo
5. 修改文件device/hisilicon/Hi3751V350/device_property.mk,重新编译
- PRODUCT_PROPERTY_OVERRIDES += \
- ro.prop.bootanim.path=/atv/bootvideo/bootanimation.zip \
- service.bootvideo.volume=-1 \
- prop.atv.init=false \
- prop.dtv.init=false \
- <font color="#ff0000">prop.service.bootop.type=bootvideo</font> \
- persist.service.strbootop.type=none \
- persist.prop.dfx.enable=true \
- persist.prop.xbug.enable=false
复制代码
将生成后的system.ext4 和 vendor.ext4 烧录到单板,再将bootvideo.mp4放入/data/local/data/ 目录中,重新复位,则可正常显示开机视频。
【背景知识】
1. Android 属性
PRODUCT_PROPERTY_OVERRIDES 是一个 Makefile 变量,用于定义一系列键值对形式的系统属性。android默认属性会在构建系统镜像(如 system.img)时被处理并写入到 /system/build.prop 文件中。
Android 8.0 引入 Project Treble 后,将系统划分为:
- System 分区:AOSP 通用代码(Google 控制)
- Vendor 分区:SoC 和设备厂商私有实现(厂商控制)
Android 10+:引入 /product、/system_ext 等更多分区,属性来源更分散。
2. 属性加载流程
- 内核 cmdline 如androidboot.*参数,通过/proc/cmdline读取,由init转为ro.boot.*属性
- /system/build.prop AOSP 默认属性
- /vendor/build.prop 厂商属性
- /product/build.prop 产品级属性(Android 10+)
- init.rc 及其包含的 .rc 文件 通过setprop命令或on property:触发逻辑
- 运行时 setprop shell 或 native 代码动态设置(非ro.属性)
build.prop 是在 init 初始化早期通过代码(property_load_boot_defaults())加载的;而 init.rc 是在 init 解析 rc 文件阶段执行的,时间上晚于 build.prop 的加载。
3. 为何在init.rc 中设置属性值为bootvideo,并没有起作用?
prop.service.bootop.type 是一个系统保留的属性,且在应用中会进行相关操作,其值只能在build.prop或更早阶段设定,不能在init.rc中动态修改。
|