Android 7系统国际化(八):总结与实战建议
系列目录第一篇全景图与调用链路概览 | 第二篇Locale 与 LocaleList | 第三篇Configuration | 第四篇LocalePicker | 第五篇ActivityManagerService | 第六篇ActivityThread | 第七篇Resources 与 AssetManager | 第八篇总结与实战建议一、完整调用链回顾八篇文章逐层递进完整还原了 Android 7 国际化的端到端链路。下面将其浓缩为一次用户切换语言的完整时序图用户点击EnglishSettings App 主线程 │ ▼ ┌─────────────────────────────────┐ │ 第四篇LocalePicker │ │ │ │ config.setLocales(en-US) │ │ config.userSetLocale true │ │ am.updatePersistentConfig(config)│ └─────────────┬───────────────────┘ │ [Binder IPC] ▼ ┌─────────────────────────────────┐ │ 第五篇AMS │ │ │ │ updatePersistentConfiguration() │ ← Binder 入口 │ ├─ enforceCallingPermission() │ ← 权限检查 │ ├─ clearCallingIdentity() │ ← 身份切换 │ └─ updateConfigurationLocked()│ │ ├─ updateFrom(values) │ ← 差异计算 → CONFIG_LOCALE │ ├─ persist.sys.locale │ ← 持久化到系统属性 │ ├─ applyToSystemServer() │ ← 自身先更新 │ └─ for each ProcessRecord: │ scheduleConfigChanged() ──[Binder]──→ └─────────────────────────────────┘ │ ▼ (进入每个应用进程) ┌─────────────────────────────────┐ │ 第六篇ActivityThread │ │ │ │ ApplicationThread │ ← Binder 线程收到 │ └─ H.CONFIGURATION_CHANGED │ ← 切换到主线程 │ └─ handleConfigurationChanged() │ ├─ applyConfigToResourcesLocked() │ └─ collectComponentCallbacks() │ └─ for each Activity/App/Service: │ onConfigurationChanged() └─────────────┬───────────────────┘ │ ▼ ┌─────────────────────────────────┐ │ 第七篇Resources AssetMgr │ │ │ │ ResourcesManager │ │ └─ 遍历所有缓存的 ResourcesImpl│ │ └─ ResourcesImpl │ │ ├─ calcConfigChanges │ ← 计算差异并更新快照 │ ├─ 多语言最佳匹配 │ │ ├─ cache.onConfigChange()│ ← 选择性清除缓存 │ └─ AssetManager.setConfiguration(en-US) │ └─ [JNI] AssetManager.cpp │ └─ ResTable::setParameters() │ │ │ 下次 getString(id) ────┘ │ ↓ │ ResTable 用新 locale 重新匹配 │ ↓ │ 返回 Hello而非你好 └─────────────────────────────────┘总耗时粗略估算阶段操作耗时Settings → AMSBinder IPC同步~0.5msAMS 内部配置更新 持久化~1-2msAMS → 所有进程Binder IPC × N 个进程~1-5ms取决于进程数应用进程内部Resources 重建 回调~5-20ms取决于资源量下一次 getStringNative 资源匹配~0.01ms内存操作二、各层核心源码文件速查表层次文件路径数据模型Locale.javalibcore/luni/src/main/java/java/util/Locale.java数据模型LocaleList.javaframeworks/base/core/java/android/os/LocaleList.java配置容器Configuration.javaframeworks/base/core/java/android/content/res/Configuration.java用户入口LocalePicker.javaframeworks/base/core/java/com/android/internal/app/LocalePicker.java用户入口LocaleStore.javaframeworks/base/core/java/com/android/internal/app/LocaleStore.java用户入口LocaleDragAndDropAdapter.javapackages/apps/Settings/src/.../LocaleDragAndDropAdapter.java系统服务ActivityManagerService.javaframeworks/base/services/core/java/com/android/server/am/ActivityManagerService.java应用主线程ActivityThread.javaframeworks/base/core/java/android/app/ActivityThread.java资源 APIResources.javaframeworks/base/core/java/android/content/res/Resources.java资源实现ResourcesImpl.javaframeworks/base/core/java/android/content/res/ResourcesImpl.java资源管理ResourcesManager.javaframeworks/base/core/java/android/app/ResourcesManager.javaJNI 桥AssetManager.javaframeworks/base/core/java/android/content/res/AssetManager.javaNative 引擎AssetManager.cppframeworks/base/libs/androidfw/AssetManager.cpp资源类型ResourceTypes.h/.cppframeworks/base/libs/androidfw/ResourceTypes.cpp三、关键设计思想总结3.1 单向数据流Android 7 的国际化采用严格的自上而下的数据流用户操作 → Settings App → AMS → 各应用进程 → Resources → Native 资源匹配关键设计不存在应用自行修改全局语言的路径。普通应用无法调用 AMS 的语言变更接口受CHANGE_CONFIGURATION权限保护这保证了系统的稳定性和一致性。3.2 缓存 重创建模式ResourcesManager不修改已有的Resources对象而是创建新的旧的Resources被WeakReference持有 → 无引用后 GC 回收新的Resources以新配置创建 → 内部AssetManager使用新 locale所有引用旧Resources的组件通过onConfigurationChanged()获取新引用关键设计这种immutable recreate模式避免了并发修改问题也天然支持了配置切换场景。3.3 分层解耦整个国际化系统清晰地分层层职责对外接口数据层Locale / LocaleList 的表示与序列化BCP 47 标签、Parcelable传输层Configuration 的打包与 Binder 传输Parcelable分发层AMS 的权限检查、存储、逐进程通知IActivityManager响应层ActivityThread 的资源重建与组件回调ComponentCallbacks2匹配层Native 层的资源表索引与匹配AssetManager JNI每一层只关心自己的职责层间通过标准接口Parcelable、Binder、JNI通信。3.4 兼容性优先Android 7 在引入LocaleList的同时通过以下手段保持了向后兼容Configuration.getLocales()/setLocales()→ 新 APILocalePicker.updateLocale()→ 包装为updateLocales(new LocaleList(locale))旧版Configuration.locale→Deprecated但保留公有字段通过fixUpLocaleList()同步mLocaleList四、应用层实战建议基于对 AOSP 7 国际化机制的深入理解给出以下实践建议4.1 声明 configChangesactivityandroid:name.MainActivityandroid:configChangeslocale|layoutDirection|screenSize|orientation/声明configChangeslocale可避免语言切换时 Activity 重启。但需要自己在onConfigurationChanged()中刷新 UI。注意如果只声明了locale而没有声明layoutDirection从 RTL 语言切换到 LTR 语言时 Activity 仍可能因为布局方向变化而重启。4.2 资源文件组织推荐的资源目录结构res/ ├── values/ ← 默认语言通常是英语 │ └── strings.xml ├── values-zh-rCN/ ← 简体中文 │ └── strings.xml ├── values-zh-rTW/ ← 繁体中文 │ └── strings.xml ├── values-ja/ ← 日语 │ └── strings.xml └── values-ko/ ← 韩语 └── strings.xml注意事项values/必须存在作为兜底默认值使用 Android 标准的语言标识符ISO 639-1 ISO 3166-1图片资源也可以用drawable-zh-rCN/做本地化4.3 运行时语言切换// 获取系统语言LocalecurrentLocalegetResources().getConfiguration().getLocales().get(0);// 手动设置 Activity 语言不改变全局ConfigurationconfiggetResources().getConfiguration();config.setLocale(newLocale);getResources().updateConfiguration(config,getResources().getDisplayMetrics());// 注意以上操作只影响当前 Activity退出后不持久4.4 onConfigurationChanged 最佳实践OverridepublicvoidonConfigurationChanged(ConfigurationnewConfig){super.onConfigurationChanged(newConfig);// 1. 更新语言相关 UIupdateLocaleDependentUI();// 2. 重建 ActionBar如果语言改变了文字方向if(mActionBar!null){mActionBar.onConfigurationChanged(newConfig);}// 3. 刷新布局如果布局因语言有差异recreateIfNeeded();}4.5 避免的陷阱陷阱原因建议用静态变量缓存语言语言切换后不会自动更新每次从 Resources 读取硬编码字符串无法被翻译全部放入 strings.xml忽略多语言列表只取locale[0]可能丢失用户偏好支持 LocaleList 的全部优先级在 Service 中忽略回调Service 也会收到 onConfigurationChanged同样处理语言切换Fragment 中重复处理Activity 会自动分发到 Fragment不要在 Fragment 中再做一遍五、Android 版本差异速览各版本在国际化方面的关键变化APIAndroid 版本国际化关键变化21-235.0 - 6.0单一 LocaleConfiguration.locale字段24-257.0 - 7.1LocaleList 引入updatePersistentConfiguration()拖拽排序26-278.0 - 8.1ResourcesImpl分离加强ResourcesManager优化289.0Per-app language每应用独立语言本系列基于 AOSP 7.x 分析后续版本的演变以此为基。六、结语Android 7 的国际化系统是 Android 框架设计哲学的典范数据流清晰自顶向下的单向传播分层解耦数据 → 配置 → 分发 → 响应 → 匹配各司其职兼容性在引入 LocaleList 的同时平滑兼容旧 API性能优化缓存池、异步持久化、渐进式 UI 更新理解这套机制不仅有助于解决国际化相关的 Bug如切换语言后部分文字未变化、“Fragment 中语言未更新”更能深入领会 Android 系统架构的设计思想——这套 Binder Handler 资源管理 Native 引擎的四层架构在其他系统机制屏幕旋转、暗黑模式切换、字体大小变更中也同样适用。希望这个系列能帮助你从会用国际化进阶到理解国际化。本系列源码基于 AOSP 7.xAPI 24/25各版本可能存在差异请以实际代码为准。

