Android 特权应用 privapp-permissions 权限解读

特权应用 官网说明

特权应用是位于系统映像某个分区上 priv-app 目录下的应用,如 system/priv-app/

特权应用

  • 相比安装在 system/app/ 目录的应用,具有更高的权限。
  • 基本都是系统预装,不可卸载。
  • 可以不是系统签名。

源码预制

源码下预制到 priv 分区,根据编译规则配置即可。

Android.mk

配置 LOCAL_PRIVILEGED_MODULE := true ,如

LOCAL_PATH := $(call my-dir)include $(CLEAR_VARS)LOCAL_MODULE := LuoDemoLOCAL_MULTILIB := 32LOCAL_MODULE_CLASS := APPSLOCAL_MODULE_SUFFIX := $(COMMON_ANDROID_PACKAGE_SUFFIX)LOCAL_CERTIFICATE := platformLOCAL_PRIVILEGED_MODULE := trueLOCAL_SRC_FILES := $(LOCAL_MODULE)$(COMMON_ANDROID_PACKAGE_SUFFIX)include $(BUILD_PREBUILT)include $(call all-makefiles-under,$(LOCAL_PATH))

Android.bp

配置 privileged: true

android_app {name: "LuoDemo",srcs: ["src/**/*.java"],certificate: "platform",privileged: true,platform_apis: true,static_libs: ["xz-java","androidx.leanback_leanback","androidx.appcompat_appcompat",],
}

privapp-permissions 权限配置

特权应用申请的特殊权限,需要在 xml 中声明权限。

如果不配置权限,机器预制特权应用,编译后开机可能会异常,常见的表现是:卡在开机Logo 或者 开机动画,无限重启
报错 log 中典型特征 Signature|privileged permissions not in privapp-permissions whitelist
完整log如下,

--------- beginning of crash
10-16 14:18:39.065  3151  3151 E AndroidRuntime: *** FATAL EXCEPTION IN SYSTEM PROCESS: main
10-16 14:18:39.065  3151  3151 E AndroidRuntime: java.lang.IllegalStateException: Signature|privileged permissions not in privapp-permissions whitelist: {com.demo.permission: android.permission.DELETE_PACKAGES, com.demo.permission: android.permission.READ_NETWORK_USAGE_HISTORY, com.demo.permission: android.permission.READ_LOGS, com.demo.permission: android.permission.PACKAGE_USAGE_STATS, com.demo.permission: android.permission.CLEAR_APP_CACHE, com.demo.permission: android.permission.REAL_GET_TASKS, com.demo.permission: android.permission.READ_PRIVILEGED_PHONE_STATE}
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.server.pm.permission.PermissionManagerService.systemReady(PermissionManagerService.java:3118)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.server.pm.permission.PermissionManagerService.access$100(PermissionManagerService.java:122)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.server.pm.permission.PermissionManagerService$PermissionManagerServiceInternalImpl.systemReady(PermissionManagerService.java:3179)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.server.pm.PackageManagerService.systemReady(PackageManagerService.java:21886)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.server.SystemServer.startOtherServices(SystemServer.java:1995)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.server.SystemServer.run(SystemServer.java:513)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.server.SystemServer.main(SystemServer.java:350)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at java.lang.reflect.Method.invoke(Native Method)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:492)
10-16 14:18:39.065  3151  3151 E AndroidRuntime:        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:916)

配置 privapp-permissions 权限的方法如下,任选其一即可。逐个说明。

原生 privapp-permissions-platform.xml

修改 frameworks/base/data/etc/privapp-permissions-platform.xml ,

根据 log 中的报错逐个添加权限,添加如下,

<permissions>+    <privapp-permissions package="com.demo.permission">
+        <permission name="android.permission.DELETE_PACKAGES"/>
+        <permission name="android.permission.READ_NETWORK_USAGE_HISTORY"/>
+        <permission name="android.permission.READ_LOGS"/>
+        <permission name="android.permission.PACKAGE_USAGE_STATS"/>
+        <permission name="android.permission.CLEAR_APP_CACHE"/>
+        <permission name="android.permission.REAL_GET_TASKS"/>
+        <permission name="android.permission.READ_PRIVILEGED_PHONE_STATE"/>
+    </privapp-permissions></permissions>

厂商的 privapp-permissions-xxx.xml

厂商基本都有自己定制 privapp-permissions-xxx.xml ,如

LOCAL_PATH:= $(call my-dir)include $(CLEAR_VARS)
LOCAL_MODULE := privapp-permissions-xxx.xml
LOCAL_MODULE_CLASS := ETC
LOCAL_MODULE_PATH := $(TARGET_OUT)/etc/permissions
LOCAL_MODULE_TAGS := optional
LOCAL_SRC_FILES := privapp-permissions-xxx.xml
include $(BUILD_PREBUILT)include $(call all-makefiles-under,$(LOCAL_PATH))

