android12指定应用白名单默认授权

一给  金牌会员 | 2024-8-19 16:58:04 | 显示全部楼层 | 阅读模式
打印 上一主题 下一主题

主题 541|帖子 541|积分 1623

做AOSP定制实现时间,为了增长用户体验,系统预装的三方app会要求默认授权权限。也就是相当于在首次开机时间用代码默认将“设置”中申请的权限,用代码默认全部授权通过。这样用户可以直接进入app,不会在弹出确认授权提示框。
一、未授权前提示框

二、修改方式
1.路径frameworks/base/services/core/java/com/android/server/pm/permission/DefaultPermissionGrantPolicy.java尾部加入如下代码
  1. import android.os.Binder;
  2. import android.os.Environment;
  3. import java.io.BufferedReader;
  4. import java.util.HashSet;
  5. ......
  6.   //tyw add start
  7.     /**
  8.      * 给符合条件的app赋予权限
  9.      */
  10.     public void grantAllWhitePermissions(DelayingPackageManagerCache pm,int userId) {
  11.         Log.i(TAG, "启动给白名单符合条件的app赋予权限,userId--> "+userId);
  12.         final long ident = Binder.clearCallingIdentity();
  13.         try {
  14.             HashSet<String> packageNames = getGrantSystemAppFromFile(GRANT_SYS_APP_LIST_SYSTEM);
  15.             List<PackageInfo> packages = mContext.getPackageManager().getInstalledPackagesAsUser( DEFAULT_PACKAGE_INFO_QUERY_FLAGS, userId);
  16.             Log.i(TAG,packageNames.size()+"<-白名单条数,总安装包->"+packages.size());
  17.             for (PackageInfo pkg : packages) {
  18.                  String packageName =pkg.packageName;
  19.                 if (pkg == null||packageName==null) {
  20.                     continue;
  21.                 }
  22.                 if(packageNames.contains(packageName)){
  23.                     Log.i(TAG, "授权PackageInfo=" + pkg +"--packageName:"+packageName);
  24.                     //指定包名授权
  25.                     grantRuntimePermissionsForPackage(pm,userId, pkg);
  26.                 }
  27.             }
  28.         } catch (Exception e) {
  29.             e.printStackTrace();
  30.         } finally {
  31.             Binder.restoreCallingIdentity(ident);
  32.         }
  33.         Log.i(TAG, "app权限结束");
  34.     }
  35.     /**
  36.      *授予app的运行时权限
  37.      * @param userId
  38.      * @param pkg
  39.      */
  40.     private void grantRuntimePermissionsForPackage(DelayingPackageManagerCache pm,int userId, PackageInfo pkg) {
  41.         Set<String> permissions = new ArraySet<>();
  42.    
  43.         String [] pkgofPermissions = pkg.requestedPermissions;
  44.         if(pkgofPermissions== null || pkgofPermissions.length==0){
  45.             return;
  46.         }
  47.         for (String permission :  pkgofPermissions) {
  48.             final PermissionInfo permissioninfo = pm.getPermissionInfo(permission);
  49.             if (permissioninfo == null) {
  50.                 continue;
  51.             }
  52.             if (permissioninfo.isRuntime()) {
  53.                 Log.i(TAG, "授权:permission="+permission);
  54.                 permissions.add(permission);
  55.             }
  56.         }
  57.         if (!permissions.isEmpty()) {
  58.             grantRuntimePermissions(pm,pkg, permissions, true, userId);
  59.         }
  60.         
  61.     }
  62.     /**
  63.      * 记录白名单app包名
  64.      * PRODUCT_COPY_FILES += $(LOCAL_PATH)/sys_app_grant_permission_list.conf:system/etc/permissions/sys_app_grant_permission_list.conf
  65.      */
  66.     private static final File GRANT_SYS_APP_LIST_SYSTEM = Environment.buildPath(Environment.getRootDirectory(), "etc", "permissions","sys_app_grant_permission_list.conf");
  67.     /**
  68.      * Get removable system app list from config file
  69.      *
  70.      * @param file
  71.      *            The config file
  72.      */
  73.     private  HashSet<String>  getGrantSystemAppFromFile(File file) {
  74.         HashSet<String> resultSet = new HashSet<>();
  75.         FileReader fr = null;
  76.         BufferedReader br = null;
  77.         try {
  78.             if (file.exists()) {
  79.                 fr = new FileReader(file);
  80.             } else {
  81.                 Log.e(TAG, "app白名单不存在->" + file);
  82.                 return resultSet;
  83.             }
  84.             br = new BufferedReader(fr);
  85.             String line;
  86.             while ((line = br.readLine()) != null) {
  87.                 line = line.trim();
  88.                 if (!TextUtils.isEmpty(line)) {
  89.                     Log.d(TAG, "read line--》 " + line);
  90.                     resultSet.add(line);
  91.                 }
  92.             }
  93.             Log.i(TAG,"GRANT_SYS_APP_LIST_SYSTEM size="+resultSet.size());
  94.         } catch (Exception io) {
  95.             Log.d(TAG, io.getMessage());
  96.         } finally {
  97.             try {
  98.                 if (br != null) {
  99.                     br.close();
  100.                 }
  101.                 if (fr != null) {
  102.                     fr.close();
  103.                 }
  104.             } catch (IOException io) {
  105.                 Log.d(TAG, io.getMessage());
  106.             }
  107.         }
  108.         return resultSet;
  109.     }
  110.     // tyw add end
  111.    
复制代码
2.约380行grantDefaultPermissions(int userId)方法加入
  1.    // add start
  2.         //授权白名单应用
  3.         grantAllWhitePermissions(pm,userId);
  4.    // add end
  5.       
复制代码

3.新建sys_app_grant_permission_list.txt文件,写入白名单授权包名
  1. net.***
  2. com.***.***2
复制代码
4.在mk中构建加入sys_app_grant_permission_list.conf拷贝
  1. PRODUCT_COPY_FILES += $(LOCAL_PATH)/sys_app_grant_permission_list.conf:system/etc/permissions/sys_app_grant_permission_list.conf
复制代码
5.这是重新刷机,应用就可以面授权直接进入了。进入设置权限页面也可以看到。相应的权限已经默认授予了。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

一给

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表