1.资源匹配的优先级
- values-mcc310(sim卡运营商)-en-sw320dp-w720dp-h720dp-large-long-port-car-night-ldpi
2.背景
- 目前已知的车机联网都是通过 T-Box, Android 系统中的 mcc config 字段都是空 适配 UI 时可以偷用此字段:如
19201080 屏幕开机时把 config.mcc 设置成 100 ,UI适配时把此型号的所有资源都放到 values-mcc100
文件夹中,应用启动后自动加载 values-mcc100 资源。 以后开发的型号可以做一个映射表,一个 mcc 对应一个型号,如:
mcc100 -> A01 19201080
mcc101 -> A01 1920720
mcc102 -> C03 19201080 ……
3.系统中如何设置此字段:
- Configuration config = new Configuration(); config.mcc = 100;
ActivityManager.getService().updateConfiguration(config);
此段代码加在启动较早的服务或者应用中即可,以后所有启动的 App 会优先加载 values-mcc*** 的资源。
values-mcc100的数字定义范围:100~999
4.另外:
- 1.动态更改 mcc 时,存活的 Activity 并不会收到 config change 事件,静态换肤可以考虑用 mcc 方案,动态换肤需要改造 FW。
2.以上举例都是以 values 举例,实际上 layout、drawable、color、anim……都适用以上原则
3.对于指定分辨率的属性(例如: A01 1920*1080 需要使用 values-1792x1080),指定分辨率属性并没出现在官网的匹配属性集里,并且它的优先级最低,不建议使用此种方式。
5.具体举例:
A01 分乘用版和越野版,并且需要支持白天黑夜模式(Google 原生的白天黑夜模式)。
乘用版和越野版的白天模式使用的是同一套主题资源。
乘用版黑夜模式使用的是绿色主题,越野版黑夜模式使用的是橙色主题。
为了让大家快速适配主题:
乘用版、越野版的白天模式主题资源放到默认的或者 A01 flavor下默认的文件夹即可。如 values, drawable……
乘用版绿色主题:
创建对应的 *****-mcc100-night 文件夹下:如 values-mcc100-night, drawable- mcc100-night ……
越野版橙色模式:
创建对应的 ***-mcc110-night 文件夹下:如 values-mcc110-night, drawable-mcc110-night ……
验证:
1.安装:***-debug.apk
2.启动 设置主题应用:adb shell am start -n XXXXXXX
3.手动设置到需要验证的主题:白天、绿、橙
4.启动自己的应用
5.验证效果
注意事项:
1.每次切换主题 AMS 会重启已经启动的 Activity,如果不想让系统重启 Activity,可以在 manifest 中对应的 Activity 上加上:
android:configChanges=“uiMode”, 并且需要在 Activity 中复写 onConfigurationChanged, 在其中实现换肤。
2.如果应用在 Service 中使用 WindowManager addView 方式创建的视图,则 Service 需要加入 android:configChanges=“uiMode” , 并且复写 onConfigurationChanged, 在其中实现换肤逻辑
为了实现在开机较早阶段就设置系统的 mcc 属性:
/frameworks/base/services/java/com/android/server/SystemServer.java
private void startOtherServices() {
......
// We now tell the activity manager it is okay to run third party
// code. It will call back into us once it has gotten to the state
// where third party code can really run (but before it has actually
// started launching the initial applications), for us to complete our
// initialization.
mActivityManagerService.systemReady(() -> {
......
traceBeginAndSlog("******");
// 创建一个 Manager 把 mcc 值设置下去
traceEnd();
......
}, BOOT_TIMINGS_TRACE_LOG);
}
1.获取车型信息
SystemProperties.get(******)
2.SystemServer.java 本身所在的模块 system_server 需要增加读取指定 SystemProperties 的权限(sepolicy)
system_server.te
get_prop(system_server, ******)
3.创建映射表:
car_product/overlay/frameworks/base/core/res/res/values/arrays.xml
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<string-array name="project_mcc">
<item>******,******</item>
<item>******,******</item>
</string-array>
</resources>
car_product/overlay/frameworks/base/core/res/res/values/symbols.xml
<!-- These resources are around just to allow their values to be customized
for different hardware and product builds. Do not translate. -->
<resources xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2">
......
<java-symbol type="array" name="project_mcc" />
</resources>
4.***Manager 根据 string-array 创建出映射表,从 SystemProperties 读取到当前的车型,在映射表中查找到 mcc 数值,使用 AMS 设置 mcc 到系统中