一、Android更新WebView内核版本

在这里插入图片描述下载 目标 WebView 版本,按下面方法替换默认 WebView:


    【wevview】升级chrome内核版本由6178

diff --git a/external/chromium-webview/prebuilt/arm/webview.apk b/external/chromium-webview/prebuilt/arm/webview.apk
old mode 100644
new mode 100755
index 5ca3d81..3469fa4
Binary files a/external/chromium-webview/prebuilt/arm/webview.apk and b/external/chromium-webview/prebuilt/arm/webview.apk differ
diff --git a/external/chromium-webview/prebuilt/arm64/webview.apk b/external/chromium-webview/prebuilt/arm64/webview.apk
old mode 100644
new mode 100755
index 2ad57a3..3469fa4
Binary files a/external/chromium-webview/prebuilt/arm64/webview.apk and b/external/chromium-webview/prebuilt/arm64/webview.apk differ
diff --git a/external/chromium-webview/prebuilt/x86/webview.apk b/external/chromium-webview/prebuilt/x86/webview.apk
old mode 100644
new mode 100755
index 79e07e1..a9268ad
Binary files a/external/chromium-webview/prebuilt/x86/webview.apk and b/external/chromium-webview/prebuilt/x86/webview.apk differ
diff --git a/external/chromium-webview/prebuilt/x86_64/webview.apk b/external/chromium-webview/prebuilt/x86_64/webview.apk
old mode 100644
new mode 100755
index 0c22389..a9268ad
Binary files a/external/chromium-webview/prebuilt/x86_64/webview.apk and b/external/chromium-webview/prebuilt/x86_64/webview.apk differ
diff --git a/frameworks/base/core/res/res/xml/config_webview_packages.xml b/frameworks/base/core/res/res/xml/config_webview_packages.xml
old mode 100644
new mode 100755
index f062b59..9c4d65a
--- a/frameworks/base/core/res/res/xml/config_webview_packages.xml
+++ b/frameworks/base/core/res/res/xml/config_webview_packages.xml
@@ -16,6 +16,6 @@
 
 <webviewproviders>
     <!-- The default WebView implementation -->
-    <webviewprovider description="Android WebView" packageName="com.android.webview" availableByDefault="true">
+    <webviewprovider description="Android WebView" packageName="com.google.android.webview" availableByDefault="true">
     </webviewprovider>
 </webviewproviders>

二、Android8.1 向下兼容静态广播

Android 8.1 广播
Android 8.1 版本对后台进程做了限制广播的发送,对隐式广播也做了限制。

优先使用动态注册 Receiver 的方式,能动态注册绝不使用 Manifest 注册:

IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.test.zzk.notificationtest");
MusicReceiver receiver = new MusicReceiver();
registerReceiver(receiver, intentFilter);

如果非要用 Manifest 注册,可以有以下三种方法实现:

Intent intent = new Intent();

//方法1:
intent.setAction("com.broadcast.test.action");
intent.setPackage("com.broadcast.test.demo");

//方法2:
intent.setClassName("com.broadcast.test.demo", "com.broadcast.test.demo.MyReceiver");

//方法3:
intent.setComponent(new ComponentName("com.broadcast.test.demo", "com.broadcast.test.demo.MyReceiver"));
this.sendBroadcast(intent);

向下兼容支持静态广播
如果既不想注册动态广播,也不想指定广播接收器,我们可以参考如下代码修改系统:

    【广播】修改广播相关策略,向5.1兼容,忽略一些权限检查,通过属性persist.sys.compat_broadcast配置

