Merge "Add support for ICU data pinning in the Zygote"
am: 9b1d64410d
* commit '9b1d64410dfddc38ade15d1581de2c89ad79948a':
Add support for ICU data pinning in the Zygote
Change-Id: I53a2d5f885df5cf633a4a63cb2e3c2bc5c75959e
This commit is contained in:
@@ -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");
|
||||
|
||||
Reference in New Issue
Block a user