当前位置: 首页 > news >正文

Android13、14特殊权限-应用安装权限适配

Android13、14特殊权限-应用安装权限适配

文章目录

  • Android13、14特殊权限-应用安装权限适配
    • 一、前言
    • 二、权限适配
    • 三、其他
      • 1、特殊权限-应用安装权限适配小结
      • 2、dumpsys package查看获取到了应用安装权限
      • 3、Android权限系统:应用操作管理类AppOpsManager(Android 10)
      • 4、Android13 授予特殊应用权限代码

一、前言

Android13、14 的源码发现一个问题系统签名应用声明了应用安装权限,
但是安装应用的时候还是没有安装应用权限,
需要在原生Settings中的特殊权限设置一次权限打开才有安装应用权限。

本文只介绍解决方法,里面framework的代码是实际项目的修改中拿来的,不是我自己研究的,不做过多分析。

二、权限适配

AndroidManifest.xml 声明权限:

 <!-- Android O(8) needs this permission to install apk --><uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

Android13:

@UnsupportedAppUsage
private static String[] sOpPerms = new String[] {android.Manifest.permission.ACCESS_COARSE_LOCATION,android.Manifest.permission.ACCESS_FINE_LOCATION,...AppOpsManager.MODE_ALLOWED, // READ_PHONE_NUMBERS
-        AppOpsManager.MODE_DEFAULT, // REQUEST_INSTALL_PACKAGES
+        AppOpsManager.MODE_ALLOWED, // REQUEST_INSTALL_PACKAGESAppOpsManager.MODE_ALLOWED, // PICTURE_IN_PICTUREAppOpsManager.MODE_DEFAULT, // INSTANT_APP_START_FOREGROUND...
}

可以看到安装应用权限默认不是 MODE_ALLOWED允许状态,设置成允许状态就行。

Android14:

static final AppOpInfo[] sAppOpInfos = new AppOpInfo[]{...new AppOpInfo.Builder(OP_READ_PHONE_NUMBERS, OPSTR_READ_PHONE_NUMBERS, "READ_PHONE_NUMBERS").setPermission(Manifest.permission.READ_PHONE_NUMBERS).setDefaultMode(AppOpsManager.MODE_ALLOWED).build(),new AppOpInfo.Builder(OP_REQUEST_INSTALL_PACKAGES, OPSTR_REQUEST_INSTALL_PACKAGES,"REQUEST_INSTALL_PACKAGES").setSwitchCode(OP_REQUEST_INSTALL_PACKAGES)-    .setPermission(Manifest.permission.REQUEST_INSTALL_PACKAGES).build(),+    .setPermission(Manifest.permission.REQUEST_INSTALL_PACKAGES)+    .setDefaultMode(AppOpsManager.MODE_ALLOWED).build(),...}

Android14 把app权限信息封装成AppOpInfo对象了。

从上面代码可以看到安装应用的权限未设置默认模式,添加默认许可即可。
这里的默认许可,也不是所有应用都需要,
而是拥有了安装应用这个特殊权限的应用才默认许可安装应用。

第二种方法

    private void initOpsPermission(Context context) {try {setPackageAppOpsPermission(context, "com.android.bluetooth", AppOpsManager.OPSTR_SYSTEM_ALERT_WINDOW);setPackageAppOpsPermission(context, "com.skg.filemanager", AppOpsManager.OPSTR_REQUEST_INSTALL_PACKAGES);} catch (Exception e) {e.printStackTrace();DebugLog.debug("error = " + e.getMessage());}}//设置特殊权限通过private void setPackageAppOpsPermission(Context context, String packageName, String opsString) {AppOpsManager mAppOps = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);PackageManager manager = context.getPackageManager();int uid = 1;try {ApplicationInfo packageInfo = manager.getApplicationInfo(packageName, 0);uid = packageInfo.uid;} catch (Exception e) {e.printStackTrace();return;}DebugLog.debug("uid = " + uid);mAppOps.setUidMode(opsString, uid, AppOpsManager.MODE_ALLOWED);}

