summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--services/core/java/com/android/server/webkit/SystemImpl.java35
-rw-r--r--services/core/java/com/android/server/webkit/SystemInterface.java3
-rw-r--r--services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java41
-rw-r--r--services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java42
-rw-r--r--services/tests/servicestests/src/com/android/server/webkit/TestSystemImpl.java4
5 files changed, 44 insertions, 81 deletions
diff --git a/services/core/java/com/android/server/webkit/SystemImpl.java b/services/core/java/com/android/server/webkit/SystemImpl.java
index ea8a801ff697..3b2e69a97889 100644
--- a/services/core/java/com/android/server/webkit/SystemImpl.java
+++ b/services/core/java/com/android/server/webkit/SystemImpl.java
@@ -21,6 +21,7 @@ import static android.webkit.Flags.updateServiceV2;
import android.app.ActivityManager;
import android.app.AppGlobals;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
@@ -39,11 +40,14 @@ import android.webkit.WebViewProviderInfo;
import android.webkit.WebViewZygote;
import com.android.internal.util.XmlUtils;
+import com.android.server.LocalServices;
+import com.android.server.PinnerService;
import org.xmlpull.v1.XmlPullParserException;
import java.io.IOException;
import java.util.ArrayList;
+import java.util.Collections;
import java.util.List;
/**
@@ -60,6 +64,7 @@ public class SystemImpl implements SystemInterface {
private static final String TAG_AVAILABILITY = "availableByDefault";
private static final String TAG_SIGNATURE = "signature";
private static final String TAG_FALLBACK = "isFallback";
+ private static final String PIN_GROUP = "webview";
private final WebViewProviderInfo[] mWebViewProviderPackages;
// Initialization-on-demand holder idiom for getting the WebView provider packages once and
@@ -277,6 +282,36 @@ public class SystemImpl implements SystemInterface {
return true;
}
+ @Override
+ public void pinWebviewIfRequired(ApplicationInfo appInfo) {
+ PinnerService pinnerService = LocalServices.getService(PinnerService.class);
+ int webviewPinQuota = pinnerService.getWebviewPinQuota();
+ if (webviewPinQuota <= 0) {
+ return;
+ }
+
+ pinnerService.unpinGroup(PIN_GROUP);
+
+ ArrayList<String> apksToPin = new ArrayList<>();
+ boolean pinSharedFirst = appInfo.metaData.getBoolean("PIN_SHARED_LIBS_FIRST", true);
+ for (String sharedLib : appInfo.sharedLibraryFiles) {
+ apksToPin.add(sharedLib);
+ }
+ apksToPin.add(appInfo.sourceDir);
+ if (!pinSharedFirst) {
+ // We want to prioritize pinning of the native library that is most likely used by apps
+ // which in some build flavors live in the main apk and as a shared library for others.
+ Collections.reverse(apksToPin);
+ }
+ for (String apk : apksToPin) {
+ if (webviewPinQuota <= 0) {
+ break;
+ }
+ int bytesPinned = pinnerService.pinFile(apk, webviewPinQuota, appInfo, PIN_GROUP);
+ webviewPinQuota -= bytesPinned;
+ }
+ }
+
// flags declaring we want extra info from the package manager for webview providers
private final static int PACKAGE_FLAGS = PackageManager.GET_META_DATA
| PackageManager.GET_SIGNATURES | PackageManager.GET_SHARED_LIBRARY_FILES
diff --git a/services/core/java/com/android/server/webkit/SystemInterface.java b/services/core/java/com/android/server/webkit/SystemInterface.java
index 09c23a7229ad..5ed2cfe4252d 100644
--- a/services/core/java/com/android/server/webkit/SystemInterface.java
+++ b/services/core/java/com/android/server/webkit/SystemInterface.java
@@ -17,6 +17,7 @@
package com.android.server.webkit;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.webkit.UserPackage;
@@ -61,4 +62,6 @@ public interface SystemInterface {
/** Start the zygote if it's not already running. */
public void ensureZygoteStarted();
public boolean isMultiProcessDefaultEnabled();
+
+ public void pinWebviewIfRequired(ApplicationInfo appInfo);
}
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java
index d95b431752ec..1d6ad6d3a6d9 100644
--- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java
+++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl.java
@@ -17,7 +17,6 @@ package com.android.server.webkit;
import android.annotation.Nullable;
import android.content.Context;
-import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
@@ -30,12 +29,8 @@ import android.webkit.WebViewFactory;
import android.webkit.WebViewProviderInfo;
import android.webkit.WebViewProviderResponse;
-import com.android.server.LocalServices;
-import com.android.server.PinnerService;
-
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
/**
@@ -93,8 +88,6 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
private static final int MULTIPROCESS_SETTING_ON_VALUE = Integer.MAX_VALUE;
private static final int MULTIPROCESS_SETTING_OFF_VALUE = Integer.MIN_VALUE;
- private static final String PIN_GROUP = "webview";
-
private final SystemInterface mSystemInterface;
private final Context mContext;
@@ -346,38 +339,6 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
return newPackage;
}
- private void pinWebviewIfRequired(ApplicationInfo appInfo) {
- PinnerService pinnerService = LocalServices.getService(PinnerService.class);
- if (pinnerService == null) {
- // This happens in unit tests which do not have services.
- return;
- }
- int webviewPinQuota = pinnerService.getWebviewPinQuota();
- if (webviewPinQuota <= 0) {
- return;
- }
-
- pinnerService.unpinGroup(PIN_GROUP);
-
- ArrayList<String> apksToPin = new ArrayList<>();
- boolean pinSharedFirst = appInfo.metaData.getBoolean("PIN_SHARED_LIBS_FIRST", true);
- for (String sharedLib : appInfo.sharedLibraryFiles) {
- apksToPin.add(sharedLib);
- }
- apksToPin.add(appInfo.sourceDir);
- if (!pinSharedFirst) {
- // We want to prioritize pinning of the native library that is most likely used by apps
- // which in some build flavors live in the main apk and as a shared library for others.
- Collections.reverse(apksToPin);
- }
- for (String apk : apksToPin) {
- if (webviewPinQuota <= 0) {
- break;
- }
- int bytesPinned = pinnerService.pinFile(apk, webviewPinQuota, appInfo, PIN_GROUP);
- webviewPinQuota -= bytesPinned;
- }
- }
/**
* This is called when we change WebView provider, either when the current provider is
* updated or a new provider is chosen / takes precedence.
@@ -386,7 +347,7 @@ class WebViewUpdateServiceImpl implements WebViewUpdateServiceInterface {
synchronized (mLock) {
mAnyWebViewInstalled = true;
if (mNumRelroCreationsStarted == mNumRelroCreationsFinished) {
- pinWebviewIfRequired(newPackage.applicationInfo);
+ mSystemInterface.pinWebviewIfRequired(newPackage.applicationInfo);
mCurrentWebViewPackage = newPackage;
// The relro creations might 'finish' (not start at all) before
diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java
index 1bc635bd9ca3..8637d914c9bd 100644
--- a/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java
+++ b/services/core/java/com/android/server/webkit/WebViewUpdateServiceImpl2.java
@@ -17,7 +17,6 @@ package com.android.server.webkit;
import android.annotation.Nullable;
import android.content.Context;
-import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.Signature;
@@ -32,12 +31,8 @@ import android.webkit.WebViewFactory;
import android.webkit.WebViewProviderInfo;
import android.webkit.WebViewProviderResponse;
-import com.android.server.LocalServices;
-import com.android.server.PinnerService;
-
import java.io.PrintWriter;
import java.util.ArrayList;
-import java.util.Collections;
import java.util.List;
/**
@@ -88,8 +83,6 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
private static final int VALIDITY_INCORRECT_SIGNATURE = 3;
private static final int VALIDITY_NO_LIBRARY_FLAG = 4;
- private static final String PIN_GROUP = "webview";
-
private final SystemInterface mSystemInterface;
private final Context mContext;
@@ -356,39 +349,6 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
return newPackage;
}
- private void pinWebviewIfRequired(ApplicationInfo appInfo) {
- PinnerService pinnerService = LocalServices.getService(PinnerService.class);
- if (pinnerService == null) {
- // This happens in unit tests which do not have services.
- return;
- }
- int webviewPinQuota = pinnerService.getWebviewPinQuota();
- if (webviewPinQuota <= 0) {
- return;
- }
-
- pinnerService.unpinGroup(PIN_GROUP);
-
- ArrayList<String> apksToPin = new ArrayList<>();
- boolean pinSharedFirst = appInfo.metaData.getBoolean("PIN_SHARED_LIBS_FIRST", true);
- for (String sharedLib : appInfo.sharedLibraryFiles) {
- apksToPin.add(sharedLib);
- }
- apksToPin.add(appInfo.sourceDir);
- if (!pinSharedFirst) {
- // We want to prioritize pinning of the native library that is most likely used by apps
- // which in some build flavors live in the main apk and as a shared library for others.
- Collections.reverse(apksToPin);
- }
- for (String apk : apksToPin) {
- if (webviewPinQuota <= 0) {
- break;
- }
- int bytesPinned = pinnerService.pinFile(apk, webviewPinQuota, appInfo, PIN_GROUP);
- webviewPinQuota -= bytesPinned;
- }
- }
-
/**
* This is called when we change WebView provider, either when the current provider is
* updated or a new provider is chosen / takes precedence.
@@ -397,7 +357,7 @@ class WebViewUpdateServiceImpl2 implements WebViewUpdateServiceInterface {
synchronized (mLock) {
mAnyWebViewInstalled = true;
if (mNumRelroCreationsStarted == mNumRelroCreationsFinished) {
- pinWebviewIfRequired(newPackage.applicationInfo);
+ mSystemInterface.pinWebviewIfRequired(newPackage.applicationInfo);
mCurrentWebViewPackage = newPackage;
// The relro creations might 'finish' (not start at all) before
diff --git a/services/tests/servicestests/src/com/android/server/webkit/TestSystemImpl.java b/services/tests/servicestests/src/com/android/server/webkit/TestSystemImpl.java
index ae0a758449b5..65662d6b30b8 100644
--- a/services/tests/servicestests/src/com/android/server/webkit/TestSystemImpl.java
+++ b/services/tests/servicestests/src/com/android/server/webkit/TestSystemImpl.java
@@ -17,6 +17,7 @@
package com.android.server.webkit;
import android.content.Context;
+import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.pm.UserInfo;
@@ -179,4 +180,7 @@ public class TestSystemImpl implements SystemInterface {
public boolean isMultiProcessDefaultEnabled() {
return mMultiProcessDefault;
}
+
+ @Override
+ public void pinWebviewIfRequired(ApplicationInfo appInfo) {}
}