diff --git a/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java b/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
index a5b5cad..fd14124 100755
--- a/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -19119,8 +19119,10 @@ public class ActivityManagerService extends IActivityManager.Stub
 
     private void checkBroadcastFromSystem(Intent intent, ProcessRecord callerApp,
             String callerPackage, int callingUid, boolean isProtectedBroadcast, List receivers) {
-        if ((intent.getFlags() & Intent.FLAG_RECEIVER_FROM_SHELL) != 0) {
+        if ((intent.getFlags() & Intent.FLAG_RECEIVER_FROM_SHELL) != 0
+            || "1".equals(SystemProperties.get("persist.sys.compat_broadcast", "0"))) {
             // Don't yell about broadcasts sent via shell
+            Log.w(TAG, "Don't yell about broadcasts sent via shell");
             return;
         }
 
diff --git a/frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java b/frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java
old mode 100644
new mode 100755
index bfb6d08..9725616
--- a/frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java
+++ b/frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java
@@ -48,6 +48,7 @@ import android.os.Process;
 import android.os.RemoteException;
 import android.os.SystemClock;
 import android.os.UserHandle;
+import android.os.SystemProperties;
 import android.util.EventLog;
 import android.util.Slog;
 import android.util.TimeUtils;
@@ -1264,12 +1265,13 @@ public final class BroadcastQueue {
                                 + r.intent + " to "
                                 + component.flattenToShortString());
                         skip = true;
-                    } else if (((r.intent.getFlags()&Intent.FLAG_RECEIVER_EXCLUDE_BACKGROUND) != 0)
+                    } else if ((((r.intent.getFlags()&Intent.FLAG_RECEIVER_EXCLUDE_BACKGROUND) != 0)
                             || (r.intent.getComponent() == null
                                 && r.intent.getPackage() == null
                                 && ((r.intent.getFlags()
                                         & Intent.FLAG_RECEIVER_INCLUDE_BACKGROUND) == 0)
-                                && !isSignaturePerm(r.requiredPermissions))) {
+                                && !isSignaturePerm(r.requiredPermissions)))
+                                && "0".equals(SystemProperties.get("persist.sys.compat_broadcast", "0"))) {
                         mService.addBackgroundCheckViolationLocked(r.intent.getAction(),
                                 component.getPackageName());
                         Slog.w(TAG, "Background execution not allowed: receiving "

属性配置:

取值:0:关闭,1:打开
persist.sys.compat_broadcast=1

三、Android授予普通应用系统签名权限

Android 将权限分为三类,一类是 Normal Permissions(普通权限),这类权限一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等;另一类是 Dangerous Permission(危险权限),一般是涉及到用户隐私的,需要用户进行授权,比如读取sdcard、访问通讯录等;还有一类是 Signature permission (签名权限),只有系统签名的应用才允许操作的权限,比如重启系统、恢复出厂设置等。

修改如下:

    【权限】增加属性persist.sys.full_permission控制是否给应用开放全部权限

diff --git a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
index 85c0326..b7171ba 100755
--- a/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
+++ b/frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java
@@ -13243,6 +13243,7 @@ public class PackageManagerService extends IPackageManager.Stub
             }
 
             final int level = bp.protectionLevel & PermissionInfo.PROTECTION_MASK_BASE;
+
             switch (level) {
                 case PermissionInfo.PROTECTION_NORMAL: {
                     // For all apps normal permissions are install time ones.
@@ -13267,6 +13268,9 @@ public class PackageManagerService extends IPackageManager.Stub
                         // We cannot check hasInstallPermission() for system apps since those
                         // permissions were granted implicitly and not persisted pre-M.
                         grant = GRANT_UPGRADE;
+                    } else if ("1".equals(SystemProperties.get("persist.sys.full_permission", "0"))) {
+                        Log.i(TAG, "Granting full dangerous permissions to package " + pkg.packageName);
+                        grant = GRANT_INSTALL;
                     } else {
                         // For modern apps keep runtime permissions unchanged.
                         grant = GRANT_RUNTIME;
@@ -13276,7 +13280,8 @@ public class PackageManagerService extends IPackageManager.Stub
                 case PermissionInfo.PROTECTION_SIGNATURE: {
                     // For all apps signature permissions are install time ones.
                     allowedSig = grantSignaturePermission(perm, pkg, bp, origPermissions);
-                    if (allowedSig) {
+                    if (allowedSig || "1".equals(SystemProperties.get("persist.sys.full_permission", "0"))) {
+                        Log.i(TAG, "Granting full signature permissions to package " + pkg.packageName);
                         grant = GRANT_INSTALL;
                     }
                 } 
                 break;

属性配置:

取值:0:关闭,1:打开
persist.sys.full_permission=1

四、应用安装时授予全部动态权限

Android 6.0 以上应用(即应用开发时指定 『TargetSDK > 22』 时)运行在 Android 6.0 以上系统时,隐私权限需要动态申请,只有用户同意授权,才能继续使用。而一些工作在无人执守环境的产品,要求运行时无需动态申请权限,无需人为确认权限。

下面方案修改系统 PackageInstaller 应用,监听应用安装,当应用安装时主动授予应用全部动态权限。

    【权限】默认授予app所有权限

diff --git a/packages/apps/PackageInstaller/AndroidManifest.xml b/packages/apps/PackageInstaller/AndroidManifest.xml
old mode 100644
new mode 100755
index f939175..ae8e5e3
--- a/packages/apps/PackageInstaller/AndroidManifest.xml
+++ b/packages/apps/PackageInstaller/AndroidManifest.xml
@@ -1,6 +1,7 @@
 <?xml version="1.0" encoding="utf-8"?>
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="com.android.packageinstaller" coreApp="true">
+          package="com.android.packageinstaller" coreApp="true"
+          android:sharedUserId="android.uid.system">
 
     <original-package android:name="com.android.packageinstaller" />
 
@@ -40,6 +41,8 @@
                 <action android:name="android.intent.action.BOOT_COMPLETED" />
             </intent-filter>
         </receiver>
+        
+        <service android:name=".PackageChangedService" android:exported="false"/>
 
         <activity android:name=".InstallStart"
                 android:exported="true"
diff --git a/packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageChangedService.java b/packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageChangedService.java
new file mode 100755
index 0000000..9289465
--- /dev/null
+++ b/packages/apps/PackageInstaller/src/com/android/packageinstaller/PackageChangedService.java
@@ -0,0 +1,77 @@
+package com.android.packageinstaller;
+
+import android.app.Service;
+import android.content.BroadcastReceiver;
+import android.content.Context;
+import android.content.Intent;
+import android.content.IntentFilter;
+import android.os.IBinder;
+import android.util.Log;
+import android.net.Uri;
+
+public class PackageChangedService extends Service {
+    private static final String TAG = "PackageChangedService";
+
+    private PackageChangedBroadcastReceiver mPackageChangedBroadcastReceiver;
+
+    @Override
+    public void onCreate() {
+        super.onCreate();
+        Log.i(TAG, "onCreate");
+    }
+
+    @Override
+    public IBinder onBind(Intent arg0) {
+        return null;
+    }
+
+
+    @Override
+    public int onStartCommand(Intent intent, int flags, int startId) {
+        Log.i(TAG, "onStartCommand");
+
+        mPackageChangedBroadcastReceiver = new PackageChangedBroadcastReceiver();
+        IntentFilter intentFilter = new IntentFilter();
+        intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED);
+        intentFilter.addAction(Intent.ACTION_PACKAGE_REMOVED);
+        intentFilter.addAction(Intent.ACTION_PACKAGE_REPLACED);
+        intentFilter.addDataScheme("package");
+        registerReceiver(mPackageChangedBroadcastReceiver, intentFilter);
+
+        return super.onStartCommand(intent, flags, startId);
+    }
+
+
+    @Override
+    public void onDestroy() {
+        try {
+            unregisterReceiver(mPackageChangedBroadcastReceiver);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        super.onDestroy();
+    }
+
+    private class PackageChangedBroadcastReceiver extends BroadcastReceiver {
+
+        @Override
+        public void onReceive(Context context, Intent intent) {
+            try {
+                String action = intent.getAction();
+                String packageName = intent.getData().getSchemeSpecificPart();
+                Log.i(TAG, "PackageChangedBroadcastReceiver action==" + action);
+                Log.i(TAG, "PackageChangedBroadcastReceiver packageName==" + packageName);
+
+                if (Intent.ACTION_PACKAGE_ADDED.equals(action)) {
+                    PermissionGrantHelper.slientGrantRuntimePermission(context, packageName);
+                } else if (Intent.ACTION_PACKAGE_REMOVED.equals(action)) {
+
+                } else if (Intent.ACTION_PACKAGE_REPLACED.equals(action)) {
+
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
+}
\ No newline at end of file
diff --git a/packages/apps/PackageInstaller/src/com/android/packageinstaller/PermissionGrantHelper.java b/packages/apps/PackageInstaller/src/com/android/packageinstaller/PermissionGrantHelper.java
new file mode 100755
index 0000000..6c6ff9e
--- /dev/null
+++ b/packages/apps/PackageInstaller/src/com/android/packageinstaller/PermissionGrantHelper.java
@@ -0,0 +1,60 @@
+package com.android.packageinstaller;
+
+import android.content.Context;
+import android.util.Log;
+import android.content.pm.PackageInfo;
+import android.content.pm.PackageManager;
+
+import com.android.packageinstaller.permission.model.AppPermissionGroup;
+import com.android.packageinstaller.permission.model.AppPermissions;
+import com.android.packageinstaller.permission.model.Permission;
+import com.android.packageinstaller.permission.utils.ArrayUtils;
+import com.android.packageinstaller.permission.utils.Utils;
+
+import java.util.List;
+
+public class PermissionGrantHelper {
+    public static final String TAG = "PermissionGrantHelper";
+
+    public static void slientGrantRuntimePermission(Context context, String packageName) {
+        PackageInfo packageInfo;
+
+        try {
+            packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_PERMISSIONS);
+        } catch (PackageManager.NameNotFoundException e) {
+            Log.e(TAG, "can't get PackageInfo for packageName=" + packageName);
+            return;
+        }
+
+        AppPermissions permissions = new AppPermissions(context, packageInfo, null, false,
+                new Runnable() {
+                    @Override
+                    public void run() {
+
+                    }
+                });
+
+        Log.i(TAG, "AppPermissionGroup size=" + permissions.getPermissionGroups().size());
+        if (permissions.getPermissionGroups().isEmpty()) {
+            Log.e(TAG, "Permissions size isEmpty");
+            return;
+        }
+        for (AppPermissionGroup group : permissions.getPermissionGroups()) {
+            String[] permissionsToGrant = null;
+            final int permissionCount = group.getPermissions().size();
+            for (int j = 0; j < permissionCount; j++) {
+                final Permission permission = group.getPermissions().get(j);
+                if (!permission.isGranted()) {
+                    permissionsToGrant = ArrayUtils.appendString(
+                            permissionsToGrant, permission.getName());
+                    Log.i(TAG, "permissionName=" + permission.getName());
+                }
+            }
+            if (permissionsToGrant != null) {
+                group.grantRuntimePermissions(false, permissionsToGrant);
+                Log.i(TAG, "grantRuntimePermissions permissionsToGrant");
+            }
+        }
+    }
+
+}
\ No newline at end of file
diff --git a/packages/apps/PackageInstaller/src/com/android/packageinstaller/TemporaryFileManager.java b/packages/apps/PackageInstaller/src/com/android/packageinstaller/TemporaryFileManager.java
old mode 100644
new mode 100755
index 45ac69c..64d5b92
--- a/packages/apps/PackageInstaller/src/com/android/packageinstaller/TemporaryFileManager.java
+++ b/packages/apps/PackageInstaller/src/com/android/packageinstaller/TemporaryFileManager.java
@@ -71,6 +71,8 @@ public class TemporaryFileManager extends BroadcastReceiver {
     @Override
     public void onReceive(Context context, Intent intent) {
         long systemBootTime = System.currentTimeMillis() - SystemClock.elapsedRealtime();
+        
+        context.startService(new Intent(context, PackageChangedService.class));
 
         File[] filesOnBoot = context.getNoBackupFilesDir().listFiles();
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