值得注意的是系统签名应用uid=1000的应用,可以设置打开特殊权限,不能关闭特殊权限,
否则应用会崩溃报错,原生设置中关闭签名应用的特殊权限也是会异常崩溃的。
之前看代码,特殊权限好像是根据uid相关的,
如果关闭这个权限,其他使用这个权限的系统签名应用就会有异常。

三、其他

1、特殊权限-应用安装权限适配小结

有两种方式适配修改:

第一种是在framework中设置默认许可。
第二种是在系统代码中设置给与权限。

2、dumpsys package查看获取到了应用安装权限

console:/ #dumpsys package com.debug.filemanager | grep -i installinstallerPackageName=nullinstallerPackageUid=-1installPermissionsFixed=falseandroid.permission.REQUEST_INSTALL_PACKAGES //请求的权限User 0: ceDataInode=1876 installed=true hidden=false suspended=false distractionFlags=0 stopped=false notLaunched=false enabled=0 instant=false virtual=falseinstallReason=0firstInstallTime=2024-10-21 21:21:37uninstallReason=0install permissions:android.permission.INSTALL_LOCATION_PROVIDER: granted=trueandroid.permission.READ_INSTALLED_SESSION_PATHS: granted=trueandroid.permission.INSTALL_DYNAMIC_SYSTEM: granted=truecom.android.certinstaller.INSTALL_AS_USER: granted=trueandroid.permission.REQUEST_INSTALL_PACKAGES: granted=true  //显示获取到了安装应用的权限
console:/ # 

但是从代码或判断是否获取到安装应用权限是未获取到权限的。

boolean hasInstallPermission = context.getPackageManager().canRequestPackageInstalls();
LogUtil.debug("hasInstallPermission = " + hasInstallPermission);

打印返回是false的。
如果要知道为啥返回的false,就要研究获取权限的流程了。
有兴趣的可以自己看看。

3、Android权限系统:应用操作管理类AppOpsManager(Android 10)

AppOpsManager 是Google在Android4.3里面引进的应用程序操作(权限)的管理类,核心实现类为AppOpsService。

Google对AppOpsManager的说明在:
AppOpsManager
  app op(应用操作)的出现比运行时权限早,最初在没有出现运行时权限的时候,
  应用一旦被安装成功,是会被一次性授予所有需要的权限的,
  所以限制应用权限的唯一方案是使用AppOpsManager。
  但在现在,app op不但覆盖了所有的运行时权限(例如,拍照的app op是OP_CAMERA,
  也有对应的运行时权限Manifest.permission.CAMERA),还添加了一些没有对应运行时权限的操作(例如,读剪贴板的app op是OP_READ_CLIPBOARD,却没有对应的运行时权限)。
  此外,AppOpsManager提供了跟踪记录的功能,以方便开发者了解系统敏感操作的访问记录,
  使用noteOp(String, int, String)/startOp(String, int, String)可以让系统执行记录,
  而使用unsafeCheckOp(String, int, String),系统不会执行记录。
  noteOp/startOp/unsafeCheckOp在记录敏感操作信息的同时,
  还有一个返回值,开发者可以根据这个返回值决定下一步操作。
  
  返回值有:

  1.MODE_ALLOWED:访问者可以访问该敏感操作;2.MODE_IGNORED:访问者不可以访问该敏感操作,但是不会引发crash;3.MODE_ERRORED:访问者不可以访问该敏感操作,会引发crash;4.MODE_DEFAULT:访问者来决定访问该敏感操作的准入规则。

详细介绍:

https://blog.csdn.net/Invoker123/article/details/109176511

4、Android13 授予特殊应用权限代码

Android 权限类别有啥,网上很多是说有普通权限和危险权限,其实是不准确的。

Android 权限分为普通权限,动态权限,特殊权限,私有权限。

https://blog.csdn.net/wenzhi20102321/article/details/143082504

相关文章:

