为Android重新生成ICU的.dat文件

时间:2018-09-27 19:25:39

标签: android icu

有人决定默认情况下加拿大应该有24小时制,因此我需要修改ICU数据。在Android 5.1上,我可以在<slug>中进行“制作”并将生成的icu4c/source/data放到icudt53l.dat中的设备上

在Android 8.1上,我尝试了相同的操作,但是设备无法启动。

/system/usr/icu.

我没有对任何数据文件进行任何实际更改。产生的 09-27 15:12:14.667 E/Zygote ( 8313): System zygote died with exception 09-27 15:12:14.667 E/Zygote ( 8313): java.lang.ExceptionInInitializerError 09-27 15:12:14.667 E/Zygote ( 8313): at android.icu.lang.UCharacter.getUnicodeVersion(UCharacter.java:3877) 09-27 15:12:14.667 E/Zygote ( 8313): at android.icu.text.StringPrep.<init>(StringPrep.java:277) 09-27 15:12:14.667 E/Zygote ( 8313): at android.icu.text.StringPrep.getInstance(StringPrep.java:314) 09-27 15:12:14.667 E/Zygote ( 8313): at android.icu.impl.IDNA2003.<clinit>(IDNA2003.java:37) 09-27 15:12:14.667 E/Zygote ( 8313): at java.lang.Class.classForName(Native Method) 09-27 15:12:14.667 E/Zygote ( 8313): at java.lang.Class.forName(Class.java:453) 09-27 15:12:14.667 E/Zygote ( 8313): at com.android.internal.os.ZygoteInit.preloadClasses(ZygoteInit.java:300) 09-27 15:12:14.667 E/Zygote ( 8313): at com.android.internal.os.ZygoteInit.preload(ZygoteInit.java:128) 09-27 15:12:14.667 E/Zygote ( 8313): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 09-27 15:12:14.667 E/Zygote ( 8313): Caused by: java.util.MissingResourceException: could not locate data 09-27 15:12:14.667 E/Zygote ( 8313): at android.icu.impl.ICUData.getStream(ICUData.java:145) 09-27 15:12:14.667 E/Zygote ( 8313): at android.icu.impl.ICUBinary.getData(ICUBinary.java:499) 09-27 15:12:14.667 E/Zygote ( 8313): at android.icu.impl.ICUBinary.getRequiredData(ICUBinary.java:453) 09-27 15:12:14.667 E/Zygote ( 8313): at android.icu.impl.UCharacterProperty.<init>(UCharacterProperty.java:1221) 09-27 15:12:14.667 E/Zygote ( 8313): at android.icu.impl.UCharacterProperty.<clinit>(UCharacterProperty.java:1437) 09-27 15:12:14.667 E/Zygote ( 8313): ... 9 more 比同一文件的提交版本(看起来不太正确)小约3k。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

我在Android 8.1源代码中遇到了同样的问题。在我的情况下,由于icudt58l.dat中没有ubidi.icu文件,因此将引发MissingResourceException。

在Makefile中,ubidi.icu包含在UNI_CORE_DATA中,仅在ifneq($(INCLUDE_UNI_CORE_DATA),)中构建。

也就是说,您必须在make命令中包含INCLUDE_UNI_CORE_DATA。

make INCLUDE_UNI_CORE_DATA=1

这是我使用的所有命令:

cd external/icu/icu4c

mkdir build

cd build

../source/runConfigureICU Linux --with-data-packaging=archive

# work around if there is no xlocale.h file in your environment
sudo ln -s /usr/include/locale.h /usr/include/xlocale.h

make INCLUDE_UNI_CORE_DATA=1

adb root; adb remount; adb push ./data/out/icudt58l.dat system/usr/icu/icudt58l.dat

adb shell stop; adb shell start