最近在移植blcr-0.8.2到android,按照网上的资料移植完后,系统可以正常启动运行,但是设置语言后重新启动,还是原来的语言,而persist.sys.language和persist.sys.country属性又是设置后的语言属性。通过查找源代码,发现android在启动虚拟机的时候会通过读取persist.sys.language和persist.sys.country属性来设置本地语言。由此可见导致上述情况的发生是因为没有正确加载persist.sys.language和persist.sys.country属性。经过分析也确实如此,原来在没有blcr的时候每次启动Zygote进程都会重新启动虚拟机,读取persist.sys.language和persist.sys.country属性,但是有了blcr后,启动Zygote进程会从上次的CheckPoint开妈运行,而Zygote进程的CheckPoint是在启动虚拟机之后,因此虚拟机也在CheckPoint之内,本地语言也是上次保存CheckPoint是的语言。要解决这一问题就是要在启动虚拟机之后重新读取persist.sys.language和persist.sys.country属性并设置本地语言,在此提供一种方法是在/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java文件中添加如下代码(见红色部分):
GL_ES_VERSION = SystemProperties.getInt("ro.opengles.version",
ConfigurationInfo.GL_ES_VERSION_UNDEFINED);
Locale.setDefault(new Locale(SystemProperties.get("persist.sys.language"),
SystemProperties.get("persist.sys.country")));
mConfiguration.makeDefault();
mProcessStats.init();