相关新闻

Axure RP 11汉化一步到位:用简体中文语言包告别半中半英界面

Axure RP 11汉化一步到位:用简体中文语言包告别半中半英界面

Axure RP 11汉化一步到位:用简体中文语言包告别半中半英界面 【免费下载链接】axure-cn Chinese language file for Axure RP. Axure RP 简体中文语言包。支持 Axure 11、10、9。不定期更新。 项目地址: https://gitcode.com/gh_mirrors/ax/axure-cn axure-c…

2026/8/13 16:42:55 阅读更多 →
小游戏类项目 —— 五子棋游戏

小游戏类项目 —— 五子棋游戏

目录 第一步编写界面 1.构思 2.功能的实现 第二步编写游戏内容 1.游戏的框架 2.功能的实现 第三步编写电脑玩家 1.分类 2.输出顺序 总结 第一步编写界面 1.构思 我们平时玩游戏并非打开它就直接开始游戏,打开游戏后最先印入眼帘的往往是游戏菜单&#x…

2026/8/13 16:41:55 阅读更多 →
永久激活IDM的3种亲测方案:一个开源脚本把试用期锁死在第30天

永久激活IDM的3种亲测方案:一个开源脚本把试用期锁死在第30天

永久激活IDM的3种亲测方案:一个开源脚本把试用期锁死在第30天 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 两周前的晚上,我的 Interne…

