OSDN Git Service

Update WebViewUpdateService to receive PACKAGE_REPLACED broadcast.
authorBen Murdoch <benm@google.com>
Thu, 17 Jul 2014 13:55:00 +0000 (14:55 +0100)
committerBen Murdoch <benm@google.com>
Thu, 17 Jul 2014 21:18:40 +0000 (21:18 +0000)
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
services/core/java/com/android/server/webkit/WebViewUpdateService.java
services/java/com/android/server/SystemServer.java

index 13be453..2c7b3eb 100644 (file)
@@ -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
index e8ae97c..60724e7 100644 (file)
 
 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();
+    }
 }
index a6030cf..b224249 100644 (file)
@@ -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();