Android 系统,默认语言
文章目录
需求:
MTK平台 设置默认语言。一般默认中文、英文偏多。 也有很多其它小语种客制化需求。
场景
Android平台不同客户产品售卖到不同区域,开机默认语言不一样。特别是国外产品,默认大多数是英文,也有日语、韩语、法语…
产品需要客制化客户要求的语言需求
参考资料
MTK android 修改系统默认语言
修改android 系统默认语言
修改Android系统默认语言配置及源码解析
Android10 修改默认语言
MTK系统开发-编译部分了解
实现方案
实现思路
这里在MTK平台上面实验,其它平台并不具备直接的参考性,如RK平台记得更改的也是配置,但方案不一样
编译脚本熟悉-平台熟悉
搞清楚自己的平台下 编译的项目相关信息,比如 编译固件的脚本部分,至少知道编译的平台,反推联系到一些配置文件在哪里比如如下:
mssi_64_cn
基于上面编译脚本平台熟悉,我们自己就知道部分配置问题,这里只是先给出目录相关信息,
路径:
\device\mediatek\system\mssi_64_cn
kernel-4.19
其实就是内核目录,用到的是kernel-4.19 版本内核。
这个不是这里的重点,只是提一下,根据编译脚本就知道大概得配置文件在哪个文件下,方便后续看代码,定位具体是哪个文件的配置关联。
解决方案
修改文件-实现方案
\device\mediatek\system\mssi_64_cn\sys_mssi_64_cn.mk
PRODUCT_LOCALES := en_US zh_CN zh_TW es_ES pt_BR ru_RU fr_FR de_DE tr_TR vi_VN ms_MY in_ID th_TH it_IT ar_EG hi_IN bn_IN ur_PK fa_IR pt_PT nl_NL el_GR hu_HU tl_PH ro_RO cs_CZ ko_KR km_KH iw_IL my_MM pl_PL es_US bg_BG hr_HR lv_LV lt_LT sk_SK uk_UA de_AT da_DK fi_FI nb_NO sv_SE en_GB hy_AM zh_HK et_EE ja_JP kk_KZ sr_RS sl_SI ca_ES
根据客需,排在第一位的就讲对应的语言放到第一个位置即可。
下面列举不同配置的实际情况,测试有效:
源码分析
PRODUCT_LOCALES 引用
为什么修改路径 文件中的配置 PRODUCT_LOCALE 顺序有效?
上面分析了 PRODUCT_LOCALES 赋值各种语音,我们看它在哪里用到
如下 路径文件
\build\make\core\sysprop.mk
PRODUCT_DEFAULT_LOCALE="$(call get-default-product-locale,$(PRODUCT_LOCALES))" \
PRODUCT_DEFAULT_LOCALE 定义
上面看到PRODUCT_LOCALES 引用地方, 赋值了PRODUCT_DEFAULT_LOCALE 变量,其实调用了方法
get-default-product-locale 传递了参数 PRODUCT_LOCALES,这里就是 变量 PRODUCT_DEFAULT_LOCALE 的定义
接下来其实就要继续看 变量PRODUCT_DEFAULT_LOCALE 在哪里引用 已经 get-default-product-locale 方法说明
get-default-product-locale 方法定义
路径:
\build\make\core\sysprop.mk
上面 定义 PRODUCT_DEFAULT_LOCALE 地方,已经给了 get-default-product-locale 方法定义的说明,如下。
#
# Note: parts of this file that can't be generated by the build-properties
# macro are manually created as separate files and then fed into the macro
# Accepts a whitespace separated list of product locales such as
# (en_US en_AU en_GB...) and returns the first locale in the list with
# underscores replaced with hyphens. In the example above, this will
# return "en-US".
define get-default-product-locale
$(strip $(subst _,-, $(firstword $(1))))
endef
其实就是你传递参数数字,取第一个。 这个就验证了 配置 PRODUCT_LOCALES 变量值顺序时候就可以默认哪个语音的原因
PRODUCT_DEFAULT_LOCALE 的使用
上面层层分析了变量、变量应用、方法。 这里开始追踪上面最终赋值到了 PRODUCT_DEFAULT_LOCALE,那么它在哪里调用。
路径:
\build\tools\buildinfo.sh
最终赋值给了属性值:ro.product.locale
ro.product.locale
adb 看属性值
C:\Users\Administrator>adb shell
getDisPlay:/ $ getprop | grep ro.product.locale
[ro.product.locale]: [en-US]
DisPlay:/ $
app 应用层获取当前语言
Locale locale = getResources().getConfiguration().locale;
String language = locale.getLanguage();
String local = Locale.getDefault().toString();
小结
涉及到的文件参考或修改如下:
\device\mediatek\system\mssi_64_cn\sys_mssi_64_cn.mk 变量PRODUCT_LOCALES 值 顺序,调整默认语言
\build\make\core\sysprop.mk 定义变量PRODUCT_DEFAULT_LOCALE 引用变量 PRODUCT_LOCALES ,定义方法 get-default-product-locale
\build\tools\buildinfo.sh 引用变量PRODUCT_LOCALES,赋值属性 ro.product.locale
adb 获取 或者 app 应用上层,获取语言其实就是获取属性值 ro.product.locale,这样就完整分析了 为什么修改PRODUCT_LOCALES 值value 顺序可以实现默认语言功能了。
总结
- mtk 平台设置默认语言流程分析清除了,调整变量值PRODUCT_LOCALES 的顺序
- 为什么要搞清楚编译编译脚本 相关的项目、内核版本、项目名称,这些就直接能够找到对应文件配置在哪个地方可能是变量值定义或者引用地方。 grep 搜索太多、大量的地方,搞不清楚具体应该是哪一个。
- 既然分析到了改变属性值顺序就可以了,那我们直接定义变量值不就可以了嘛。这里可以参考mtk 相关资料,决定变量值地方蛮多,跟编译顺序有关。大多可能存在覆盖地方,所以编译顺序可以参考上面相关资料
- 本次实验更改,仅供参考。比如其它项目就是定义变量值就可以了,跟编译顺序相关