2026/8/13 16:41:55 阅读更多 →

最新新闻

联想笔记本UEFI引导修复:解决winload.efi丢失错误0xc0000225

联想笔记本UEFI引导修复:解决winload.efi丢失错误0xc0000225

1. 问题引入:当熟悉的开机画面变成蓝屏代码那天下午,我正打算用那台老伙计——一台联想拯救者Y7000P(2019款)处理点急事,按下电源键,熟悉的联想Logo闪过之后,等待我的不是Windows的登录界面&…

2026/8/14 2:18:14 阅读更多 →
Windows 10下Python 2.7环境PyMol安装与配置全攻略

Windows 10下Python 2.7环境PyMol安装与配置全攻略

1. 项目概述与核心价值如果你是一名结构生物学、药物设计或者生物化学领域的研究者或学生,那么PyMol这个名字对你来说一定不陌生。它被誉为分子可视化的“行业标准”,无论是发表论文时绘制精美的蛋白质结构图,还是分析分子对接结果、观察活性…

2026/8/14 2:18:14 阅读更多 →
5步实战指南:开源工具JiYuTrainer助你突破教学系统限制

5步实战指南:开源工具JiYuTrainer助你突破教学系统限制

5步实战指南:开源工具JiYuTrainer助你突破教学系统限制 【免费下载链接】JiYuTrainer 极域电子教室防控制软件, StudenMain.exe 破解 项目地址: https://gitcode.com/gh_mirrors/ji/JiYuTrainer 在传统计算机教学环境中,学生设备常被教学软件完全…

2026/8/14 2:18:14 阅读更多 →
EdgeRemover终极指南:三步彻底告别Windows顽固Edge浏览器

