MTK Android12-Android13 设置系统默认语言
Android 系统,默认语言
文章目录
- 需求:
- 场景
- 参考资料
- 实现方案
- 实现思路
- 编译脚本熟悉-平台熟悉
- mssi_64_cn
- kernel-4.19
- 解决方案
- 修改文件-实现方案
- 源码分析
- PRODUCT_LOCALES 引用
- PRODUCT_DEFAULT_LOCALE 定义
- get-default-product-locale 方法定义
- PRODUCT_DEFAULT_LOCALE 的使用
- ro.product.locale
- adb 看属性值
- app 应用层获取当前语言
- 小结
- 总结
需求:
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.mkPRODUCT_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 相关资料,决定变量值地方蛮多,跟编译顺序有关。大多可能存在覆盖地方,所以编译顺序可以参考上面相关资料
- 本次实验更改,仅供参考。比如其它项目就是定义变量值就可以了,跟编译顺序相关
相关文章:
MTK Android12-Android13 设置系统默认语言
Android 系统,默认语言 文章目录 需求:场景 参考资料实现方案实现思路编译脚本熟悉-平台熟悉mssi_64_cnkernel-4.19 解决方案修改文件-实现方案 源码分析PRODUCT_LOCALES 引用PRODUCT_DEFAULT_LOCALE 定义get-default-product-locale 方法定义PRODUCT_DE…...
【003安卓开发方案调研】之ReactNative技术开发安卓
基于2025年最新行业动态和搜索资料,以下是针对国内使用React Native(RN)开发安卓应用的深度分析: 一、技术成熟度评估 1. 核心架构升级 新架构全面普及:2024年起,React Native的 新架构(Fabri…...
CSS3学习教程,从入门到精通,CSS3 浮动与清除浮动语法知识点及案例代码(14)
CSS3 浮动与清除浮动语法知识点及案例代码 一、浮动基础 浮动语法 选择器 {float: left|right|none|initial|inherit; }left:元素向左浮动。right:元素向右浮动。none:默认值,元素不浮动。initial:使用默认值。inhe…...
贪心算法——思路与例题
贪心算法:当我们分析一个问题时,我们往往先以最优的方式来解决问题,所以顾名思义为贪心。 例题1 题目分析:这题利用贪心算法来分析,最优解(可容纳人数最多时)一定是先考虑六人桌,然…...
网络华为HCIA+HCIP 防火墙
防火墙部署模式 路由模式 有路由器的功能 路由器干的活 他都得干 透明模式 旁挂模式 IDS 端口镜像 VPN...
WordPress超级菜单插件UberMenu v3.78汉化版
一、插件介绍 UberMenu 是一款功能强大的 WordPress 超级菜单插件,能够帮助站长创建响应式、可自定义的多级菜单。该插件支持动态内容加载、图标、图片、搜索框等丰富功能,并且兼容大多数 WordPress 主题。 UberMenu v3.78 经过完整汉化,适用于中文站点用户,让操作更加直观…...
SQL中体会多对多
我们可以根据学生与课程多对多关系的数据库模型,给出实际的表数据以及对应的查询结果示例,会用到JOINLEFT JOIN两种连接 1. 学生表(students) student_idstudent_name1张三2李四3王五 2. 课程表(courses)…...
23种设计模式-备忘录(Memento)设计模式
备忘录设计模式 🚩什么是备忘录设计模式?🚩备忘录设计模式的特点🚩备忘录设计模式的结构🚩备忘录设计模式的优缺点🚩备忘录设计模式的Java实现🚩代码总结🚩总结 🚩什么是…...
2024年3月全国计算机等级考试真题(二级C语言)
😀 第1题 下列叙述中正确的是 A. 矩阵是非线性结构 B. 数组是长度固定的线性表 C. 对线性表只能作插入与删除运算 D. 线性表中各元素的数据类型可以不同 题目解析: A. 矩阵是非线性结构 错误。矩阵通常是二维数组,属…...
计算机网络基础之三种交换技术及其性能分析
一. 交换技术基础 1. 三种交换技术 电路交换:用于电话网络报文交换:用于电报网络分组交换:用于现代计算机网络 2. 人类历史上的通信网络 #mermaid-svg-AeGvrkUbCkicFOIo {font-family:"trebuchet ms",verdana,arial,sans-serif;…...
使用python爬取网络资源
整体思路 网络资源爬取通常分为以下几个步骤: 发送 HTTP 请求:使用requests库向目标网站发送请求,获取网页的 HTML 内容。解析 HTML 内容:使用BeautifulSoup库解析 HTML 内容,从中提取所需的数据。处理数据ÿ…...
【MySQL】索引 事务
目录 一、索引 概念 作用 使用场景 使用 查看索引 创建索引 删除索引 背后的数据结构 二、事务 为什么使用事务 事务的概念 使用 开启事务 执行多条 SQL 语句 回滚或提交:rollback/commit; 事务的基本特性 原子性 一致性 持久性 隔离性 脏读 …...
平台与架构:深度解析与开发实践
平台与架构:深度解析与开发实践 1. 什么是平台与架构? 平台(Platform):指操作系统或运行环境,例如 linux、windows、darwin(macOS)、android 等。架构(Architecture&…...
【Springboot+JPA】存储过程Procedure使用及踩坑记录
SpringbootJPA存储过程调用 存储过程实现1.表结构2.上报数据分页查询2.1先查出总条数2.1.1 创建存储过程2.1.2 实体类声明存储过程2.1.3 仓库方法绑定存储过程2.1.4 服务调用存储过程 2.2返回分页数据2.2.1 创建存储过程2.2.2 实体类声明存储过程2.2.3 仓库方法绑定存储过程2.2…...
<template>标签的作用,在构建可复用 UI 片段时如何应用?
大白话标签的作用,在构建可复用 UI 片段时如何应用 <template>标签的作用 在前端开发里,<template>标签可是个超棒的工具。它就像是一个“代码仓库”,可以把一些 HTML 代码片段存起来,而且这些代码片段在页面刚加载…...
Android Compose框架的值动画(animateTo、animateDpAsState)(二十二)
深入剖析 Android 框架的值动画(animateTo、animateDpAsState) 一、引言 在构建富有交互性和吸引力的 Android 应用界面时,动画起着至关重要的作用。值动画作为 Android 动画体系中的重要组成部分,能够为各种 UI 元素的属性变化…...
Gunicorn+Eventlet无法收到SocketIO发送的消息
GunicornEventlet无法收到Socketio发送的消息 介绍问题分析**1. 确保正确安装依赖库****2. 检查 Gunicorn 启动命令****3. 配置 Flask-SocketIO 的异步模式****4. 检查库版本兼容性****5. 确认 emit 的调用方式****6. 客户端连接检查** 如何使用多个workers?**1. 为什么不能直…...
【江协科技STM32】软件SPI读写W25Q64芯片(学习笔记)
SPI通信协议及S为5Q64简介:【STM32】SPI通信协议&W25Q64Flash存储器芯片(学习笔记)-CSDN博客 STM32与W25Q64模块接线: SPI初始化: 片选SS、始终SCK、MOSI都是主机输出引脚,输出引脚配置为推挽输出&…...
基于 Vue 3 的PDF和Excel导出
以下是基于 Vue 3 Composition API 的完整实现,包括 PDF 和 Excel 导出。 一、PDF 导出 (Vue 3) 安装依赖 在项目中安装相关库: npm install html2canvas jspdf Vue 3 代码实现 <template><div><div ref"pdfContent" cla…...
Git+Fork 入门介绍
git 分区理解 fork安装 从路径下去拿软件时,注意先拉到本地。经验来看,fork直接安装会出不可思议的问题。 fork操作 安装,注意设置好名字,如果之前安装的同学,名字没有写好,重新安装设置好名字。 clone操…...
Windows系统安装Node.js和npm教程【成功】
0.引言——Node.js和npm介绍 项目描述Node.js基于Chrome V8引擎的JavaScript运行环境,使JavaScript可用于服务器端开发。采用单线程、非阻塞I/O及事件驱动架构,适用于构建Web服务器、实时应用和命令行工具等npmNode.js的包管理器与大型软件注册表。拥有…...
Axure RP9.0 教程:左侧菜单列表导航 ( 点击父级菜单,子菜单自动收缩或展开)【响应式的菜单导航】
文章目录 引言I 实现步骤添加商品管理菜单组推拉效果引言 应用场景:PC端管理后台页面,左侧菜单列表导航。 思路: 用到了动态面板的两个交互效果来实现:隐藏/显示切换、展开/收起元件向下I 实现步骤 添加商品管理菜单组 在左侧画布区域添加一个菜单栏矩形框;再添加一个商…...
科技赋能|ZGIS综合管网智能管理平台守护地下城市生命线
地下管网作为城市公共安全的重要组成部分,担负着城市的信息传递、能源输送、排涝减灾等重要任务,是维系城市正常运行、满足群众生产生活需要的重要基础设施,是城市各功能区有机连接和运转的维系,因此,也被称为城市“生…...
react中useRef和useMemo和useCallback
memo : 被memo包裹的组件,会浅层比较 props,不会深度比较,如果浅层比较相同,就不会重新渲染组件 默认是,无论怎么,都会重新渲染一遍子组件,, useMemo: 包裹一个函数&am…...
如何保证LabVIEW软件开发的质量?
LabVIEW作为图形化编程工具,广泛应用于工业测控、自动化测试等领域。其开发模式灵活,但若缺乏规范,易导致代码可读性差、维护困难、性能低下等问题。保证LabVIEW开发质量需从代码规范、模块化设计、测试验证、版本管理、文档完善等多维度入手…...
如何快速解决 Postman 报错?
介绍一些 Postman 常见的报错与处理方法,希望能够对大家有所帮助。 Postman 一直转圈打不开的问题 Postman 报错处理指南:常见报错与解决方法...
基于数据挖掘从经验方和医案探析岭南名医治疗妇科疾病的诊疗和用药规律
标题:基于数据挖掘从经验方和医案探析岭南名医治疗妇科疾病的诊疗和用药规律 内容:1.摘要 背景:岭南地区独特的地理环境、气候条件及人文风俗使该地区妇科疾病具有一定特点,岭南名医在长期临床实践中积累了丰富的治疗经验。目的:基于数据挖掘…...
Android Launcher3 HotSeat文件夹创建禁止方案全解析
一、技术背景与实现原理 在Android 13 Launcher3定制开发中,需屏蔽HotSeat区域的文件夹创建功能。该功能涉及的核心事件处理流程如下: 复制 [拖拽事件] -> [Workspace.onDrop()] -> [CellLayout.performReorder()]└─> [createUserFolderIf…...
springboot body 转对象强验证属性多余属性抛错误
在Spring Boot中,当使用RequestBody注解来接收HTTP请求中的JSON数据并将其转换为Java对象时,Spring默认会忽略额外的属性。这意味着如果发送的JSON包含一些目标对象中没有定义的属性,Spring不会报错,这些额外的属性会被简单地忽略…...
C++手撕共享指针、多线程交替、LRU缓存
1. 共享指针 #include <atomic> #include <iostream>template <typename T> class sharedptr { private:T *ptr;std::atomic<size_t> *count;public:sharedptr(T *p) : ptr(p), count(new std::atomic<size_t>(1)) {}sharedptr(const sharedptr…...