Android13、14特殊权限-应用安装权限适配

Android13、14特殊权限-应用安装权限适配 文章目录 Android13、14特殊权限-应用安装权限适配一、前言二、权限适配三、其他1、特殊权限-应用安装权限适配小结2、dumpsys package查看获取到了应用安装权限3、Android权限系统&#xff1a;应用操作管理类AppOpsManager&#xff08…...

DMVPN协议

DMVPN&#xff08;Dynamic Multipoint VPN&#xff09;动态多点VPN 对于分公司和分总公司内网实现通信环境下&#xff0c;分公司是很多的。我们不可能每个分公司和总公司都挨个建立ipsec隧道 &#xff0c;而且如果是分公司和分公司建立隧道&#xff0c;就会很麻烦。此时我们需…...

leetcode动态规划(十八)-零钱兑换II

题目 322.零钱兑换II 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬…...

2024 CSP-J 题解

2024 CSP-J题解 扑克牌 ​ 题目给出了一整套牌的定义&#xff0c;但是纯粹在扯淡&#xff0c;完全没有必要去判断给出的牌的花色和点数&#xff0c;我们用一个循环来依次读入每一张牌&#xff0c;如果这个牌在之前出现过&#xff0c;我们就让答案减一。这里建议用map、unorde…...

GPU 服务器厂家:中国加速计算服务器市场的前瞻洞察

科技的飞速发展&#xff0c;让 GPU 服务器在加速计算服务器领域的地位愈发凸显。中国加速计算服务器市场正展现出蓬勃的生机&#xff0c;而 GPU 服务器厂家则是这场科技盛宴中的关键角色。 从市场预测的趋势来看&#xff0c;2023 年起&#xff0c;中国加速计算服务器市场便已展…...

Hadoop集群修改yarn队列

1.修改默认的default队列参数 注意&#xff1a; yarn.scheduler.capacity.root.队列名.capacity总和不能超过100 <property><name>yarn.scheduler.capacity.root.queues</name><value>default,hive,spark,flink</value><description>The…...

【GPIO】2.ADC配置错误,还是能得到电压数据

配置ADC功能时&#xff0c;GPIO引脚弄错了&#xff0c;P1写成P2&#xff0c;但还是配置成功&#xff0c;能得到电压数据。 首先一步步排查&#xff1a; 既然引脚弄错了&#xff0c;那引脚改为正确的引脚&#xff0c;能得到数据通过第一步判断&#xff0c;GPIO配置似乎是不起作…...

css-元素居中方式

<section class"wrapper"><div class"content">Content goes here</div> </section>1. 使用 Flexbox Flexbox 是一种现代的布局方法&#xff0c;可以轻松实现居中。 .wrapper {display: flex; /* 使用 Flexbox …...

redis内存打满了怎么办?

1、设置maxmemory的大小 我们需要给 Redis设置maxmemory的大小&#xff0c;如果不设置的话&#xff0c;它会受限于系统的物理内存和系统对内存的管理机制。 2、设置内存的淘汰策略 内存的淘汰策略分为 8 种&#xff0c;从淘汰范围来说分为从所有的key中淘汰和从设置过期时间…...

决策算法的技术分析

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录 系列文章目录前言(1)第一层级:分层状态机、分层决策树的想法(三个臭皮匠胜过一个诸葛亮)基于场景的固定规则化的分层决策核心思想(2)第二层级:数据管理的方…...

【Python爬虫】获取汽车之家车型配置附代码(2024.10)

参考大哥&#xff0c;感谢大哥&#xff1a;https://blog.csdn.net/weixin_43498642/article/details/136896338 【任务目标】 工作需要想更方便地下载汽车之家某车系配置清单&#xff1b;&#xff08;垃圾汽车之家不给下载导出表格&#xff0c;配置页叉掉了车系要出来还要重新…...

JVM 加载 class 文件的原理机制

