Android系统目录priv-app 和app 详解

2024-01-19 21:28

本文主要是介绍Android系统目录priv-app 和app 详解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Android系统目录priv-app 和app 详解

文章目录

  • Android系统目录priv-app 和app 详解
    • 一、前言
    • 二、区别
      • 1、关于目录
      • 2、关于进程
      • 3、关于 System App
        • 有两类 App 属于 System App :
      • 4、关于 Privileged App
        • 两类 Privileged App
          • (1)特定 uid 的 App
          • (2)特定目录中的 App
      • 5、特殊权限 Privileged
    • 三、其他
      • 1、apk文件放在不同目录的测试效果
      • 2、在Android系统中,`priv-app`和`app`目录小结
      • 4、Android中不同应用权限级别从低到高总结场景

一、前言

Android4.4增加了/system/priv-app/目录,那么它与/system/app/目录有什么差别?

本文主要从定义,作用,具体效果等方面进行分析。

有一些是网上没有介绍到的内容。
如果只是知道 priv-app 目录比 app目录权限大一点,但是不了解具体区别的可以看看。

二、区别

1、关于目录

4.4 之前没有/system/priv-app 目录,所有 /system/app 下的软件都能使用系统级的权限。

/system/priv-app和/system/app目录下的文件都是不可手动删除的。

手机被 root 后,通过 adb push 可以把 apk 推送到这两个目录,作为系统应用,用户无法删除。

/system/priv-app 中包含 Launcher,SystemUI, SettingsProvider 以及系统一些重要服务等系统的核心应用,这些应用能使用系统级的权限。

/system/app 中包含 一些基础应用和一些三方应用,比如日历,闹钟,天气,魔镜,音乐,这些有的是系统签名应用,有的不是系统签名应用,都是用户无法手动卸载的。

放到 /system/priv-app 下的应用比放到 /system/app 下的应用可以声明获得更多的权限,比如要使用系统限制的权限(比如: android.permission.WRITE_SECURE_SETTINGS),我们就需要把程序安装到 /system/priv-app 下。

2、关于进程

从应用的运行角度来说,/system/priv-app 中的 service 是不能被 kill 掉的,就算通过 adb kill 掉后系统也会重新拉起。例如:

ActivityManager: Scheduling restart of crashed service com.xxx.xxx/.xxx.xxxin 1000ms 
ActivityManager: Start proc 5668:com.xxx.xxx/u0a68 for restart com.xxx.xxx

好处是进程可以保持始终运行,并且能拿到最多的权限;坏处是无法正常升级,因为一被 kill 马上又被拉起来,并且升级完成后,再起来的还是旧版本的 service。

所以,我们的应用被预装到终端手机 ROM 中时,为了保活,并且尽量减少终端厂商的工作量,如果能解决升级的问题,对于终端厂商来说就只需要把应用 push 到 /system/priv-app 下就可以了。没有找到解决升级的办法,最终采用的方案往往是 push 到 /system/app,系统通过一个 service(如 phone)来 bind 我们的 service,一旦 disconnect 之后再来 bind,实现保活。

3、关于 System App

在 PackageManagerService 中对是否是 System App 的判断:

private static boolean isSystemApp(PackageParser.Package pkg) { return (pkg.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) != 0; 
}private static boolean isSystemApp(PackageSetting ps) { return (ps.pkgFlags & ApplicationInfo.FLAG_SYSTEM) != 0;
}

具有 ApplicationInfo.FLAG_SYSTEM 标记的,被视为 System App。

有两类 App 属于 System App :

(1)特定 shared uid 的 App

例如: shared uid 为 android.uid.system,android.uid.phone,android.uid.log,android.uid.nfc,android.uid.bluetooth,android.uid.shell。这类 App 都被赋予了 ApplicationInfo.FLAG_SYSTEM 标志。

(2)特定目录中的 App

特定目录包括:/vendor/overlay,/system/framework,/system/priv-app,/system/app,/vendor/app,/oem/app。这些目录中的 App,被视为 System App。

4、关于 Privileged App

Privileged App,即「特权应用」,主要原因是此类特权 App 可以使用 protectionLevel 为 signatureOrSystem 或者 protectionLevel 为 signature|privileged 的权限。

