2011年12月24日 星期六

[Work] Trace language setting in android source code


以下為記錄 trace android如何設定 language的過程,在此紀錄

1.android/build/target/product/languages_full.mk
  PRODUCT_LOCALES :=  $(OEM_PRODUCT_LOCALES)  (改預設語言)

2.android/build/core/Makefile
  PRODUCT_DEFAULT_LANGUAGE="$(call default-locale-language,$(PRODUCT_LOCALES))"
  PRODUCT_DEFAULT_REGION="$(call default-locale-region,$(PRODUCT_LOCALES))"

  # Whether there is default locale set in PRODUCT_PROPERTY_OVERRIDES
        product_property_override_locale_language := $(strip \
            $(patsubst ro.product.locale.language=%,%,\
            $(filter ro.product.locale.language=%,$(PRODUCT_PROPERTY_OVERRIDES))))
        product_property_overrides_locale_region := $(strip \
            $(patsubst ro.product.locale.region=%,%,\
            $(filter ro.product.locale.region=%,$(PRODUCT_PROPERTY_OVERRIDES))))

3.android/build/tools/buildinfo.sh
  if [ -n "$PRODUCT_DEFAULT_LANGUAGE" ] ; then
    echo "ro.product.locale.language=$PRODUCT_DEFAULT_LANGUAGE"
  fi
  if [ -n "$PRODUCT_DEFAULT_REGION" ] ; then
    echo "ro.product.locale.region=$PRODUCT_DEFAULT_REGION"
  fi

4. android/framework/base/core/jni/AndroidRuntime.cpp
/*
* Read the persistent locale.
*/
static void readLocale(char* language, char* region)
{
    char propLang[PROPERTY_VALUE_MAX], propRegn[PROPERTY_VALUE_MAX];

    property_get("persist.sys.language", propLang, "");
    property_get("persist.sys.country", propRegn, "");
    if (*propLang == 0 && *propRegn == 0) {
        /* Set to ro properties, default is en_US */
        property_get("ro.product.locale.language", propLang, "en");
        property_get("ro.product.locale.region", propRegn, "US");
    }
    strncat(language, propLang, 2);
    strncat(region, propRegn, 2);
    //LOGD("language=%s region=%s\n", language, region);
}

5. 在device下的 data/property下有prop文件:persist.sys.timezone
                                           persist.sys.language (可以改預設語言)
                                           persist.sys.country  (可以改預設地區)
                                           persist.sys.localevar

                         
6. 當使用者有自行手動更換過語言時,就會在device下產生出 /data/property底下的文件

   所以一旦/data/property底下語言設定沒產生出,Android將會跑去抓 ro.product.locale.language
  
   來判斷目前所設定之語言

沒有留言:

張貼留言