0. 问题背景

我司一个android项目中,只有一个devicename的情况下,需要集成两套power_profile.xml。原因是两者的电池参数存在差异。而我们当前的设计逻辑是使用了missi的rro overlay机制来实现的。但是这种机制是依赖于devicename的,也就是说一个devicename只能适配一个power_profile.xml。而且由于一些限制,我们并不能轻易的修改missi侧的java源码!

1. 方案设计

missi的代码我们不能轻易修改,所以我决定将这部分的代码放在vnd侧!

切换overlay apk的触发条件设置为一个property属性!

1.1 编译两套overlay apk

两种overlay需要分别定义独立的apk文件,例如:

  • xxx_1_overlay.apk
  • xxx_2_overlay.apk

Overlay 文件的核心是 res/xml/power_profile.xml,每个 APK 的内容是不同的功耗参数。

project/
├── overlays/
│   ├── xxx_1/
│   │   ├── AndroidManifest.xml
│   │   └── res/
│   │       └── xml/
│   │           └── power_profile.xml
│   ├── xxx_2/
│       ├── AndroidManifest.xml
│       └── res/
│           └── xml/
│               └── power_profile.xml

第一个AndroidManifest.xml示例如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.spring_1_overlay">
    <application
        android:hasCode="false" />
    <overlay
        android:targetPackage="android"
        android:priority="1"
        android:requiredSystemPropertyName="ro.power.profile"
        android:requiredSystemPropertyValue="xxx" />
</manifest>

第二个AndroidManifest.xml示例如下:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.spring_1_overlay">
    <application
        android:hasCode="false" />
    <overlay
        android:targetPackage="android"
        android:priority="1"
        android:requiredSystemPropertyName="ro.power.profile"
        android:requiredSystemPropertyValue="yyy" />
</manifest>

这里的重点就是设置了overlay apk的触发条件:android:requiredSystemPropertyName="ro.power.profile"

让两个overlay apk参与编译,在手机里生成两个对应的overlayapk

PRODUCT_PACKAGES += \
    FrameworksResTarget_Vendor \
    FrameworksResTarget_Vendor2

1.2 设置切换条件

rc文件里在early-init阶段时,通过bootid设置ro.power.profile属性(通过ro.power_profile的属性来动态切换overlay apk

on early-int && on property:ro.boot.hwc=CN
    setprop ro.power.profile=xxx

on early-int && on property:ro.boot.hwc=IN
    setprop ro.power.profile=yyy

3. 方案验证

4. change

https://gerrit.odm.mioffice.cn/c/platform/vendor/qcom-proprietary/resource-overlay-vendor/+/755237

https://gerrit.odm.mioffice.cn/c/device/xiaomi/mivendor/+/756750

5. 参考文档

https://hexo.iliuqi.com/2024/12/14/how-to-check-rro-resources/