从 PackageManagerService 的 isPrivilegedApp() 可以看出特权 App 是具有 ApplicationInfo.PRIVATE_FLAG_PRIVILEGED 标志的一类 App。

private static boolean isPrivilegedApp(PackageParser.Package pkg) {return (pkg.applicationInfo.privateFlags & ApplicationInfo.PRIVATE_FLAG_PRIVILEGED) != 0;
}

特权 App 首先必须是 System App,也就是说 System App 分为普通的 System App 和特权的 System App(System App = 普通 System App + 特权 App)。

一般来说普通的 System App 就是 /system/app 目录中的 App,

特权的 System App 就是 /system/priv-app 目录中的 App(priv-app 是 privileged app 的简写)。

两类 Privileged App

特权 App 首先是 System App,然后要具有 ApplicationInfo.PRIVATE_FLAG_PRIVILEGED 标志。

有两类 App 属于 Privileged App(特权 App):

(1)特定 uid 的 App
shared uid 为 android.uid.system,android.uid.phone,android.uid.log,android.uid.nfc,android.uid.bluetooth,android.uid.shell 的 App 被赋予了 privileged 的权限。这些 App 同时也是 System App。
(2)特定目录中的 App
/system/framework 和 /system/priv-app 目录下的 App 被赋予了 privileged 的权限。
其中 /system/framework 目录中的 apk,只是包含资源,不包含代码(dex)。

5、特殊权限 Privileged

系统一些应用会使用到特殊权限,这时候要在系统配置一下否则系统会一直重启。

之前分析的缺少特殊权限系统一直重启的文章:

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

系统特殊权限有哪些?具体的可以看 framework\base\core\res\AndroidManifest.xml 的定义

部分私有权限如下:

<permission android:name="android.permission.READ_WIFI_CREDENTIAL"android:protectionLevel="signature|privileged" /><permission android:name="android.permission.TETHER_PRIVILEGED"android:protectionLevel="signature|privileged" /><permission android:name="android.permission.RECEIVE_WIFI_CREDENTIAL_CHANGE"android:protectionLevel="signature|privileged" /><permission android:name="android.permission.OVERRIDE_WIFI_CONFIG"android:protectionLevel="signature|privileged|knownSigner"android:knownCerts="@array/wifi_known_signers" />。。。

从上面的特殊权限定义可以看到,protectionLevel 是包含等级是 privileged,

一般还需要 signature ,就是系统签名应用,所以有特殊权限的应用基本都是系统签名应用,

值得注意的是使用 privileged特殊权限的应用需要放在 /system/priv-app/ 目录才能正常运行。

三、其他

1、apk文件放在不同目录的测试效果

apk对Setting数据库进行读写,该操作需要signatureOrSystem权限

Settings.Global.putInt(getContentResolver(), Settings.Global.WIFI_ON, 1); //获取wifi开关状态

测试情况:

(1)普通签名,将apk放在/system/priv-app/下面
测试结果:apk能够正常写入参数(2)普通签名,将apk放在/system/app/下面
测试结果:apk直接闪退,提示没有权限(3)对apk进行系统签名,放入到/system/app/下面
测试结果:apk可以正常写入参数(3)对apk进行系统签名,使用Studio直接安装或者手动安装进去,目录是在/data/app/包名XXX/下面
测试结果:apk可以正常写入参数

结论:

/system/priv-app/下的apk不用系统签名,就能够获取signatureOrSystem权限。
/system/app/下的apk,要获取signatureOrSystem权限,必须用系统签名才行
安装在其他目录的apk使用系统签名也能获取到signatureOrSystem系统权限。

2、在Android系统中,priv-appapp目录小结

在Android系统中的system的priv-appapp目录是用于存放应用程序的两个不同的目录,具有一些区别:

1、 `priv-app`目录:`priv-app`是"privileged application"的缩写,意为特权应用程序。
`priv-app`目录用于存放一些系统级别的应用程序,这些应用程序通常具有更高的权限和特权,可以访问和执行一些敏感的系统操作。
这些应用程序通常是由设备制造商或系统开发者预装在系统分区中的。
因为这些应用程序具有更高的权限,所以它们可以访问一些普通应用程序无法访问的系统资源和功能。2、 `app`目录:`app`目录用于存放普通的第三方应用程序,这些应用程序是由用户或开发者安装在设备上的。
这些应用程序通常没有特权访问系统资源的权限,只能在用户授权的范围内运行,并且受到操作系统的安全限制。

