diff options
| author | 2016-05-18 11:45:35 +0000 | |
|---|---|---|
| committer | 2016-05-18 11:45:35 +0000 | |
| commit | 9b1d64410dfddc38ade15d1581de2c89ad79948a (patch) | |
| tree | a8148e19835f3d26a0f15a1e5e8667bf84527fd3 | |
| parent | aa733e0b41e4e15908a4c89e935f824cc5908b4d (diff) | |
| parent | 41c9dc3b6938c5674c88ef4bc27b3d95f56efebe (diff) | |
Merge "Add support for ICU data pinning in the Zygote"
| -rw-r--r-- | core/java/com/android/internal/os/ZygoteInit.java | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 1440e5fb559d..83ffb54af583 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -22,6 +22,9 @@ import static android.system.OsConstants.S_IRWXO; import android.content.res.Resources; import android.content.res.TypedArray; +import android.icu.impl.CacheValue; +import android.icu.text.DecimalFormatSymbols; +import android.icu.util.ULocale; import android.net.LocalServerSocket; import android.opengl.EGL14; import android.os.Process; @@ -181,6 +184,9 @@ public class ZygoteInit { static void preload() { Log.d(TAG, "begin preload"); + Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "BeginIcuCachePinning"); + beginIcuCachePinning(); + Trace.traceEnd(Trace.TRACE_TAG_DALVIK); Trace.traceBegin(Trace.TRACE_TAG_DALVIK, "PreloadClasses"); preloadClasses(); Trace.traceEnd(Trace.TRACE_TAG_DALVIK); @@ -195,10 +201,34 @@ public class ZygoteInit { // Ask the WebViewFactory to do any initialization that must run in the zygote process, // for memory sharing purposes. WebViewFactory.prepareWebViewInZygote(); + endIcuCachePinning(); warmUpJcaProviders(); Log.d(TAG, "end preload"); } + private static void beginIcuCachePinning() { + // Pin ICU data in memory from this point that would normally be held by soft references. + // Without this, any references created immediately below or during class preloading + // would be collected when the Zygote GC runs in gcAndFinalize(). + Log.i(TAG, "Installing ICU cache reference pinning..."); + + CacheValue.setStrength(CacheValue.Strength.STRONG); + + Log.i(TAG, "Preloading ICU data..."); + // Explicitly exercise code to cache data apps are likely to need. + ULocale[] localesToPin = { ULocale.ROOT, ULocale.US, ULocale.getDefault() }; + for (ULocale uLocale : localesToPin) { + new DecimalFormatSymbols(uLocale); + } + } + + private static void endIcuCachePinning() { + // All cache references created by ICU from this point will be soft. + CacheValue.setStrength(CacheValue.Strength.SOFT); + + Log.i(TAG, "Uninstalled ICU cache reference pinning..."); + } + private static void preloadSharedLibraries() { Log.i(TAG, "Preloading shared libraries..."); System.loadLibrary("android"); |