Change Log #

  • 为海信新增 ID13,功能与 ID8 相同;
  • 在 config 中新增 device 字段,用于区分不同机型,如 hisense 代表海信,并在 VendorHelper 中增加 isHisense() 接口;
  • project_id 结构从 1-IVA1-3FFF-0EDF 改为 1-IVA1,并新增 port_configfunction_config
  • camera_source_num 从 bit8 和 bit9 中移除,改为在 config 中配置;
  • miracast 从 config 中移除,改为在 function_config 的 bit8 中配置,bit9 空缺;
  • 功能解析器(没有上 code):P:\temp\from simon.li\project_id\feature_trans.html
  • 新增云服务开关
    • 海外不支持
    • A1 不支持
    • 4G DDR 不支持
    • 默认横板 UI 不支持(如海信)
    • 其他都支持
  • 新增美颜开关
    • 除录播以外都支持
  • 新增 ID2
    • 删除未使用的 ID;
    • 新增 ID2 作为录播机;

project_id.xml 修改原则 #

  • 开关( 0 和 1 两种取值)
    • 硬件相关:放入 port_config。如 hdmi1 在 bit0 中;
    • 功能相关:放入 function_config。如 mriacast 在 bit9 中;
  • 多种取值:新增字段。如 camera_source_num
  • 取值动态改变:禁止放入 project_id.xml。如多路贴图在设置中有开关,会改变 property,放在 project_id.xml 中会导致用户修改的值被重置。

字段说明 #

displaymode #

  • 格式
    • 1:1,2,31 代表默认显示模式,1,2,3 代表支持的显示模式列表。
    • 3:*3 代表默认显示模式,* 代表支持所有显示模式。显示模式列表在 com.intellyva.common.display.DualDisplays.java
    • 3,等同于 3:3,即默认显示模式为模式三,支持的显示模式也只有模式三
    • 格式非法时,返回 1,即默认和支持的显示模式都为模式一
  • 命名规则:'project_id_LOGO'_bootup.bmp,如 IVA1_bootup.bmp。编译后会拷贝到:/odm_ext/logo_files/
  • 格式要求:BMP,RGB565,分辨率:1920*1080,位深:24bit。
  • 大小:需要进行 gzip 压缩然后重命名为之前的名字后再放入,如:gzip bootup.bmpmv bootup.bmp.gz bootup.bmp。原因:存放bootlogo的odm_ext分区目前只有16M,如果太大在mboot阶段挂载会很耗时。
  • 更换 Logo 需要全编译

bootvideo #

  • 命名规则:'project_id_LOGO'_bootvideo.mp4 例如: IVA1_bootvideo.mp4。编译后拷贝到:/vendor/etc/
  • 格式要求:使用 MediaPlayer 播放,常规格式都支持。建议分辨率:1920*1080。

示例 #

<id value="8-IVA1">
	<config device="intellyva" name="逸色直播" port_config="3FFF" function_config="5FDF" bootvideo="iva1_bootvideo.mp4" camera_source_num="3" language="zh-CN" timezone="Asia/Shanghai" displaymode="1"/>
</id>

调整 project_id 启动时序 #

persist 变量的问题 #

project_id 启动过早,data 分区还没有初始化成功,因此 property_get 无法读取,property_set 只会设置到内存,不会写到 /data/property/persistent_properties 中。等到 data 分区 mount 完成,又会把 /data/property/persistent_properties 中存储的变量再次设置到内存一次,这就导致 project_id 中设置的结果可能被覆盖;这也是 liveplayer 在 firstboot 时需要设置一次 displaymode 的原因,如果只在 project_id 中设置,那下次开机就会消失。

使用变量判断 persistent_properties 是否就绪 #

system/core/init/property_service.cpp: ro.persistent_properties.ready

启动时机间隔 #

从 project_id 启动到 persist_properties ready 的间隔:avg = 1254.4ms

# 1217ms
01-01 08:00:03.555   302   302 D Intellyva_project_id: [main:362] start
01-01 08:00:04.772   302   302 D Intellyva_project_id: [main:371] stop

# 1330ms
01-01 08:00:03.569   302   302 D Intellyva_project_id: [main:362] start
01-01 08:00:04.899   302   302 D Intellyva_project_id: [main:371] stop

# 1224ms
01-01 08:00:03.591   302   302 D Intellyva_project_id: [main:362] start
01-01 08:00:04.815   302   302 D Intellyva_project_id: [main:371] stop

# 1265ms
01-01 08:00:03.602   300   300 D Intellyva_project_id: [main:362] start
01-01 08:00:04.867   300   300 D Intellyva_project_id: [main:371] stop

# 1236ms
01-01 08:00:03.624   300   300 D Intellyva_project_id: [main:362] start
01-01 08:00:04.860   300   300 D Intellyva_project_id: [main:371] stop

project_id 的启动 #

device/amlogic/t7_an400/init.amlogic.board.rc /vendor/etc/init/hw/init.amlogic.board.rc

/system/core/rootdir/init.rc+526 class_start early_hal

在Android的init.rc文件中,服务的启动行为是由多个属性来控制的。让我们逐一分析这段代码中定义的intellyva_project_id服务,以确定它是否会直接启动。

13 #intellyva project_id
14 service intellyva_project_id  /system/bin/project_id
15     class early_hal
16     console
17     group system
18     oneshot
19     seclabel u:r:intellyva_project_id:s0

