如何实现动态切换rro?

20241214-194714.jpg

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 的内容是不同的功耗参数。

1
2
3
4
5
6
7
8
9
10
11
12
project/
├── overlays/
│ ├── xxx_1/
│ │ ├── AndroidManifest.xml
│ │ └── res/
│ │ └── xml/
│ │ └── power_profile.xml
│ ├── xxx_2/
│ ├── AndroidManifest.xml
│ └── res/
│ └── xml/
│ └── power_profile.xml

第一个AndroidManifest.xml示例如下:

1
2
3
4
5
6
7
8
9
10
<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示例如下:

1
2
3
4
5
6
7
8
9
10
<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

1
2
3
PRODUCT_PACKAGES += \
FrameworksResTarget_Vendor \
FrameworksResTarget_Vendor2

1.2 设置切换条件

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

1
2
3
4
5
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/