一、Android更新WebView内核版本
下载 目标 WebView 版本,按下面方法替换默认 WebView:
【wevview】升级chrome内核版本由61到78
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();