当前位置:   article > 正文

Android APP 默认赋予权限_android default-permissions

android default-permissions

 首先在/vendor/xxxx/中创建etc/文件夹

在etc/中创建Android.bpdefault-permissions-xxxx.xml文件

Android.bp文件写法:

  1. prebuilt_etc {
  2. name: "default_permissions_whitelist_xxxx",
  3. product_specific: true,
  4. sub_dir: "default-permissions",
  5. src: "default-permissions-xxxx.xml",
  6. filename_from_src: true,
  7. }

default-permissions-xxxx.xml文件写法:

  1. <?xml version='1.0' encoding='utf-8' standalone='yes' ?>
  2. <!--
  3. ~ Copyright (C) 2016 The Android Open Source Project
  4. ~
  5. ~ Licensed under the Apache License, Version 2.0 (the "License");
  6. ~ you may not use this file except in compliance with the License.
  7. ~ You may obtain a copy of the License at
  8. ~
  9. ~ http://www.apache.org/licenses/LICENSE-2.0
  10. ~
  11. ~ Unless required by applicable law or agreed to in writing, software
  12. ~ distributed under the License is distributed on an "AS IS" BASIS,
  13. ~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. ~ See the License for the specific language governing permissions and
  15. ~ limitations under the License
  16. -->
  17. <!--
  18. This XML file declares which signature|privileged permissions should be granted to privileged
  19. applications that come with the platform
  20. -->
  21. <exceptions>
  22. <!-- exception package 为要授予权限的app包名 -->
  23. <!-- permission name 为要授予权限的app默认授予的权限 -->
  24. <!-- permission的fixed表示授权后是否可以被非系统组件修改权限 -->
  25. <exception package="com.xxxx.demo">
  26. <permission name="android.permission.INTERNET" fixed="false"/>
  27. <permission name="android.permission.WRITE_EXTERNAL_STORAGE" fixed="false"/>
  28. <permission name="android.permission.ACCESS_NETWORK_STATE" fixed="false"/>
  29. <permission name="android.permission.READ_EXTERNAL_STORAGE" fixed="false"/>
  30. <permission name="android.permission.RECORD_AUDIO" fixed="false"/>
  31. <permission name="android.permission.READ_PHONE_STATE" fixed="false"/>
  32. <permission name="android.permission.ACCESS_WIFI_STATE" fixed="false"/>
  33. <permission name="Manifest.permission.CAMERA" fixed="false"/>
  34. <permission name="Manifest.permission.READ_PHONE_STATE" fixed="false"/>
  35. <permission name="Manifest.permission.RECORD_AUDIO" fixed="false"/>
  36. <permission name="Manifest.permission.ACCESS_COARSE_LOCATION" fixed="false"/>
  37. <permission name="Manifest.permission.ACCESS_FINE_LOCATION" fixed="false"/>
  38. <permission name="android.permission.CHANGE_WIFI_STATE" fixed="false"/>
  39. <permission name="android.permission.CAMERA" fixed="false"/>
  40. <permission name="android.permission.FLASHLIGHT" fixed="false"/>
  41. <permission name="android.permission.VIBRATE" fixed="false"/>
  42. <permission name="android.permission.FOREGROUND_SERVICE" fixed="false"/>
  43. <permission name="android.permission.WAKE_LOCK" fixed="false"/>
  44. <permission name="android.permission.MODIFY_AUDIO_SETTINGS" fixed="false"/>
  45. <permission name="android.permission.BROADCAST_STICKY" fixed="false"/>
  46. <permission name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" fixed="false"/>
  47. <permission name="android.permission.RECEIVE_BOOT_COMPLETED" fixed="false"/>
  48. <permission name="android.permission.INTERACT_ACROSS_USERS" fixed="false"/>
  49. <permission name="android.permission.GET_TASKS" fixed="false"/>
  50. <permission name="android.permission.CHANGE_CONFIGURATION" fixed="false"/>
  51. </exception>
  52. <!-- 赋予app权限只需在后面添加对应的exception package和permission name即可 -->
  53. </exceptions>