最终编译到 system/etc/permissions/

新增

自己新增一个 privapp-permissions-my.xml 文件,在 device.mk 中拷贝到 system/etc/permissions/ 下,

PRODUCT_COPY_FILES += \device/tv201/DAEWOO/etc/permissions/privapp-permissions-my.xml:system_ext/etc/permissions/privapp-permissions-my.xml \

此方法可能不完全适用,谨慎使用。

提前获取应用的特殊权限

前面是根据报错 log 来知道特权应用申请的权限,如果可以提前获取,就可以避免编译耗时。

如果应用可以直接安装,就可以用命令获取。

安装

先安装特权应用,pm install -r --user 0 apkFilePath 。 -r 、–user 0 参数按需使用。

获取

pm get-privapp-permissions TARGET-PACKAGE 命令获取

get-privapp-permissions TARGET-PACKAGE
Prints all privileged permissions for a package.

如,

console:/ # pm get-privapp-permissions com.demo.permission                 
{android.permission.REAL_GET_TASKS, android.permission.PACKAGE_USAGE_STATS, android.permission.READ_PRIVILEGED_PHONE_STATE, android.permission.READ_LOGS, android.permission.READ_NETWORK_USAGE_HISTORY, android.permission.CLEAR_APP_CACHE, android.permission.DELETE_PACKAGES}
console:/ #

这是串口获取的, adb 获取的话用 adb shell pm get-privapp-permissions TARGET-PACKAGE 。

源码分析

报错 log Signature|privileged permissions not in privapp-permissions whitelist 位于 frameworks/base/services/core/java/com/android/server/pm/permission/PermissionManagerService.java

    private void systemReady() {mSystemReady = true;if (mPrivappPermissionsViolations != null) {throw new IllegalStateException("Signature|privileged permissions not in "+ "privapp-permissions whitelist: " + mPrivappPermissionsViolations);}mPermissionControllerManager = mContext.getSystemService(PermissionControllerManager.class);mPermissionPolicyInternal = LocalServices.getService(PermissionPolicyInternal.class);}

待续

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/113876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

061:mapboxGL利用fitBounds同时将多个点放在可视范围内

第061个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载geojson数据,利用fitBounds同时将多个点放在可视范围内。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共134行)相关API参考:专栏目标示例…

vscode中快速生成vue3模板

步骤&#xff1a;设置 -> 用户代码片段 -> vue.json&#xff08;没有vue.json,选vue也可&#xff09;-> 定义自己所需的代码段 代码段 如下&#xff0c; {"Print to console": {"prefix": "vue3", //键入该值&#xff0c;按tab…

【linux】Linux 查看内存使用情况的几种方法汇总

文章目录 GUI 查看命令获取命令 free命令 vmstat命令 top命令 htop Linux 查看内存使用情况的几种方法包括使用 free 命令、top 命令、htop 命令、vmstat 命令和/proc/meminfo 文件。这些方法可以帮助用户了解系统内存的使用情况&#xff0c;包括总内存、已用内存、空闲内存、缓…

JavaCV + FFmpeg 播放音视频

JavaCV FFmpeg 播放音视频 1、导入JavaCV库1.1 使用ffmpeg必要库1.2 简单FFmpeg命令 待续~~~~ FFmpeg documentation bytedeco/javacv - GitHub 1、导入JavaCV库 gradle下面这种会导入javacv-platform所有包&#xff0c;非常耗时&#xff1a;https://repo.maven.apache.org/…

(零基础学习)Neo4j+Spring boot 自行定义属性

前置知识 1.Neo4j :属性 节点和关系都可以设置自己的属性。 属性是由Key-Value键值对组成&#xff0c;键名是字符串。属性值是要么是原始值&#xff0c;要么是原始值类型的一个数组。比如String&#xff0c;int和iint[]都是合法的。 注意 null不是一个合法的属性值。 Nulls能…

计算机网络——计算机网络体系结构(3/4)-计算机网络体系结构分层思想举例

目录 发送请求报文 应用层构建HTTP请求报文 运输层添加TCP首部 网络层添加IP首部 数据链路层形成帧 物理层转化为比特流 路由器处理 服务器处理 发回响应报文 计算机网络体系结构分层思想举例 假设网络拓扑如下所示&#xff0c;主机属于网络N1&#xff0c;Web服务器属…

C语言进阶第八课 --------通讯录的实现

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

