MiCarConfig使用文档
云配服务端地址:https://preview.admin.iccc.mioffice.cn/#/remote/app
云配服务端用户使用文档:云配用户使用手册
MiCarConfig版本发布群:

功能和原理
- 用来获取云端的配置
- MiCarService负责与服务端进行交互,获取配置数据,并将数据更新到MiCarConfig中。
- MiCarService开机后会同时启动,并请求一次数据后写入MiCarConfig中。
- MiCarConfig负责将配置数据持久化,并提供给各个App应用。各业务方接入MiCarConfig的接口,进行获取数据。
- 用来获取域名相关配置
- 通过QNX侧传递过来的配置字,来决定系统的统一域名
接入方式
1、接入MiCarConfig的api接口
bp编译
Android.bp的方式接入MiCarConfig
static_libs: [
"mi-car-config",
]gradle编译
com.mi.car.config:api:0.0.15-SNAPSHOT2、接口调用
| 版本 | 用法 |
|---|---|
| 版本 >= 0.0.11-SNAPSHOT (推荐使用) | Java<br/>数据监听接口不再使用~~MiCarConfig.registerContentObserver~~<br/>推荐使用MiCarConfig.queryConfigUri("key")方法获取配置的uri,<br/>然后通过以下方法注册监听。以key为维度,每个observer单独监听。<br/><br/>context.contentResolver.registerContentObserver(<br/> MiCarConfig.queryConfigUri("key"), <br/> false, <br/> object: ContentObserver(Handler(Looper.getMainLooper())) {<br/> override fun onChange(selfChange: Boolean, uri: Uri?) {<br/> super.onChange(selfChange, uri)<br/> val value = MiCarConfig.getString(context, "key", "")<br/> }<br/>})<br/><br/>//通过mqtt上报已有的key-value<br/>MiCarConfig.uploadResponse(mContext, key, value); |
| 版本 >= 0.0.8-SNAPSHOT (推荐使用) | Java<br/>//获取k-v,每次获取value则传入context<br/>MiCarConfig.getString(context, key, "")<br/><br/>//数据监听(域名功能无需关注)<br/>MiCarConfig.registerDataObserver(context, new MiCarConfig.OnDataChangeListener() {<br/> @Override<br/> public void onDataChange(boolean selfChange, Collection<Uri> uris, int flags, int userId) {<br/> //uri 格式 content://config/global_config/key 某个key有更新<br/> //uri 格式 content://config/gloabl_config 不包含key,全量更新<br/> if (uris.size() > 0) {<br/> List<Uri> uri = new ArrayList<>(uris);<br/> List<String> segments = uri.get(0).getPathSegments();<br/> if (segments != null && segments.size() > 0) {<br/> if (segments.size() == 1) {<br/> //有全量更新<br/> } else if (segments.size() == 2){<br/> String key = segments.get(1); // key有更新<br/> }<br/> }<br/> }<br/> }<br/>}); |
| 版本 < 0.0.8-SNAPSHOT (不建议使用) | Java<br/>//初始化<br/>MiCarConfig.init(context);<br/><br/>//获取k-v<br/>MiCarConfig.getString(key, "")<br/><br/>//数据监听(域名功能无需关注)<br/>MiCarConfig.registerDataObserver(new MiCarConfig.OnDataChangeListener() {<br/> @Override<br/> public void onDataChange(boolean selfChange, Collection<Uri> uris, int flags, int userId) {<br/> //uri 格式 content://config/global_config/key 某个key有更新<br/> //uri 格式 content://config/gloabl_config 不包含key,全量更新<br/> if (uris.size() > 0) {<br/> List<Uri> uri = new ArrayList<>(uris);<br/> List<String> segments = uri.get(0).getPathSegments();<br/> if (segments != null && segments.size() > 0) {<br/> if (segments.size() == 1) {<br/> //有全量更新<br/> } else if (segments.size() == 2){<br/> String key = segments.get(1); // key有更新<br/> }<br/> }<br/> }<br/> }<br/>}); |
说明:版本 >= 0.0.8 与 < 0.0.8 的接口中
registerDataObserver已废弃,新版监听请使用 0.0.11+ 的queryConfigUri+registerContentObserver方案。
云控服务调试
调试命令
可以使用adb指令操作Service进行,打印日志和请求服务端等操作,操作结果可以通过logcat查看。
#云控进程的包名:com.mi.car.mcs
#打开log
adb shell am start-service --user 0 -a mcs.cloud.config.debug --es cmd debug --ez enable true
#切换环境,并重新请求数据
#(仅仅云配使用,不涉及系统配置域名的功能)
# 首先,设置云配的环境是否跟随系统的配置字。1 表示使用自己的环境,0 标识跟随系统环境
adb shell settings put global micar_key_host_switch 1 (或0)
# 切换dev/staging/preview/product
adb shell settings put global micar_key_host dev (或preview/staging/product)
# 切换环境后需要杀进程来使环境生效
adb shell pkill -9 com.mi.car.mcs
#请求数据
#全量更新
adb shell am start-service --user 0 -a mcs.cloud.config.debug --es cmd requestData
#增量更新
adb shell am start-service --user 0 -a mcs.cloud.config.debug --es cmd requestData --ez full false
#查看数据库数据
adb shell dumpsys com.micar.ConfigService建议调试步骤
1、首先,开启log日志,shell执行以下命令
logcat默认情况下不会打印日志,需要执行命令将logcat打开
//打开log
adb shell am start-service --user 0 -a mcs.cloud.config.debug --es cmd debug --ez enable true2、打印当前的全部配置数据
通过shell命令dump数据库,执行shell请求
#dump数据库
adb shell dumpsys com.micar.ConfigService3、请求云端数据并打印
执行shell命令
#全量更新
adb shell am start-service --user 0 -a mcs.cloud.config.debug --es cmd requestData
#增量更新
adb shell am start-service --user 0 -a mcs.cloud.config.debug --es cmd requestData --ez full false观察logcat
2022-01-01 22:05:32.235 3531-3531/com.mi.car.mcs I/DebugService: command = requestData
2022-01-01 22:05:32.235 3531-3531/com.mi.car.mcs I/DebugService: ========== start request cloud config =============
2022-01-01 22:05:32.321 3531-3557/com.mi.car.mcs D/ConfigRequestHelper: status code = 200 url = http://10.38.162.8:8115/iccc/remote-config/configuration/remote-conf
2022-01-01 22:05:32.328 3531-3557/com.mi.car.mcs D/ConfigRequestHelper: config result = {"icccResult":{"success":true,"code":200,"msg":"操作成功"},"data":[{"v":"value1","k":"key1"},{"v":"value2","k":"key2"}],"ver":1}
2022-01-01 22:05:32.328 3531-3557/com.mi.car.mcs D/ConfigRequestHelper: fetch model succ! model = {"icccResult":{"success":true,"code":200,"msg":"操作成功"},"data":[{"v":"value1","k":"key1"},{"v":"value2","k":"key2"}],"ver":1}
2022-01-01 22:05:32.332 3531-3557/com.mi.car.mcs I/ConfigStorageHelper: insert key = key1 value = value1
2022-01-01 22:05:32.336 3531-3557/com.mi.car.mcs I/ConfigStorageHelper: insert key = key2 value = value2
2022-01-01 22:05:32.340 3531-3557/com.mi.car.mcs D/ConfigRequestHelper: onCompletePush调试流程
目前的push功能,主要通过车机的vid来作为接收push的唯一凭证,vid的值可以通过mcs的进程过滤关键字vid来获取。具体操作方式请联系云平台的同学。
获取系统配置的域名
系统配置域名的功能不走云端配置,数据是通过Qnx传入的。
如果想切换域名(dev/staging/preview)需要修改qnx的配置,具体可以看相关的文档:域名环境配置字

