该仓库包含 Rockchip 电源扩展接口的实现,用于 Android,通过 Android 硬件抽象层 (HAL) 提供增强的电源管理功能。
电源扩展接口提供了标准 Android 电源 HAL 之外的额外电源管理功能。它包括:
- Magic Boost - 扩展的电源接口,可以使特定任务申请不同场景的加速
- 电源提示会话 - 针对不同应用场景的增强型电源提示处理
- 加速会话 - 用于应用程序性能优化的专用加速功能
configs/- 配置文件,包括一些默认的 profile,能够通过配置选择加速参数。default/- 扩展部分接口的默认实现,包含 BoostSession 和 MagicBoost 类,这部分默认的 AOSP 不会调用到,给 RK 上层增加的服务调用。libmagicboost_manager/- 管理魔法加速功能的核心库power_ext/- AOSP Power aidl 的默认实现,会将 MagicBoost 扩展作为 power aidl 的插件注册到系统。通过 libmagicboost_manager 去管理控制所有硬件节点。vts/- VTS(供应商测试套件)测试,用于验证实现
提供了一种机制,可以为特定任务临时提升设备性能。它通过以下方式实现:
MagicBoost.h/cpp- 默认服务中的核心实现MagicBoostManager.h/cpp- 用于管理加速状态和参数的库magic_boost.json- 定义加速参数的配置文件
Power AIDL 的主要实现包括:
Power.h/cpp- 主电源 HAL 扩展实现PowerHintSession.h/cpp- 增强的电源提示会话处理
专用的加速功能在以下文件中实现:
BoostSession.h/cpp- 加速会话管理
该模块作为 Android 构建系统的一部分,使用每个目录中的 Android.bp 文件进行构建。
在 vts/ 目录中有 VTS 测试,可用于验证电源扩展接口的正确实现。
可以通过 adb shell dumpsys 命令与 Power HAL 进行交互,以进行调试和状态检查。
执行以下命令可以查看 MagicBoost 管理器的当前状态,包括已发现的硬件集群(CPU, GPU 等)及其当前状态(频率,调节器等)。
adb shell dumpsys android.hardware.power.IPower/defaultdumpsys 命令支持多种参数,用于控制日志记录、功能开关和信息展示:
debug_on: 启用详细的调试日志。日志将输出到 logcat 中,tag 为MagicBoostAIDL。debug_off: 关闭调试日志。enable: 启用 MagicBoost 管理器。disable: 禁用 MagicBoost 管理器并释放所有性能锁,将硬件恢复到默认状态。trace_on: 开始跟踪长时持有(indefinite)的 profile 锁。trace_off: 停止并清除跟踪数据。profiles: 在输出中包含所有可用的 profile 列表。trace: 在输出中包含当前被跟踪的 profile 锁的详细信息。load <file>: 加载一个自定义的配置文件。
示例:
# 打开调试日志并查看可用的 profile
adb shell dumpsys android.hardware.power.IPower/default debug_on profiles这是一个非常强大的调试功能,允许您在设备运行时动态加载一个新的配置文件,而无需重新编译或重启设备。这对于快速测试和微调 profile 非常有用。
使用方法:
-
将您修改后的
magic_boost.json(或任何其他自定义配置文件) 推送到设备上,例如/data/local/tmp/目录:adb push configs/magic_boost_rk3588.json /data/local/tmp/test_config.json
-
使用
load命令让 Power HAL 加载这个文件:adb shell dumpsys android.hardware.power.IPower/default load /data/local/tmp/test_config.json
加载后,文件中定义的 profile 将会覆盖或添加到当前运行的配置中。您可以通过再次执行 dumpsys 并带上 profiles 参数来验证更改是否生效。
configs/ 目录中的 magic_boost.json 文件定义了魔法加速功能的参数。可以根据设备特定要求自定义此文件。该文件主要包含两部分:hardware_info 和 profiles。
hardware_info 数组定义了可控的硬件单元及其对应的 sysfs 节点信息。每个硬件单元是一个 JSON 对象,包含以下字段:
name: 硬件的唯一标识符 (例如: "cpu", "gpu")。description: 硬件的描述。base_path: 该硬件在 sysfs 中的基础路径。parser: 用于解析该硬件 sysfs 目录结构的解析器类型。例如,policy用于 CPU,因为它有policyX子目录。info_min_path/info_max_path: 读取硬件支持的最小/最大值(例如频率)的节点文件名。min_path/max_path: 控制硬件最小/最大值的节点文件名。governor_path: 控制硬件调节器 (governor) 的节点文件名。default_gov: 默认的调节器。
修改示例: 如果您的设备的 GPU sysfs 路径不同,您可以修改 gpu 条目的 base_path。
{
"name": "gpu",
"description": "GPU",
"base_path": "/sys/class/devfreq/new_gpu_path",
...
}profiles 数组定义了不同的性能模式。有两种类型的 profile:
-
基础 Profile (Base Profiles): 直接控制硬件节点。
name: Profile 的唯一名称 (例如:cpu_base_highest)。nodes: 一个数组,定义了要操作的硬件节点。alias: 对应hardware_info中的一个name,指定要控制哪个硬件。index: 指定要控制的硬件索引。all表示所有。对于 CPU,可以是 "0", "4" 等。path_alias: 一个数组,指定要写入的节点,对应hardware_info中的路径别名 (例如:max_path,min_path)。value: 要写入的值。可以是具体数值,也可以是max或min,表示使用硬件信息中读取到的最大/最小值。
示例:
cpu_base_highestprofile 将所有 CPU 核心的最小和最大频率都设置为其支持的最高频率。{ "name": "cpu_base_highest", "description": "Basic CPU adjuster, all cores highest frequency", "nodes": [ { "name": "cpu_freq_all_max", "alias": "cpu", "index": "all", "path_alias": ["max_path", "min_path"], "value": "max" } ] } -
复合 Profile (Composite Profiles): 组合多个已有的 Profile。
name: Profile 的名称 (例如:LAUNCH)。alias: 一个包含其他 Profile 名称的数组。
示例:
LAUNCHprofile 是一个复合 profile,它激活了多个基础 profile,以在应用启动时提升 CPU, GPU, UFS, VOP 和 DDR 的性能。{ "name": "LAUNCH", "description": "AOSP App launch profile", "alias": [ "cpu_base_highest", "gpu_base_highest", "ufs_base_highest", "vop_base_highest", "ddr_base_highest" ] }
如何自定义 Profile:
您可以添加新的基础 profile 来微调某个硬件,或者创建新的复合 profile 来应对特定的应用场景。例如,要创建一个新的游戏模式,可以组合不同的基础 profile,甚至可以为该模式创建一个新的基础 profile,专门设置某个硬件参数。
系统支持通过创建特定的 JSON 配置文件来覆盖默认的 magic_boost.json 中的 profiles 或为特定硬件平台/产品添加新的 profiles。
系统启动时,会按以下顺序加载配置文件:
/vendor/etc/power/magic_boost.json(或 APEX 路径下的) - 这是基础配置文件。- 基于平台 (
ro.board.platform) 的配置文件,例如:.../magic_boost_rk3588.json。 - 基于产品型号 (
ro.product.odm.model) 的配置文件,例如:.../magic_boost_MyDevice.json。
加载是增量式的。如果后续加载的配置文件中包含与已加载的 profile 同名的 profile,则新的 profile 会覆盖旧的。如果 profile 名称是新的,则会被添加进去。hardware_info 部分只在 magic_boost.json 中解析,后续的配置文件应只包含 profiles 数组。
假设我们想为 RK3588 平台修改 EXPENSIVE_RENDERING 这个 profile 的行为。
-
创建新的配置文件: 在
configs/目录下创建一个名为magic_boost_rk3588.json的新文件。 -
定义覆盖 Profile: 在该文件中,我们只定义需要覆盖或添加的
profiles。例如,我们让EXPENSIVE_RENDERING只提升 DDR 频率:{ "profiles": [ { "name": "EXPENSIVE_RENDERING", "description": "RK3588 Expensive rendering profile", "alias": [ "ddr_base_highest" ] } ] }当系统在一个
ro.board.platform属性为 "rk3588" 的设备上运行时,这个新的EXPENSIVE_RENDERING定义会覆盖magic_boost.json中的默认定义。 -
更新构建文件: 最后,需要将这个新的配置文件添加到
configs/Android.bp中,以便编译系统能将它打包到系统中。apex_defaults { name: "rockchip-power_ext-config-default", prebuilts: [ "magic_boost.json", "magic_boost_rk3588.json", // 添加新文件 ], } prebuilt_etc { name: "magic_boost_rk3588.json", // 为新文件添加 prebuilt_etc vendor: true, src: "magic_boost_rk3588.json", filename_from_src: true, }
通过这种方式,您可以为不同的硬件平台或产品型号维护一套独立的、可覆盖的性能配置,而无需修改基础的 magic_boost.json 文件。
该实现遵循 Android 的 AIDL(Android 接口定义语言)来实现电源扩展接口,提供了一种标准化的方法,使 Android 框架可以访问 Rockchip 特定的电源管理功能。