EdgeRemover终极指南:三步彻底告别Windows顽固Edge浏览器

EdgeRemover终极指南:三步彻底告别Windows顽固Edge浏览器 【免费下载链接】EdgeRemover A PowerShell script that correctly uninstalls or reinstalls Microsoft Edge on Windows 10 & 11. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemover 你…

2026/8/14 2:18:14 阅读更多 →
OpenCodeUI:从UI框架到前端协作新范式的深度解析与实践路径

OpenCodeUI:从UI框架到前端协作新范式的深度解析与实践路径

1. 从“又一个UI框架”到“开发者协作新范式”的认知转变最近在开发者社区里,OpenCodeUI 这个名字开始频繁出现。乍一看,这似乎又是一个在 React、Vue、Svelte 等成熟框架之外冒出来的新 UI 库,很容易让人产生“这又是重复造轮子”的第一印象…

2026/8/14 2:18:14 阅读更多 →
深入解析Trae-Agent的Patch机制:实现配置动态更新与热修复

深入解析Trae-Agent的Patch机制:实现配置动态更新与热修复

1. 项目概述:理解Trae-Agent的Patch机制在分布式系统和微服务架构日益复杂的今天,配置的动态更新与热修复能力成为了保障服务稳定性的关键。Trae-Agent,作为一个设计用于管理和分发配置变更的代理组件,其核心价值之一就体现在“Pa…

2026/8/14 2:17:14 阅读更多 →

日新闻

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

临沂网站建设铭镇:深耕本土数字生态,以匠心铸就企业品牌核心竞争力

在这个流量为王、视觉至上的互联网时代,对于临沂乃至整个山东乃至全国的传统中小企业来说,拥有一张精美的“数字名片”早已不再是可选项,而是生存的必答题。每当夜幕降临,沂河两岸灯火辉煌,物流之都的喧嚣逐渐沉淀为对未来的思考。我们常常听到老板们在茶余饭后探讨:为什…

2026/8/14 0:00:26 阅读更多 →
Flutter与OpenHarmony实现剧本杀组队表单开发实战

Flutter与OpenHarmony实现剧本杀组队表单开发实战

1. 项目概述在移动应用开发领域,跨平台框架Flutter因其高效的开发体验和出色的性能表现,已经成为众多开发者的首选。而OpenHarmony作为新兴的操作系统平台,其开放性和灵活性为开发者提供了全新的可能性。本文将聚焦于一个实际应用场景——剧本…

2026/8/14 0:00:26 阅读更多 →
大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

大连网站建设找简维科技:为您打造懂业务更懂用户的数字化转型引擎

在这个数字化浪潮席卷全球的今天,企业想要在激烈的市场竞争中站稳脚跟,拥有一张好看的“数字名片”已经远远不够了。很多老板在刚开始接触互联网业务时,都有一个共同的困惑:为什么我花了钱建的网站,就像是在真空中自嗨?访客进来转了两圈就跑了,线索石沉大海,甚至连客服…

2026/8/14 0:01:27 阅读更多 →

周新闻

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁

5分钟告别提取码焦虑:baidupankey如何智能破解百度网盘资源锁 【免费下载链接】baidupankey 在线查询网盘提取码(维护中 rm repo) 项目地址: https://gitcode.com/gh_mirrors/ba/baidupankey 你是否曾经在深夜寻找一份重要资料&#x…

2026/8/13 2:38:34 阅读更多 →
如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南

如何快速生成中国车牌图片:Python开源工具完整指南 【免费下载链接】chinese_license_plate_generator 中国车牌生成器 项目地址: https://gitcode.com/gh_mirrors/ch/chinese_license_plate_generator 中国车牌生成器是一个基于Python的开源项目&#xff0c…

2026/8/13 10:41:52 阅读更多 →
收藏!小白程序员轻松入门大模型,从Harness工程开始实践

收藏!小白程序员轻松入门大模型,从Harness工程开始实践

文章强调学习大模型不应只关注模型本身,而应重视模型外的系统搭建,即Harness。提出AgentModelHarness的实用公式,详细介绍Harness的四个层次:持久化层、执行层、控制层和观察与验证层。文章还探讨了上下文工程、工具设计、AGENTS.…

2026/8/13 10:41:51 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/13 10:41:50 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/13 10:41:49 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/13 10:41:49 阅读更多 →