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

相关文章

Redis中的Lettuce使用详解

《Redis中的Lettuce使用详解》Lettuce是一个高级的、线程安全的Redis客户端,用于与Redis数据库交互,Lettuce是一个功能强大、使用方便的Redis客户端,适用于各种规模的J... 目录简介特点连接池连接池特点连接池管理连接池优势连接池配置参数监控常用监控工具通过JMX监控通过Pr

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

C++ RabbitMq消息队列组件详解

《C++RabbitMq消息队列组件详解》:本文主要介绍C++RabbitMq消息队列组件的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. RabbitMq介绍2. 安装RabbitMQ3. 安装 RabbitMQ 的 C++客户端库4. A

MySQL 存储引擎 MyISAM详解(最新推荐)

《MySQL存储引擎MyISAM详解(最新推荐)》使用MyISAM存储引擎的表占用空间很小,但是由于使用表级锁定,所以限制了读/写操作的性能,通常用于中小型的Web应用和数据仓库配置中的只读或主要... 目录mysql 5.5 之前默认的存储引擎️‍一、MyISAM 存储引擎的特性️‍二、MyISAM 的主

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

mybatis的mapper对应的xml写法及配置详解

《mybatis的mapper对应的xml写法及配置详解》这篇文章给大家介绍mybatis的mapper对应的xml写法及配置详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,... 目录前置mapper 对应 XML 基础配置mapper 对应 xml 复杂配置Mapper 中的相

MySQL 事务的概念及ACID属性和使用详解

《MySQL事务的概念及ACID属性和使用详解》MySQL通过多线程实现存储工作,因此在并发访问场景中,事务确保了数据操作的一致性和可靠性,下面通过本文给大家介绍MySQL事务的概念及ACID属性和... 目录一、什么是事务二、事务的属性及使用2.1 事务的 ACID 属性2.2 为什么存在事务2.3 事务

MySQL表空间结构详解表空间到段页操作

《MySQL表空间结构详解表空间到段页操作》在MySQL架构和存储引擎专题中介绍了使用不同存储引擎创建表时生成的表空间数据文件,在本章节主要介绍使用InnoDB存储引擎创建表时生成的表空间数据文件,对... 目录️‍一、什么是表空间结构1.1 表空间与表空间文件的关系是什么?️‍二、用户数据在表空间中是怎么

python3 pip终端出现错误解决的方法详解

《python3pip终端出现错误解决的方法详解》这篇文章主要为大家详细介绍了python3pip如果在终端出现错误该如何解决,文中的示例方法讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下... 目录前言一、查看是否已安装pip二、查看是否添加至环境变量1.查看环境变量是http://www.cppcns

Go 语言中的 Struct Tag 的用法详解

《Go语言中的StructTag的用法详解》在Go语言中,结构体字段标签(StructTag)是一种用于给字段添加元信息(metadata)的机制,常用于序列化(如JSON、XML)、ORM映... 目录一、结构体标签的基本语法二、json:"token"的具体含义三、常见的标签格式变体四、使用示例五、使用