Android 7.0 运行时权限弹窗问题的解决

作者:lancelots 时间:2023-06-30 18:26:13 

Android 7.0系统在运行应用的时候,对权限做了诸多限制,normal, dangerous, signature, signatureOrSystem ,取决于保护级别,在确定是否授予权限时,系统可能采取不同的操作。

  • normal 表示权限是低风险的,不会对系统、用户或其他应用程序造成危害;

  • dangerous 表示权限是高风险的,系统将可能要求用户输入相关信息,才会授予此权限;

  • signature 表示只有当应用程序所用数字签名与声明引权限的应用程序所用数字签名相同时,才能将权限授给它;

  • signatureOrSystem 表示将权限授给具有相同数字签名的应用程序或android 包类。这一保护级别适和于非常特殊的情况,比如多个供应商需要通过系统映像共享功能时

运行时权限弹窗问题是很多系统定制的客户要求屏蔽的,一直以来没有特别好的方法,下面我分享一下我自己验证可行的方案

方案1,修改frameworks/base/services/core/java/com/android/server/pm/PackageManagerService和frameworks/base/services/core/java/com/android/server/pm/DefaultPermissionGrantPolicy文件,PackageManagerService文件修改代码如下:


@Override
 public void systemReady() {
...
synchronized (mPackages) {
     ...
     for (int userId : UserManagerService.getInstance().getUserIds()) {
       //if (!mSettings.areDefaultRuntimePermissionsGrantedLPr(userId)) {//注释掉这个判断
         grantPermissionsUserIds = ArrayUtils.appendInt(
             grantPermissionsUserIds, userId);
       //}
     }
   }

DefaultPermissionGrantPolicy文件修改代码如下:


private void grantPermissionsToSysComponentsAndPrivApps(int userId) {
   Log.i(TAG, "Granting permissions to platform components for user " + userId);

synchronized (mService.mPackages) {
     for (PackageParser.Package pkg : mService.mPackages.values()) {
  // if (!isSysComponentOrPersistentPlatformSignedPrivAppLPr(pkg) //删掉isSysComponentOrPersistentPlatformSignedPrivAppLPr判断
if(!doesPackageSupportRuntimePermissions(pkg)
           || pkg.requestedPermissions.isEmpty()) {
         continue;
       }
       Set<String> permissions = new ArraySet<>();
       final int permissionCount = pkg.requestedPermissions.size();
       for (int i = 0; i < permissionCount; i++) {
         String permission = pkg.requestedPermissions.get(i);
         BasePermission bp = mService.mSettings.mPermissions.get(permission);
         if (bp != null && bp.isRuntime()) {
           permissions.add(permission);
         }
       }
       if (!permissions.isEmpty()) {
         grantRuntimePermissionsLPw(pkg, permissions, true, userId);
       }
     }
   }
 }

简单说明下这个方案的修改原理,在PMS的systemReady方法中会遍历所有拥有默认运行时权限应用,通过遍历它们的UserId来赋予权限,注释掉判断是否为拥有运行时权限的应用方法后,会遍历所有应用,遍历应用且赋予权限的操作是在DefaultPermissionGrantPolicy中grantPermissionsToSysComponentsAndPrivApps方法,注释掉判断签名应用和系统应用的方法,普通应用也可以获取所有运行时权限,这样所有应用都不会有运行时权限的弹窗了。

方案2,只修改frameworks/base/services/core/java/com/android/server/pm/PackageManagerService文件,修改grantPermissionsLPw方法,代码如下:


private void grantPermissionsLPw(PackageParser.Package pkg, boolean replace,
     String packageOfInterest) {
  ...
  /*add for grant thirdparty app permssion S*/
  final String thirdPkgName = SystemProperties.get("persist.thirdparty.packagenames","");

if(isSystemApp(pkg) || pkg.packageName.contains(thirdPkgName)){//xxx为包名
   final int permCount = pkg.requestedPermissions.size();
   for(int i = 0;i < permCount;i++){
     final String name = pkg.requestedPermissions.get(i);
     final BasePermission bp = mSettings.mPermissions.get(name);
     if(bp != null && permissionsState.grantInstallPermission(bp) != PermissionsState.PERMISSION_OPERATION_FAILURE){
       changeInstallPermission = true;
     }
  }
  /*add for grant thirdparty app permission E*/
  permissionsState.setGlobalGids(mGlobalGids);
  ...
}

简单解释下第二中方案的思路,PMS在应用安装的时候会根据应用是否为签名应用、系统应用或三方应用来更新权限,这里可以做成白名单的形式,目前通过SystemProperties来获取三方包名可以通过adb或者串口来测试三方应用权限是否可以正常获取。两种方案大家可以自由选择。

来源:https://blog.csdn.net/lancelots/article/details/104790172

标签:Android,权限弹窗
0
投稿

猜你喜欢

  • Java多线程实现Runnable方式

    2022-06-29 17:09:46
  • 深入c# Func委托的详解

    2022-02-15 05:44:51
  • Android 调用系统相机拍摄获取照片的两种方法实现实例

    2022-01-19 21:22:23
  • Spring一步到位精通拦截器

    2022-01-03 18:31:50
  • 举例分析Python中设计模式之外观模式的运用

    2021-11-24 01:54:48
  • Android中获取网页表单中的数据实现思路及代码

    2021-07-04 19:51:18
  • SpringCloud高可用配置中心Config详解

    2023-11-17 11:25:00
  • IDEA2020.1个性化设置的实现

    2023-10-17 09:31:34
  • C#文件上传的简单实现

    2021-06-02 19:06:04
  • Spring整合Springmvc的相关介绍

    2022-03-30 10:47:08
  • 实例详解C#正则表达式

    2023-06-23 00:03:03
  • java生成json实现隐藏掉关键属性

    2021-12-07 17:31:29
  • mybatis使用foreach查询不出结果也不报错的问题

    2023-11-24 22:36:17
  • Android Fragment源码分析Add方法

    2023-02-12 19:13:58
  • Java导出Execl疑难点处理的实现

    2021-09-18 12:55:11
  • Android使用自定义View绘制渐隐渐现动画

    2022-10-17 08:25:51
  • 深入理解C#窗体关闭事件

    2023-06-01 14:38:56
  • SpringMVC执行步骤、Model的使用详解

    2022-02-13 05:38:45
  • Android实现记住用户名和密码功能

    2023-10-06 13:02:07
  • maven为MANIFEST.MF文件添加内容的方法

    2022-10-29 11:15:56
  • asp之家 软件编程 m.aspxhome.com