总的来说,priv-app目录用于存放系统级别的特权应用程序,而app目录用于存放普通的第三方应用程序。这种区分有助于确保系统级别的应用程序和普通应用程序之间的安全性和权限控制。

3、Android 源码中编译apk的脚步控制目录的代码

Android.bp://是否系统签名certificate: "platform",platform_apis: true,//是否生成到priv-app目录privileged: true,Android.mk# 设置系统权限和目录LOCAL_CERTIFICATE := platformLOCAL_PRIVATE_PLATFORM_APIS := true# 设置是否编译在 priv-app,如果没有指定目录默认为 system/priv-appLOCAL_PRIVILEGED_MODULE := true 

4、Android中不同应用权限级别从低到高总结场景

(1)普通应用。只用到了普通权限,比如上网权限等等。
(2)system/app 系统应用,用来可以限制无法手动卸载,对系统权限没有要求的情况,无法调用系统api
(3)system/app 系统应用(未设置uid),无法手动卸载,可以调用部分系统api
(4)系统签名应用普通安装的方式,可以调用系统相关api,同时也可以被手动卸载
(5)system/priv-app 系统应用(设置uid),无法手动卸载,可以调用全部系统api,可以添加privileged特殊权限

了解到不同的权限需求,应用要安装/编译在什么目录心里就有个底了。

这篇关于Android系统目录priv-app 和app 详解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/623743

相关文章

MySQL 8 中的一个强大功能 JSON_TABLE示例详解

《MySQL8中的一个强大功能JSON_TABLE示例详解》JSON_TABLE是MySQL8中引入的一个强大功能,它允许用户将JSON数据转换为关系表格式,从而可以更方便地在SQL查询中处理J... 目录基本语法示例示例查询解释应用场景不适用场景1. ‌jsON 数据结构过于复杂或动态变化‌2. ‌性能要

Python实现终端清屏的几种方式详解

《Python实现终端清屏的几种方式详解》在使用Python进行终端交互式编程时,我们经常需要清空当前终端屏幕的内容,本文为大家整理了几种常见的实现方法,有需要的小伙伴可以参考下... 目录方法一:使用 `os` 模块调用系统命令方法二:使用 `subprocess` 模块执行命令方法三:打印多个换行符模拟

MySQL字符串常用函数详解

《MySQL字符串常用函数详解》本文给大家介绍MySQL字符串常用函数,本文结合实例代码给大家介绍的非常详细,对大家学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql字符串常用函数一、获取二、大小写转换三、拼接四、截取五、比较、反转、替换六、去空白、填充MySQL字符串常用函数一、

Java中Arrays类和Collections类常用方法示例详解

《Java中Arrays类和Collections类常用方法示例详解》本文总结了Java中Arrays和Collections类的常用方法,涵盖数组填充、排序、搜索、复制、列表转换等操作,帮助开发者高... 目录Arrays.fill()相关用法Arrays.toString()Arrays.sort()A

Python 字典 (Dictionary)使用详解

《Python字典(Dictionary)使用详解》字典是python中最重要,最常用的数据结构之一,它提供了高效的键值对存储和查找能力,:本文主要介绍Python字典(Dictionary)... 目录字典1.基本特性2.创建字典3.访问元素4.修改字典5.删除元素6.字典遍历7.字典的高级特性默认字典

MySQL 主从复制部署及验证(示例详解)

《MySQL主从复制部署及验证(示例详解)》本文介绍MySQL主从复制部署步骤及学校管理数据库创建脚本,包含表结构设计、示例数据插入和查询语句,用于验证主从同步功能,感兴趣的朋友一起看看吧... 目录mysql 主从复制部署指南部署步骤1.环境准备2. 主服务器配置3. 创建复制用户4. 获取主服务器状态5

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

Redis中Stream详解及应用小结

《Redis中Stream详解及应用小结》RedisStreams是Redis5.0引入的新功能,提供了一种类似于传统消息队列的机制,但具有更高的灵活性和可扩展性,本文给大家介绍Redis中Strea... 目录1. Redis Stream 概述2. Redis Stream 的基本操作2.1. XADD