Commit 7b0a540b authored by Clark DuVall's avatar Clark DuVall Committed by Chromium LUCI CQ

Add a synthetic field trial for the WebView APK type

I needed to fix the IsolatedSplitsSynthetic trial to only log for
monochrome, and thought it might be useful to have this as well. This
will let us filter UMA data by the WebView APK type, and can help us
answer the age old question of how many users have standalone WebView on
N+.

Bug: 1150162
Change-Id: I4cc97632f514b0c54b07e205c33dd1c1d3703071
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/2618625Reviewed-by: default avatarRichard Coles <torne@chromium.org>
Commit-Queue: Clark DuVall <cduvall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#842113}
parent d0f88119
......@@ -7,6 +7,7 @@ import("//components/spellcheck/spellcheck_build_features.gni")
java_cpp_enum("browser_enums") {
sources = [
"aw_apk_type.h",
"aw_renderer_priority.h",
"aw_settings.h",
"permission/aw_permission_request.h",
......@@ -19,6 +20,7 @@ source_set("browser") {
sources = [
"android_protocol_handler.cc",
"android_protocol_handler.h",
"aw_apk_type.h",
"aw_autofill_client.cc",
"aw_autofill_client.h",
"aw_browser_context.cc",
......
// Copyright 2020 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.
#ifndef ANDROID_WEBVIEW_BROWSER_AW_APK_TYPE_H_
#define ANDROID_WEBVIEW_BROWSER_AW_APK_TYPE_H_
namespace android_webview {
// GENERATED_JAVA_ENUM_PACKAGE: org.chromium.android_webview
enum class ApkType { STANDALONE = 0, MONOCHROME = 1, TRICHROME = 2 };
} // namespace android_webview
#endif // ANDROID_WEBVIEW_BROWSER_AW_APK_TYPE_H_
......@@ -136,11 +136,29 @@ void AwBrowserMainParts::RegisterSyntheticTrials() {
metrics->synthetic_trial_registry()->AddSyntheticTrialObserver(
variations::SyntheticTrialsActiveGroupIdProvider::GetInstance());
static constexpr char kWebViewApkTypeTrial[] = "WebViewApkType";
ApkType apk_type = AwBrowserProcess::GetApkType();
std::string apk_type_string;
switch (apk_type) {
case ApkType::TRICHROME:
apk_type_string = "Trichrome";
break;
case ApkType::MONOCHROME:
apk_type_string = "Monochrome";
break;
case ApkType::STANDALONE:
apk_type_string = "Standalone";
break;
}
AwMetricsServiceAccessor::RegisterSyntheticFieldTrial(
metrics, kWebViewApkTypeTrial, apk_type_string);
// If isolated splits are enabled at build time, Monochrome and Trichrome will
// have a different bundle layout, so measure N+ even though isolated splits
// are only supported by Android in O+.
if (base::android::BuildInfo::GetInstance()->sdk_int() >=
base::android::SDK_VERSION_NOUGAT) {
if (apk_type == ApkType::MONOCHROME &&
base::android::BuildInfo::GetInstance()->sdk_int() >=
base::android::SDK_VERSION_NOUGAT) {
static constexpr char kIsolatedSplitsTrial[] = "IsolatedSplitsSynthetic";
AwMetricsServiceAccessor::RegisterSyntheticFieldTrial(
metrics, kIsolatedSplitsTrial,
......
......@@ -212,6 +212,12 @@ void AwBrowserProcess::TriggerMinidumpUploading() {
base::android::AttachCurrentThread());
}
// static
ApkType AwBrowserProcess::GetApkType() {
return static_cast<ApkType>(
Java_AwBrowserProcess_getApkType(base::android::AttachCurrentThread()));
}
static void JNI_AwBrowserProcess_SetProcessNameCrashKey(
JNIEnv* env,
const base::android::JavaParamRef<jstring>& processName) {
......
......@@ -7,6 +7,7 @@
#ifndef ANDROID_WEBVIEW_BROWSER_AW_BROWSER_PROCESS_H_
#define ANDROID_WEBVIEW_BROWSER_AW_BROWSER_PROCESS_H_
#include "android_webview/browser/aw_apk_type.h"
#include "android_webview/browser/aw_browser_context.h"
#include "android_webview/browser/aw_feature_list_creator.h"
#include "android_webview/browser/lifecycle/aw_contents_lifecycle_notifier.h"
......@@ -73,6 +74,7 @@ class AwBrowserProcess {
void PreMainMessageLoopRun();
static void TriggerMinidumpUploading();
static ApkType GetApkType();
private:
void CreateSafeBrowsingUIManager();
......
......@@ -31,6 +31,7 @@ import android.webkit.WebViewProvider;
import com.android.webview.chromium.WebViewDelegateFactory.WebViewDelegate;
import org.chromium.android_webview.ApkType;
import org.chromium.android_webview.AwBrowserContext;
import org.chromium.android_webview.AwBrowserProcess;
import org.chromium.android_webview.AwContentsStatics;
......@@ -258,6 +259,7 @@ public class WebViewChromiumFactoryProvider implements WebViewFactoryProvider {
packageInfo = WebViewFactory.getLoadedPackageInfo();
}
AwBrowserProcess.setWebViewPackageName(packageInfo.packageName);
AwBrowserProcess.initializeApkType(packageInfo.applicationInfo);
mAwInit = createAwInit();
mWebViewDelegate = webViewDelegate;
......@@ -288,7 +290,7 @@ public class WebViewChromiumFactoryProvider implements WebViewFactoryProvider {
}
int packageId = webViewDelegate.getPackageId(ctx.getResources(), resourcePackage);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q
&& !isTrichrome(packageInfo.applicationInfo)
&& AwBrowserProcess.getApkType() != ApkType.TRICHROME
&& packageId > SHARED_LIBRARY_MAX_ID) {
throw new RuntimeException("Package ID too high for WebView: " + packageId);
}
......@@ -413,13 +415,6 @@ public class WebViewChromiumFactoryProvider implements WebViewFactoryProvider {
}
}
/**
* Determines whether this is Trichrome WebView by checking if any shared library files exist.
*/
private static boolean isTrichrome(ApplicationInfo info) {
return info.sharedLibraryFiles != null && info.sharedLibraryFiles.length > 0;
}
/**
* Both versionCodes should be from a WebView provider package implemented by Chromium.
* VersionCodes from other kinds of packages won't make any sense in this method.
......
......@@ -8,6 +8,7 @@ import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.content.pm.ApplicationInfo;
import android.os.IBinder;
import android.os.ParcelFileDescriptor;
import android.os.RemoteException;
......@@ -56,6 +57,7 @@ import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import java.util.concurrent.TimeUnit;
......@@ -77,6 +79,7 @@ public final class AwBrowserProcess {
PostTask.createSequencedTaskRunner(TaskTraits.BEST_EFFORT_MAY_BLOCK);
private static String sWebViewPackageName;
private static @ApkType int sApkType;
/**
* Loads the native library, and performs basic static construction of objects needed
......@@ -171,6 +174,27 @@ public final class AwBrowserProcess {
return sWebViewPackageName;
}
public static void initializeApkType(ApplicationInfo info) {
if (info.sharedLibraryFiles != null && info.sharedLibraryFiles.length > 0) {
// Only Trichrome uses shared library files.
sApkType = ApkType.TRICHROME;
} else if (info.className.toLowerCase(Locale.ROOT).contains("monochrome")) {
// Only Monochrome has "monochrome" in the application class name.
sApkType = ApkType.MONOCHROME;
} else {
// Everything else must be standalone.
sApkType = ApkType.STANDALONE;
}
}
/**
* Returns the WebView APK type.
*/
@CalledByNative
public static @ApkType int getApkType() {
return sApkType;
}
/**
* Trigger minidump copying, which in turn triggers minidump uploading.
*/
......
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