C/C++面试常见问题——static关键字的主要用法

首先我们要明确一下C/C的内存区域划分 在C/C中内存主要被划分为四大块&#xff0c;堆&#xff0c;栈&#xff0c;全局/静态存储区&#xff0c;代码区 而全局/静态存储区又被细分为常量区(静态常量区&#xff0c;const关键字修饰)&#xff0c;全局区(全局变量区)和静态变量区(…

卫星结构。。。

• 下图介绍了现代卫星中常见的组件&#xff0c;它们被分为 卫星有效载荷 和 卫星总线 。 – 卫星有效载荷 包括任务专用设备&#xff0c;例如用于地球观测的高分辨率相机或用于电信的强大无线电硬件。 – 卫星总线 包括操作和维护卫星所需的所有组件。 • 它被设计为独立于有效…

Tomcat部署项目的两种方式

第一种: 将项目放到tomcat的webapps目录下,war包会自动解压 里面有个页面 为什么会默认访问asd.html 可以配置 tomcat--->conf---->web.xml 第二种方式 在Tomcat/conf/Catalina/localhost/目录下随便建个xxx.xml文件 注意字符编码 utf-8 注意aaa就是上下文地址 …

PMP的智慧(2) - 系统性思考及复杂性

PMP的智慧(2) - 系统性思考及复杂性 在2021年推出的第七版《管理专业知识体系指南》中&#xff0c;PMI在传统的过程和ITTO的基础上&#xff0c;重新增加了12大项目管理原则。 管家式管理 stewardship团队 team干系人 stakeholders价值 value系统思考 system thinking领导力 l…

基于人工蜂鸟优化的BP神经网络(分类应用) - 附代码

基于人工蜂鸟优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于人工蜂鸟优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.人工蜂鸟优化BP神经网络3.1 BP神经网络参数设置3.2 人工蜂鸟算法应用 4.测试结果…

进阶课2——语音分类

语音分类主要是对语音从不同的维度进行识别和分类&#xff0c;这些维度可以包括语种、性别、年龄段、情绪、说话人身份等&#xff0c;具体如下&#xff1a; 语种分类&#xff1a;根据发音人的母语或者惯用语言&#xff0c;将语音分为不同的语种&#xff0c;例如中文、英文、法…

中文编程工具开发语言编程案例:会员VIP管理系统软件实例

中文编程工具开发语言编程案例&#xff1a;会员VIP管理系统软件实例 中文编程工具开发语言编程案例&#xff1a;会员VIP管理系统软件实例。 软件功能&#xff1a; 1、系统设置&#xff1a;参数设定&#xff0c;账号及权限设置&#xff0c;系统初始化&#xff0c;卡类型设置&a…

学习SpringMVC,建立连接,请求,响应 SpringBoot初学,如何前后端交互(后端版)?最简单的能通过网址访问的后端服务器代码举例

要想通过SpringBoot写一个简单的处理请求的服务器&#xff08;方法&#xff09;&#xff0c;需要有以下步骤 建立连接请求响应 来复习的话直接在文章末尾看源码就行 1、创建SpringBoot项目 https://blog.csdn.net/dream_ready/article/details/133948253 2、编写Controller建…

【docker】容器无法使用vi等命令,无法联网,无法换源如何解决?

解决方案&#xff1a; 在宿主机某个位置上创建文件&#xff1a; sources.list 然后修改文件&#xff0c;写入清华源 # 默认注释了源码镜像以提高 apt update 速度&#xff0c;如有需要可自行取消注释 deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricte…

Kotlin中抽象类与接口

Kotlin 中的抽象类和接口是面向对象编程中的重要概念&#xff0c;它们提供了一种用于定义和组织代码的方式。在下面的代码示例中&#xff0c;我们将介绍 Kotlin 中的抽象类和接口&#xff0c;并给出相应的示例。 抽象类 抽象类是一种不能被实例化的类&#xff0c;它仅用作其他…

Android 画板小工具

工作之余&#xff0c;自己想着利用空闲时间做一些小工具出来&#xff0c;今天分享的是一个简单的画板工具&#xff0c;支持轨迹绘制、更换笔迹颜色等功能&#xff0c;并且可以把成品保存到系统相册。支持Android 13 先看一下效果&#xff0c;吐槽一下csdn的视频上传&#xff0…

音频抓取代码示例

以下是一个使用DefaultsKit库的简单爬虫程序&#xff0c;用于爬取音频。代码中使用了https://www.duoip.cn/get_proxy的API获取代理服务器。 import Foundation import DefaultsKit ​ let url "https://www.douban.com/music" // 目标网站URL let proxyUrl "…