JVM 加载 class 文件的原理机制 JVM&#xff08;Java虚拟机&#xff09;是一个可以执行Java字节码的虚拟机。它负责执行Java应用程序和应用程序的扩展&#xff0c;如Java库和框架。 文章目录 JVM 加载 class 文件的原理机制1. JVM1.1 类加载器1.2 魔数1.3 元空间 2. 类加载2.1 …...

NumPy学习第九课:字符串相关函数

前言 各位有没有注意到&#xff0c;NumPy从第八课开始其实基本上都是讲的是NumPy的函数&#xff0c;而且其实就是各种函数的调用&#xff0c;因为NumPy是一个很强大的函数库&#xff0c;这对我们以后再处理项目中遇到的问题时会有很大的帮助。我们将常用的函数进行一个列举&am…...

卷积神经网络(CNNs)在处理光谱特征的序列属性时表现不佳

卷积神经网络&#xff08;CNNs&#xff09;在处理光谱签名的序列属性时表现不佳&#xff0c;主要是由于其固有网络架构的局限性。具体原因如下&#xff1a; 局部感受野&#xff08;Local Receptive Field&#xff09;&#xff1a; CNN 的核心操作是卷积&#xff0c;它利用局部感…...

【IC】MCU的Tick和晶振频率

Tick 是指 MCU 内部时钟的一个周期&#xff0c;通常表示为一个固定的时间间隔。每个 tick 代表一个时间单位&#xff0c;通常以毫秒&#xff08;ms&#xff09;或微秒&#xff08;μs&#xff09;为单位。Tick 通常由 MCU 的定时器或计时器生成&#xff0c;作为系统时钟的一部分…...

从0到1学习node.js(npm)

文章目录 一、NPM的生产环境与开发环境二、全局安装三、npm安装指定版本的包四、删除包 五、用npm发布一个包六、修改和删除npm包1、修改2、删除 一、NPM的生产环境与开发环境 类型命令补充生产依赖npm i -S uniq-S 等效于 --save -S是默认选项npm i -save uniq包的信息保存在…...

【STM32 Blue Pill编程实例】-OLED显示DS18B20传感器数据

OLED显示DS18B20传感器数据 文章目录 OLED显示DS18B20传感器数据1、DS18B20介绍2、硬件准备及接线3、模块配置3.1 定时器配置3.2 DS18B20传感器配置3.3 OLED的I2C接口配置4、代码实现在本文中,我们将介绍如何将 DS18B20 温度传感器与 STM32 Blue Pill 开发板连接,并使用 HAL …...

STM32 从0开始系统学习3 启动流程

目录 写在前面 速通&#xff1a;做了什么&#xff1a; 分析I&#xff1a;分析2011年的startup文件所作 分析II&#xff1a;分析2017年的startup文件所作 Helps 2011 2017 Reference 写在前面 请各位看官看本篇笔记的时候首先了解一下计算机体系架构&#xff0c;了解基本…...

交换机:端口安全与访问控制指南

为了实现端口安全和访问控制&#xff0c;交换机通常通过以下几种机制和配置来保护网络&#xff0c;防止未经授权的访问和恶意攻击。 01-端口安全 定义及功能 端口安全功能允许管理员限制每个交换机端口可以学习的MAC地址数量。 通过绑定特定的MAC地址到交换机的某一端口上&a…...

【C++ | 数据结构】八大常用排序算法详解

1. 排序的稳定性 排序是我们生活中经常会面对的问题&#xff0c;小朋友站队的时候会按照从矮到高的顺序排列&#xff1b;老师查看上课出勤情况时&#xff0c;会按照学生的学号点名&#xff1b;高考录取时&#xff0c;会按照成绩总分降序依次录取等等。那么对于排序它是如何定义…...

Swin2SR惊艳效果展示:低清草稿图秒变4K高清作品集

Swin2SR惊艳效果展示&#xff1a;低清草稿图秒变4K高清作品集 你有没有遇到过这种情况&#xff1f;一张特别有感觉的AI生成图&#xff0c;可惜分辨率太低&#xff0c;放大后全是马赛克&#xff1b;一张珍贵的旧照片&#xff0c;像素模糊得看不清人脸&#xff1b;或者从网上找到…...

