当前位置: 首页 > 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;会按照成绩总分降序依次录取等等。那么对于排序它是如何定义…...

RocketMQ延迟消息机制

两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数&#xff0c;对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后&#xf…...

Appium+python自动化(十六)- ADB命令

简介 Android 调试桥(adb)是多种用途的工具&#xff0c;该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具&#xff0c;其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利&#xff0c;如安装和调试…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

DockerHub与私有镜像仓库在容器化中的应用与管理

哈喽&#xff0c;大家好&#xff0c;我是左手python&#xff01; Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库&#xff0c;用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

相机Camera日志分析之三十一:高通Camx HAL十种流程基础分析关键字汇总(后续持续更新中)

【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了:有对最普通的场景进行各个日志注释讲解,但相机场景太多,日志差异也巨大。后面将展示各种场景下的日志。 通过notepad++打开场景下的日志,通过下列分类关键字搜索,即可清晰的分析不同场景的相机运行流程差异…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

C#学习第29天:表达式树(Expression Trees)

目录 什么是表达式树&#xff1f; 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持&#xff1a; 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...