赞
踩
首先在/vendor/xxxx/中创建etc/文件夹
在etc/中创建Android.bp
和default-permissions-xxxx.xml
文件
Android.bp
文件写法:
prebuilt_etc {
name: "default_permissions_whitelist_xxxx",
product_specific: true,
sub_dir: "default-permissions",
src: "default-permissions-xxxx.xml",
filename_from_src: true,
}
default-permissions-xxxx.xml
文件写法:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <!-- ~ Copyright (C) 2016 The Android Open Source Project ~ ~ Licensed under the Apache License, Version 2.0 (the "License"); ~ you may not use this file except in compliance with the License. ~ You may obtain a copy of the License at ~ ~ http://www.apache.org/licenses/LICENSE-2.0 ~ ~ Unless required by applicable law or agreed to in writing, software ~ distributed under the License is distributed on an "AS IS" BASIS, ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. ~ See the License for the specific language governing permissions and ~ limitations under the License --> <!-- This XML file declares which signature|privileged permissions should be granted to privileged applications that come with the platform --> <exceptions> <!-- exception package 为要授予权限的app包名 --> <!-- permission name 为要授予权限的app默认授予的权限 --> <!-- permission的fixed表示授权后是否可以被非系统组件修改权限 --> <exception package="com.xxxx.demo"> <permission name="android.permission.INTERNET" fixed="false"/> <permission name="android.permission.WRITE_EXTERNAL_STORAGE" fixed="false"/> <permission name="android.permission.ACCESS_NETWORK_STATE" fixed="false"/> <permission name="android.permission.READ_EXTERNAL_STORAGE" fixed="false"/> <permission name="android.permission.RECORD_AUDIO" fixed="false"/> <permission name="android.permission.READ_PHONE_STATE" fixed="false"/> <permission name="android.permission.ACCESS_WIFI_STATE" fixed="false"/> <permission name="Manifest.permission.CAMERA" fixed="false"/> <permission name="Manifest.permission.READ_PHONE_STATE" fixed="false"/> <permission name="Manifest.permission.RECORD_AUDIO" fixed="false"/> <permission name="Manifest.permission.ACCESS_COARSE_LOCATION" fixed="false"/> <permission name="Manifest.permission.ACCESS_FINE_LOCATION" fixed="false"/> <permission name="android.permission.CHANGE_WIFI_STATE" fixed="false"/> <permission name="android.permission.CAMERA" fixed="false"/> <permission name="android.permission.FLASHLIGHT" fixed="false"/> <permission name="android.permission.VIBRATE" fixed="false"/> <permission name="android.permission.FOREGROUND_SERVICE" fixed="false"/> <permission name="android.permission.WAKE_LOCK" fixed="false"/> <permission name="android.permission.MODIFY_AUDIO_SETTINGS" fixed="false"/> <permission name="android.permission.BROADCAST_STICKY" fixed="false"/> <permission name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" fixed="false"/> <permission name="android.permission.RECEIVE_BOOT_COMPLETED" fixed="false"/> <permission name="android.permission.INTERACT_ACROSS_USERS" fixed="false"/> <permission name="android.permission.GET_TASKS" fixed="false"/> <permission name="android.permission.CHANGE_CONFIGURATION" fixed="false"/> </exception> <!-- 赋予app权限只需在后面添加对应的exception package和permission name即可 --> </exceptions>
修改/device/rockchip/rk356x/device.mk
# add by mazhuang for By default, Grant app permissions 2021/08/30
$(call inherit-product, vendor/xxxx/device.mk)
在/vendor/xxxx/device.mk中添加
# add by mazhuang for By default, Grant app permissions 2021/08/30
PRODUCT_PACKAGES += \
default_permissions_whitelist_xxxx
在default-permissions-xxxx.xml
中添加的app和权限最终在/frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java中的grantDefaultPermissionExceptions()方法中赋予权限。
private void grantDefaultPermissionExceptions(PackageManagerWrapper pm, int userId) { mHandler.removeMessages(MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS); synchronized (mLock) { // mGrantExceptions is null only before the first read and then // it serves as a cache of the default grants that should be // performed for every user. If there is an entry then the app // is on the system image and supports runtime permissions. if (mGrantExceptions == null) { mGrantExceptions = readDefaultPermissionExceptionsLocked(pm); } } Set<String> permissions = null; final int exceptionCount = mGrantExceptions.size(); for (int i = 0; i < exceptionCount; i++) { String packageName = mGrantExceptions.keyAt(i); PackageInfo pkg = pm.getSystemPackageInfo(packageName); List<DefaultPermissionGrant> permissionGrants = mGrantExceptions.valueAt(i); final int permissionGrantCount = permissionGrants.size(); for (int j = 0; j < permissionGrantCount; j++) { DefaultPermissionGrant permissionGrant = permissionGrants.get(j); if (!pm.isPermissionDangerous(permissionGrant.name)) { Log.w(TAG, "Ignoring permission " + permissionGrant.name + " which isn't dangerous"); continue; } if (permissions == null) { permissions = new ArraySet<>(); } else { permissions.clear(); } permissions.add(permissionGrant.name); grantRuntimePermissions(pm, pkg, permissions, permissionGrant.fixed, permissionGrant.whitelisted, true /*whitelistRestrictedPermissions*/, userId); } } }
读取default-permissions-xxxx.xml
的方法应该是readDefaultPermissionExceptionsLocked()
private @NonNull ArrayMap<String, List<DefaultPermissionGrant>> readDefaultPermissionExceptionsLocked(PackageManagerWrapper pm) { File[] files = getDefaultPermissionFiles(); if (files == null) { return new ArrayMap<>(0); } ArrayMap<String, List<DefaultPermissionGrant>> grantExceptions = new ArrayMap<>(); // Iterate over the files in the directory and scan .xml files for (File file : files) { if (!file.getPath().endsWith(".xml")) { Slog.i(TAG, "Non-xml file " + file + " in " + file.getParent() + " directory, ignoring"); continue; } if (!file.canRead()) { Slog.w(TAG, "Default permissions file " + file + " cannot be read"); continue; } try ( InputStream str = new BufferedInputStream(new FileInputStream(file)) ) { XmlPullParser parser = Xml.newPullParser(); parser.setInput(str, null); parse(pm, parser, grantExceptions); } catch (XmlPullParserException | IOException e) { Slog.w(TAG, "Error reading default permissions file " + file, e); } } return grantExceptions; }
最终调用到grantRuntimePermissions()方法对app赋予权限。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。