服务定义: 第14行定义了一个名为intellyva_project_id的服务,它运行/system/bin/project_id这个可执行文件。 class early_hal: 第15行指定了这个服务属于early_hal类。在Android的init进程中,服务根据其所属的类在不同的阶段被启动。early_hal类通常表示这个服务需要在系统启动的早期阶段被启动,特别是在HAL(硬件抽象层)服务之前。这意味着,如果系统配置为在启动过程中启动early_hal类的服务,这个服务将有机会在系统启动的早期阶段被启动。 console: 第16行的console属性表明这个服务的输出将被重定向到控制台。这对于调试和日志记录可能是有用的。 group system: 第17行将服务分配给了system组。这通常意味着服务将以系统权限运行,但这并不直接决定服务的启动行为。 oneshot: 第18行的oneshot属性表示这个服务只会在它第一次被请求时启动。如果服务已经运行,后续的启动请求将不会重新启动它。然而,这并不直接说明服务是否会在系统启动时自动启动;它更多地是关于服务在后续请求中的行为。 seclabel u:r:intellyva_project_id:s0: 第19行的seclabel属性为服务指定了一个SELinux安全上下文。这是Android安全模型的一部分,用于限制服务可以访问的资源。这个属性同样不直接决定服务的启动行为。 结论:

intellyva_project_id服务被分配到了early_hal类,这意味着它有机会在系统启动的早期阶段被启动。然而,是否真的会直接启动还取决于系统的具体配置和init进程的启动顺序。在Android的某些版本或定制系统中,early_hal类的服务可能默认会被启动,但在其他情况下可能不是。 因此,没有额外的上下文信息(如系统的init.rc文件的其他部分或特定的系统配置),我们无法确定intellyva_project_id服务是否会在系统启动时直接启动。通常,要确定这一点,需要查看系统的完整init脚本和配置。

ro.persistent_properties.ready 之后再启动 intellyva_project_id #

先移除 class early_hal,再添加下面的代码:

on property:ro.persistent_properties.ready=true
    start intellyva_project_id

最终解决方案 #

修改 project_id 启动时序,确保其在 properties ready 之后,zygote 启动前启动。主要调整代码在 init.rc 中,利用 wait_for_prop 阻塞 init.rc 的执行,直到 properties ready 为止。project_id 初始化完成后,会把 ro.project_id.ready 设置为 true,使得 init.rc 可以继续执行。

回到 project_id 这个进程,因为可以保证 properties 服务生效,则可以正常读取和设置 persist 开头的 property,这样就可以利用 LiveSetting 设置的 persist.project_id.change_flag 这个 property 来判断用户有没有切换 project id,如果有切换,则重新设置 display mode。这是一个临时变量,只有切换后的第一次开机生效,由 SystemService 重置为 false。

commit

后续优化方向 #

  1. 把 project_id 中的 bootlogo 也放到 config 中配置,project_id 中只保留 index。困难点:bootloader 中通过解析 project_id 中的 bootlogo 来获取 bootlogo 的路径。如果把 bootlogo 放到 config 中配置,需要想办法在 project_id.cpp 中设置 bootloader 的环境变量。有做过初步尝试,但有编译问题。

  2. 在 xml 中增加 version,并把 vendor.platform.support 系列环境变量(重启丢失)改为 persist 开头的环境变量,当版本相同时,不再执行解析 xml 的行为。困难点:project_id.cpp 启动时机非常早,目前实验结果,persist 开头的环境变量用 property_get() 调用读不到。这样就没办法做版本比对,后续可以考虑调整 project_id 的启动时机,但同时要保证 project_id 能够正常设置 ro.boot.model;也尝试过用 unifykey 存储 version,但是 unifykey 需要配置 dts,逻辑更复杂,暂时不考虑。


https://cplusplus.com/

DynamicModel

TinyXML-2文档

Google C++ 风格指南

在 unifykey 中增加字段,并设置 ro.boot.project_id 参考修改

设置 ro.boot.project_id

说明文档 /vendor/intellyva/prebuilt/project_id/

逻辑代码 /vendor/intellyva/executables/project_id/

单独编译命令

source iva_env -b player -v userdebug && mmma vendor/intellyva/executables/project_id/

安装脚本

:P:\temp\from simon.li\project_id\project_id.bat

@echo off

set device_ip=your ip address

adb connect %device_ip%
adb -s %device_ip% root
adb -s %device_ip% remount
adb -s %device_ip% push S:\1021P\out\target\product\t7_an400\system\bin\project_id /system/bin
adb -s %device_ip% push S:\1021P\out\target\product\t7_an400\vendor\etc\project_id.xml /vendor/etc/
adb -s %device_ip% shell sync
adb -s %device_ip% reboot
timeout /t 3 /nobreak

文件在设备中的路径

project_id : /system/bin/project_id

project_id.xml : /vendor/etc/project_id.xml

cmdline : /proc/cmdline

bootlogo : /mnt/vendor/odm_ext/logo_files

build.prop(新增 property) : /vendor/build.prop

文件在源码中的路径

project_id : out/target/product/t7_an400/system/bin/project_id

project_id.xml : vendor/intellyva/prebuilt/project_id/project_id.xml

property_set 最终调用的代码 : bionic/libc/system_properties/system_properties.cpp

bootvideo patch: vendor/amlogic/common/pre_submit_for_google/Bootanimation