Android 车机系统 One Binary 适配白天黑夜的一个方案

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 1920
    1080
    mcc101 -> A01 1920720
    mcc102 -> C03 1920
    1080 ……

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 到系统中

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值