接口使用方式,建议0.0.15-SNAPSHOT版本
#获取域名
String domain = MiCarConfig.getString(context, ConfigConstant.KEY_PERSIST_DOMAIN, "");
#获取环境 返回dev/staging/preview/product
String env = MiCarConfig.getString(context, ConfigConstant.KEY_PERSIST_DOMAIN_ENV, "");
#获取sid
String sid = MiCarConfig.getString(context, ConfigConstant.KEY_PERSIST_DOMAIN_SID, "");
#是否是pre-prod环境
val isPreProd = MiCarConfig.getBoolean(this, ConfigConstant.KEY_PERSIST_DOMAIN_PREPROD, false)
#判断是否是出海车型
#返回cn国内车型
#非cn为海外
String region = MiCarConfig.getString(context, ConfigConstant.KEY_PERSIST_REGION, "cn")
# 海外车获取当前阶段
# 返回值:cn国内阶段,global海外阶段
String stage = MiCarConfig.getString(context, ConfigConstant.KEY_PERSIST_STAGE, "cn");
#获取当前环境下,完整的url
# function String类型 e.g: sc.iccc.xiaomiev.com sc就是function, iccc.xiaomiev.com是domain, 具体见下表
# protocol String类型 例如"https", "ssl"
# port 端口 String类型 例如http "80";https "443"
# 不使用sdk,具体规则详见:https://mi.feishu.cn/wiki/JLREwEzduiQxyGkEKRic4CI3ngf
String url = MiCarConfig.getUrl(contxt, function, protocol, port);
#有些业务国内车自己硬编码了domain和sid,供这些业务参考
# 国内车型domain配置
private static final String DOMAIN_DEV = "dev.iccc.xiaomiev.com";
private static final String DOMAIN_STAGING = "staging.iccc.xiaomiev.com";
private static final String DOMAIN_PREVIEW = "preview.iccc.xiaomiev.com";
private static final String DOMAIN_PRE_PRODUCT = "iccc.xiaomiev.com";
private static final String DOMAIN_PRODUCT = "iccc.xiaomiev.com";
# 国内车型sid配置
private static final String SID_DEV = "sc_dev_car";
private static final String SID_STAGING = "sc_test_car";
private static final String SID_PREVIEW = "iccc_car_api_pre";
private static final String SID_PRE_PRODUCT = "iccc_car_api";
private static final String SID_PRODUCT = "iccc_car_api";function 参数枚举
| function 参数取值 | 说明 | 对应的域名举例 |
|---|---|---|
| mqtt | 对应 mqtt 域名 | eu-mqtt.sc.mi.com |
| sc | 对应车机接口 | eu-sc.sc.mi.com |
| s | 对应双向认证的车机接口 | eu-s.sc.mi.com |
| diag | 对应车机调试诊断接口 | eu-diag.sc.mi.com |
Debug方式
#查看数据库数据
adb shell dumpsys com.micar.ConfigService | head -n 5
DOMAIN: global_config
name:system_local_persist_key_domain_env value:preview
name:system_local_persist_key_domain_env_preprod value:false
name:system_local_persist_key_host value:preview.iccc.xiaomiev.com
name:system_local_persist_key_sid value:iccc_car_api_pre域名配置相关文档:
注意事项
-
如果发现pad上执行
adb shell dumpsys com.micar.ConfigService后,数据库为空,是为什么?答:请检查
com.mi.car.mcs进程的log,是否发现vid为空,如果为空,请使用车机调试。
📥 抓取自飞书 wiki 空间 7541192071952990209,obj_token: CgFIdHfSfozaflx5rNscxilxn0e