修改/device/rockchip/rk356x/device.mk

  1. # add by mazhuang for By default, Grant app permissions 2021/08/30
  2. $(call inherit-product, vendor/xxxx/device.mk)

在/vendor/xxxx/device.mk中添加

  1. # add by mazhuang for By default, Grant app permissions 2021/08/30
  2. PRODUCT_PACKAGES += \
  3. default_permissions_whitelist_xxxx

在default-permissions-xxxx.xml中添加的app和权限最终在/frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java中的grantDefaultPermissionExceptions()方法中赋予权限。
 

  1. private void grantDefaultPermissionExceptions(PackageManagerWrapper pm, int userId) {
  2. mHandler.removeMessages(MSG_READ_DEFAULT_PERMISSION_EXCEPTIONS);
  3. synchronized (mLock) {
  4. // mGrantExceptions is null only before the first read and then
  5. // it serves as a cache of the default grants that should be
  6. // performed for every user. If there is an entry then the app
  7. // is on the system image and supports runtime permissions.
  8. if (mGrantExceptions == null) {
  9. mGrantExceptions = readDefaultPermissionExceptionsLocked(pm);
  10. }
  11. }
  12. Set<String> permissions = null;
  13. final int exceptionCount = mGrantExceptions.size();
  14. for (int i = 0; i < exceptionCount; i++) {
  15. String packageName = mGrantExceptions.keyAt(i);
  16. PackageInfo pkg = pm.getSystemPackageInfo(packageName);
  17. List<DefaultPermissionGrant> permissionGrants = mGrantExceptions.valueAt(i);
  18. final int permissionGrantCount = permissionGrants.size();
  19. for (int j = 0; j < permissionGrantCount; j++) {
  20. DefaultPermissionGrant permissionGrant = permissionGrants.get(j);
  21. if (!pm.isPermissionDangerous(permissionGrant.name)) {
  22. Log.w(TAG, "Ignoring permission " + permissionGrant.name
  23. + " which isn't dangerous");
  24. continue;
  25. }
  26. if (permissions == null) {
  27. permissions = new ArraySet<>();
  28. } else {
  29. permissions.clear();
  30. }
  31. permissions.add(permissionGrant.name);
  32. grantRuntimePermissions(pm, pkg, permissions, permissionGrant.fixed,
  33. permissionGrant.whitelisted, true /*whitelistRestrictedPermissions*/,
  34. userId);
  35. }
  36. }
  37. }

读取default-permissions-xxxx.xml的方法应该是readDefaultPermissionExceptionsLocked()

  1. private @NonNull ArrayMap<String, List<DefaultPermissionGrant>>
  2. readDefaultPermissionExceptionsLocked(PackageManagerWrapper pm) {
  3. File[] files = getDefaultPermissionFiles();
  4. if (files == null) {
  5. return new ArrayMap<>(0);
  6. }
  7. ArrayMap<String, List<DefaultPermissionGrant>> grantExceptions = new ArrayMap<>();
  8. // Iterate over the files in the directory and scan .xml files
  9. for (File file : files) {
  10. if (!file.getPath().endsWith(".xml")) {
  11. Slog.i(TAG, "Non-xml file " + file
  12. + " in " + file.getParent() + " directory, ignoring");
  13. continue;
  14. }
  15. if (!file.canRead()) {
  16. Slog.w(TAG, "Default permissions file " + file + " cannot be read");
  17. continue;
  18. }
  19. try (
  20. InputStream str = new BufferedInputStream(new FileInputStream(file))
  21. ) {
  22. XmlPullParser parser = Xml.newPullParser();
  23. parser.setInput(str, null);
  24. parse(pm, parser, grantExceptions);
  25. } catch (XmlPullParserException | IOException e) {
  26. Slog.w(TAG, "Error reading default permissions file " + file, e);
  27. }
  28. }
  29. return grantExceptions;
  30. }

最终调用到grantRuntimePermissions()方法对app赋予权限。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/261299
推荐阅读
相关标签
  

闽ICP备14008679号