From 3822882b32d9b1b803aaff9b657a91d680f1d0f9 Mon Sep 17 00:00:00 2001 From: "Torne (Richard Coles)" Date: Wed, 13 Aug 2014 17:11:45 +0100 Subject: [PATCH] Add trace events to WebView startup. Add system trace events for several interesting points during the loading of the WebView APK so we can measure how much each part contributes to startup time. Bug: 16870075 Change-Id: Iadfd1881faea0377fa01313dddabb1d030962c5f --- core/java/android/webkit/WebViewFactory.java | 56 +++++++++++++------- 1 file changed, 37 insertions(+), 19 deletions(-) diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java index 23894ee7e43f7..ec589a5740ab9 100644 --- a/core/java/android/webkit/WebViewFactory.java +++ b/core/java/android/webkit/WebViewFactory.java @@ -29,6 +29,7 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.StrictMode; import android.os.SystemProperties; +import android.os.Trace; import android.text.TextUtils; import android.util.AndroidRuntimeException; import android.util.Log; @@ -83,26 +84,38 @@ public final class WebViewFactory { // us honest and minimize usage of WebView internals when binding the proxy. if (sProviderInstance != null) return sProviderInstance; - loadNativeLibrary(); - - Class providerClass; + Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "WebViewFactory.getProvider()"); try { - providerClass = getFactoryClass(); - } catch (ClassNotFoundException e) { - Log.e(LOGTAG, "error loading provider", e); - throw new AndroidRuntimeException(e); - } + Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "WebViewFactory.loadNativeLibrary()"); + loadNativeLibrary(); + Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW); - StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); - try { - sProviderInstance = providerClass.newInstance(); - if (DEBUG) Log.v(LOGTAG, "Loaded provider: " + sProviderInstance); - return sProviderInstance; - } catch (Exception e) { - Log.e(LOGTAG, "error instantiating provider", e); - throw new AndroidRuntimeException(e); + Class providerClass; + Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "WebViewFactory.getFactoryClass()"); + try { + providerClass = getFactoryClass(); + } catch (ClassNotFoundException e) { + Log.e(LOGTAG, "error loading provider", e); + throw new AndroidRuntimeException(e); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW); + } + + StrictMode.ThreadPolicy oldPolicy = StrictMode.allowThreadDiskReads(); + Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "providerClass.newInstance()"); + try { + sProviderInstance = providerClass.newInstance(); + if (DEBUG) Log.v(LOGTAG, "Loaded provider: " + sProviderInstance); + return sProviderInstance; + } catch (Exception e) { + Log.e(LOGTAG, "error instantiating provider", e); + throw new AndroidRuntimeException(e); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW); + StrictMode.setThreadPolicy(oldPolicy); + } } finally { - StrictMode.setThreadPolicy(oldPolicy); + Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW); } } } @@ -122,8 +135,13 @@ public final class WebViewFactory { initialApplication.getAssets().addAssetPath( webViewContext.getApplicationInfo().sourceDir); ClassLoader clazzLoader = webViewContext.getClassLoader(); - return (Class) Class.forName(CHROMIUM_WEBVIEW_FACTORY, true, - clazzLoader); + Trace.traceBegin(Trace.TRACE_TAG_WEBVIEW, "Class.forName()"); + try { + return (Class) Class.forName(CHROMIUM_WEBVIEW_FACTORY, true, + clazzLoader); + } finally { + Trace.traceEnd(Trace.TRACE_TAG_WEBVIEW); + } } catch (PackageManager.NameNotFoundException e) { // If the package doesn't exist, then try loading the null WebView instead. // If that succeeds, then this is a device without WebView support; if it fails then