Commit ef379b11 authored by Changwan Ryu's avatar Changwan Ryu Committed by Commit Bot

Reduce ART verification failure check time at WebView creation

For pre-Q devices, Q-specific references causes ART verification
failures, and this slows down the creation time.

Move Q-specific references into a smaller class to minimize the time
taken for ART to re-verify verification failures at the run time.

Expected to reduce creation time by 7-10%.

      WebViewChromium

Test: list_class_verification_failures.py no longer shows
Bug: 1031362
Change-Id: I2a27079f22ef3f51b2a192182fba218af1ecf1eb
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/1954711Reviewed-by: default avatarNate Fischer <ntfschr@chromium.org>
Reviewed-by: default avatarBo <boliu@chromium.org>
Commit-Queue: Changwan Ryu <changwan@chromium.org>
Cr-Commit-Position: refs/heads/master@{#722700}
parent 32fa7093
......@@ -43,6 +43,7 @@ android_library("glue") {
"java/src/com/android/webview/chromium/GlueApiHelperForO.java",
"java/src/com/android/webview/chromium/GlueApiHelperForOMR1.java",
"java/src/com/android/webview/chromium/GlueApiHelperForP.java",
"java/src/com/android/webview/chromium/GlueApiHelperForQ.java",
"java/src/com/android/webview/chromium/GraphicsUtils.java",
"java/src/com/android/webview/chromium/MonochromeLibraryPreloader.java",
"java/src/com/android/webview/chromium/SafeBrowsingResponseAdapter.java",
......@@ -73,6 +74,8 @@ android_library("glue") {
"java/src/com/android/webview/chromium/WebViewContentsClientAdapter.java",
"java/src/com/android/webview/chromium/WebViewDatabaseAdapter.java",
"java/src/com/android/webview/chromium/WebViewDelegateFactory.java",
"java/src/com/android/webview/chromium/WebViewRenderProcessAdapter.java",
"java/src/com/android/webview/chromium/WebViewRenderProcessClientAdapter.java",
"java/src/com/android/webview/chromium/WebkitToSharedGlueConverter.java",
]
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package com.android.webview.chromium;
import android.annotation.TargetApi;
import android.os.Build;
import android.webkit.WebViewRenderProcess;
import android.webkit.WebViewRenderProcessClient;
import org.chromium.android_webview.AwRenderProcess;
import org.chromium.base.annotations.VerifiesOnQ;
import java.util.concurrent.Executor;
/**
* Utility class to use new APIs that were added in Q (API level 29). These need to exist in a
* separate class so that Android framework can successfully verify glue layer classes without
* encountering the new APIs. Note that GlueApiHelper is only for APIs that cannot go to ApiHelper
* in base/, for reasons such as using system APIs or instantiating an adapter class that is
* specific to glue layer.
*/
@VerifiesOnQ
@TargetApi(Build.VERSION_CODES.Q)
public final class GlueApiHelperForQ {
private GlueApiHelperForQ() {}
/** @see {@link WebView#getWebViewRenderProcess()} */
public static WebViewRenderProcess getWebViewRenderProcess(AwRenderProcess awRenderProcess) {
return WebViewRenderProcessAdapter.getInstanceFor(awRenderProcess);
}
/**
* @see {@link WebView#setWebViewRenderProcessClient(Executor,
* WebViewRenderProcessClient)}
*/
public static void setWebViewRenderProcessClient(SharedWebViewChromium sharedWebViewChromium,
Executor executor, WebViewRenderProcessClient client) {
sharedWebViewChromium.setWebViewRendererClientAdapter(
new WebViewRenderProcessClientAdapter(executor, client));
}
/** @see {@link WebView#getWebViewRenderProcessClient() */
public static WebViewRenderProcessClient getWebViewRenderProcessClient(
SharedWebViewRendererClientAdapter adapter) {
return ((WebViewRenderProcessClientAdapter) adapter).getWebViewRenderProcessClient();
}
}
......@@ -61,7 +61,6 @@ import androidx.annotation.IntDef;
import org.chromium.android_webview.AwContents;
import org.chromium.android_webview.AwContentsStatics;
import org.chromium.android_webview.AwPrintDocumentAdapter;
import org.chromium.android_webview.AwRenderProcess;
import org.chromium.android_webview.AwSettings;
import org.chromium.android_webview.gfx.AwDrawFnImpl;
import org.chromium.android_webview.renderer_priority.RendererPriority;
......@@ -81,11 +80,9 @@ import org.chromium.content_public.browser.UiThreadTaskTraits;
import java.io.BufferedWriter;
import java.io.File;
import java.lang.ref.WeakReference;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Map;
import java.util.WeakHashMap;
import java.util.concurrent.Callable;
import java.util.concurrent.Executor;
......@@ -274,75 +271,6 @@ class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate
parentContents.supplyContentsForPopup(childContents);
}
@TargetApi(Build.VERSION_CODES.Q)
private static class WebViewRenderProcessAdapter extends WebViewRenderProcess {
private static WeakHashMap<AwRenderProcess, WebViewRenderProcessAdapter> sInstances =
new WeakHashMap<>();
private WeakReference<AwRenderProcess> mAwRenderProcessWeakRef;
public static WebViewRenderProcessAdapter getInstanceFor(AwRenderProcess awRenderProcess) {
if (awRenderProcess == null) {
return null;
}
WebViewRenderProcessAdapter instance = sInstances.get(awRenderProcess);
if (instance == null) {
sInstances.put(awRenderProcess,
instance = new WebViewRenderProcessAdapter(awRenderProcess));
}
return instance;
}
private WebViewRenderProcessAdapter(AwRenderProcess awRenderProcess) {
mAwRenderProcessWeakRef = new WeakReference<>(awRenderProcess);
}
@Override
@SuppressLint("Override")
public boolean terminate() {
AwRenderProcess renderer = mAwRenderProcessWeakRef.get();
if (renderer == null) {
return false;
}
return renderer.terminate();
}
}
private static class WebViewRenderProcessClientAdapter
extends SharedWebViewRendererClientAdapter {
private Executor mExecutor;
private WebViewRenderProcessClient mWebViewRenderProcessClient;
public WebViewRenderProcessClientAdapter(
Executor executor, WebViewRenderProcessClient webViewRenderProcessClient) {
mExecutor = executor;
mWebViewRenderProcessClient = webViewRenderProcessClient;
}
public WebViewRenderProcessClient getWebViewRenderProcessClient() {
return mWebViewRenderProcessClient;
}
@Override
@TargetApi(Build.VERSION_CODES.Q)
public void onRendererUnresponsive(
final WebView view, final AwRenderProcess renderProcess) {
WebViewRenderProcess renderer =
WebViewRenderProcessAdapter.getInstanceFor(renderProcess);
mExecutor.execute(
() -> mWebViewRenderProcessClient.onRenderProcessUnresponsive(view, renderer));
}
@Override
@TargetApi(Build.VERSION_CODES.Q)
public void onRendererResponsive(final WebView view, final AwRenderProcess renderProcess) {
WebViewRenderProcess renderer =
WebViewRenderProcessAdapter.getInstanceFor(renderProcess);
mExecutor.execute(
() -> mWebViewRenderProcessClient.onRenderProcessResponsive(view, renderer));
}
}
// WebViewProvider methods --------------------------------------------------------------------
@Override
......@@ -1545,8 +1473,7 @@ class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate
@Override
public WebViewRenderProcess getWebViewRenderProcess() {
return WebViewRenderProcessAdapter.getInstanceFor(
mSharedWebViewChromium.getRenderProcess());
return GlueApiHelperForQ.getWebViewRenderProcess(mSharedWebViewChromium.getRenderProcess());
}
@Override
......@@ -1558,8 +1485,8 @@ class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate
if (executor == null) {
executor = (Runnable r) -> r.run();
}
mSharedWebViewChromium.setWebViewRendererClientAdapter(
new WebViewRenderProcessClientAdapter(executor, webViewRenderProcessClient));
GlueApiHelperForQ.setWebViewRenderProcessClient(
mSharedWebViewChromium, executor, webViewRenderProcessClient);
}
}
......@@ -1570,7 +1497,7 @@ class WebViewChromium implements WebViewProvider, WebViewProvider.ScrollDelegate
if (adapter == null || !(adapter instanceof WebViewRenderProcessClientAdapter)) {
return null;
}
return ((WebViewRenderProcessClientAdapter) adapter).getWebViewRenderProcessClient();
return GlueApiHelperForQ.getWebViewRenderProcessClient(adapter);
}
@Override
......
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package com.android.webview.chromium;
import android.annotation.SuppressLint;
import android.annotation.TargetApi;
import android.os.Build;
import android.webkit.WebViewRenderProcess;
import org.chromium.android_webview.AwRenderProcess;
import org.chromium.base.annotations.VerifiesOnQ;
import java.lang.ref.WeakReference;
import java.util.WeakHashMap;
@VerifiesOnQ
@TargetApi(Build.VERSION_CODES.Q)
class WebViewRenderProcessAdapter extends WebViewRenderProcess {
private static WeakHashMap<AwRenderProcess, WebViewRenderProcessAdapter> sInstances =
new WeakHashMap<>();
private WeakReference<AwRenderProcess> mAwRenderProcessWeakRef;
public static WebViewRenderProcessAdapter getInstanceFor(AwRenderProcess awRenderProcess) {
if (awRenderProcess == null) {
return null;
}
WebViewRenderProcessAdapter instance = sInstances.get(awRenderProcess);
if (instance == null) {
sInstances.put(
awRenderProcess, instance = new WebViewRenderProcessAdapter(awRenderProcess));
}
return instance;
}
private WebViewRenderProcessAdapter(AwRenderProcess awRenderProcess) {
mAwRenderProcessWeakRef = new WeakReference<>(awRenderProcess);
}
@Override
@SuppressLint("Override")
public boolean terminate() {
AwRenderProcess renderer = mAwRenderProcessWeakRef.get();
if (renderer == null) {
return false;
}
return renderer.terminate();
}
}
\ No newline at end of file
// Copyright 2019 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
package com.android.webview.chromium;
import android.annotation.TargetApi;
import android.os.Build;
import android.webkit.WebView;
import android.webkit.WebViewRenderProcess;
import android.webkit.WebViewRenderProcessClient;
import org.chromium.android_webview.AwRenderProcess;
import org.chromium.base.annotations.VerifiesOnQ;
import java.util.concurrent.Executor;
@VerifiesOnQ
@TargetApi(Build.VERSION_CODES.Q)
class WebViewRenderProcessClientAdapter extends SharedWebViewRendererClientAdapter {
private Executor mExecutor;
private WebViewRenderProcessClient mWebViewRenderProcessClient;
public WebViewRenderProcessClientAdapter(
Executor executor, WebViewRenderProcessClient webViewRenderProcessClient) {
mExecutor = executor;
mWebViewRenderProcessClient = webViewRenderProcessClient;
}
public WebViewRenderProcessClient getWebViewRenderProcessClient() {
return mWebViewRenderProcessClient;
}
@Override
public void onRendererUnresponsive(final WebView view, final AwRenderProcess renderProcess) {
WebViewRenderProcess renderer = WebViewRenderProcessAdapter.getInstanceFor(renderProcess);
mExecutor.execute(
() -> mWebViewRenderProcessClient.onRenderProcessUnresponsive(view, renderer));
}
@Override
public void onRendererResponsive(final WebView view, final AwRenderProcess renderProcess) {
WebViewRenderProcess renderer = WebViewRenderProcessAdapter.getInstanceFor(renderProcess);
mExecutor.execute(
() -> mWebViewRenderProcessClient.onRenderProcessResponsive(view, renderer));
}
}
\ No newline at end of file
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment