From dc00a84af15ff3594a6dfa512be21095bf9fee82 Mon Sep 17 00:00:00 2001 From: Ben Murdoch Date: Thu, 17 Jul 2014 14:55:00 +0100 Subject: [PATCH] Update WebViewUpdateService to receive PACKAGE_REPLACED broadcast. This allows the WebViewUpdateService to receive notifications that an update has been installed and we need to trigger recreation of the relro file. bug: 16329377 Change-Id: I088e61487416add997995db304beca0cde71390c --- core/java/android/webkit/WebViewFactory.java | 5 +++ .../server/webkit/WebViewUpdateService.java | 32 ++++++++++++++++++- .../java/com/android/server/SystemServer.java | 2 +- 3 files changed, 37 insertions(+), 2 deletions(-) diff --git a/core/java/android/webkit/WebViewFactory.java b/core/java/android/webkit/WebViewFactory.java index 13be4539d1892..2c7b3ebccdaf3 100644 --- a/core/java/android/webkit/WebViewFactory.java +++ b/core/java/android/webkit/WebViewFactory.java @@ -63,6 +63,11 @@ public final class WebViewFactory { private static final Object sProviderLock = new Object(); private static boolean sAddressSpaceReserved = false; + public static String getWebViewPackageName() { + // TODO: Make this dynamic based on resource configuration. + return "com.android.webview"; + } + static WebViewFactoryProvider getProvider() { synchronized (sProviderLock) { // For now the main purpose of this function (and the factory abstraction) is to keep diff --git a/services/core/java/com/android/server/webkit/WebViewUpdateService.java b/services/core/java/com/android/server/webkit/WebViewUpdateService.java index e8ae97c29cae4..60724e73ed624 100644 --- a/services/core/java/com/android/server/webkit/WebViewUpdateService.java +++ b/services/core/java/com/android/server/webkit/WebViewUpdateService.java @@ -16,10 +16,15 @@ package com.android.server.webkit; +import android.content.BroadcastReceiver; +import android.content.Context; +import android.content.Intent; +import android.content.IntentFilter; import android.os.Binder; import android.os.Process; import android.util.Log; import android.webkit.IWebViewUpdateService; +import android.webkit.WebViewFactory; /** * Private service to wait for the updatable WebView to be ready for use. @@ -32,7 +37,22 @@ public class WebViewUpdateService extends IWebViewUpdateService.Stub { private boolean mRelroReady32Bit = false; private boolean mRelroReady64Bit = false; - public WebViewUpdateService() { + private BroadcastReceiver mWebViewUpdatedReceiver; + + public WebViewUpdateService(Context context) { + mWebViewUpdatedReceiver = new BroadcastReceiver() { + @Override + public void onReceive(Context context, Intent intent) { + String webviewPackage = "package:" + WebViewFactory.getWebViewPackageName(); + if (webviewPackage.equals(intent.getDataString())) { + onWebViewUpdateInstalled(); + } + } + }; + IntentFilter filter = new IntentFilter(); + filter.addAction(Intent.ACTION_PACKAGE_REPLACED); + filter.addDataScheme("package"); + context.registerReceiver(mWebViewUpdatedReceiver, filter); } /** @@ -75,4 +95,14 @@ public class WebViewUpdateService extends IWebViewUpdateService.Stub { } } } + + private void onWebViewUpdateInstalled() { + Log.d(TAG, "WebView Package updated!"); + + synchronized (this) { + mRelroReady32Bit = false; + mRelroReady64Bit = false; + } + WebViewFactory.prepareWebViewInSystemServer(); + } } diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index a6030cfc7dcab..b2242494ec3dd 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -411,7 +411,7 @@ public final class SystemServer { SystemConfig.getInstance(); Slog.i(TAG, "WebView Update Service"); - ServiceManager.addService("webviewupdate", new WebViewUpdateService()); + ServiceManager.addService("webviewupdate", new WebViewUpdateService(context)); Slog.i(TAG, "WebViewFactory preparation"); WebViewFactory.prepareWebViewInSystemServer();