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 相關資料,決定變量值地方蠻多,跟編譯順序有關。大多可能存在覆蓋地方,所以編譯順序可以參考上面相關資料
- 本次實驗更改,僅供參考。比如其它項目就是定義變量值就可以了,跟編譯順序相關