LeetCodehot100-2 两数相加

class Solution { public:ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {if (l1 nullptr) return l2;if (l2 nullptr) return l1;ListNode* head l1; // 保存头节点ListNode* prev nullptr; // 记录上一个节点&#xff0c;用于连接int carry 0;// 同时遍历…...

WWW-万维网

万维网的概念与组成结构万维网&#xff08;World Wide Web&#xff0c;WWW&#xff09;是一个分布式的信息存储空间&#xff0c;在这个空间中&#xff1a;一个事物被称为一样 “资源”&#xff0c;并由一个全域 “统一资源定位符”&#xff08;URL&#xff09;标识。这些资源通…...

MicroOS:Arduino轻量级任务调度内核详解

1. MicroOS&#xff1a;面向Arduino的轻量级任务管理内核概述MicroOS是一个专为Arduino平台设计的极简型实时任务管理器&#xff0c;其核心定位并非替代FreeRTOS或Zephyr等完整RTOS&#xff0c;而是填补Arduino原生loop()单线程模型在多任务调度、精确定时与事件解耦方面的空白…...

财务银行对账费时间?RPA自动对接流水,10分钟对完1个月账

RPA自动化银行对账的优势传统手工对账通常需要财务人员逐笔核对银行流水和企业账目&#xff0c;耗时费力且易出错。RPA&#xff08;机器人流程自动化&#xff09;技术可实现银行流水与企业账务系统的自动对接&#xff0c;大幅提升效率。10分钟完成1个月账目核对已成为现实。RPA…...

大数据运维 | 项目一:大数据分布式集群搭建全攻略

版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC 4.0 BY-SA 版权协议&#xff0c;转载请附上原文出处链接和本声明。 前言 作为一名大数据运维工程师&#xff0c;你是否遇到过这样的问题&#xff1a; 问题场景描述1机器A可正常上网&#xff0c;但机器B无法连接网…...

煤矿电液阀系统摄像仪护套连接器 DLJ01(1000)参数

在煤矿综采工作面液压支架电液控制系统中&#xff0c;摄像仪护套连接器 DLJ01(1000)作为矿用本安型摄像仪与电源、信号传输线缆之间的专用接口&#xff0c;承担着视频信号与供电的稳定传输任务。其型号中的“1000”代表线缆长度为1000mm&#xff08;1米&#xff09;&#xff0c…...

ClawdBot实战教程:零基础搭建个人AI助手的完整流程

ClawdBot实战教程&#xff1a;零基础搭建个人AI助手的完整流程 1. ClawdBot简介&#xff1a;你的本地AI助手 ClawdBot是一个可以在个人设备上运行的AI助手解决方案&#xff0c;基于vLLM提供后端模型能力。与常见的云端AI服务不同&#xff0c;它完全运行在本地环境中&#xff…...

【24年最新算法】首发CPO-XGBoost回归+交叉验证 基于冠豪猪优化算法-XGBoost多变量回归预测

✅作者简介&#xff1a;热爱科研的Matlab仿真开发者&#xff0c;擅长毕业设计辅导、数学建模、数据处理、建模仿真、程序设计、完整代码获取、论文复现及科研仿真。&#x1f34e; 往期回顾关注个人主页&#xff1a;Matlab科研工作室&#x1f447; 关注我领取海量matlab电子书和…...

企业级流程建模前端架构:基于Vite+Vue3的低代码解决方案

企业级流程建模前端架构&#xff1a;基于ViteVue3的低代码解决方案 【免费下载链接】vite-vue-bpmn-process 基于 Vite TypeScript Vue3 NaiveUI Bpmn.js 的流程编辑器&#xff08;前端部分&#xff09;。支持高度自定义&#x1f680;&#x1f680;&#x1f680;。Vue 2 版本…...