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

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Debezium 与 Apache Kafka 的集成方式步骤详解

《Debezium与ApacheKafka的集成方式步骤详解》本文详细介绍了如何将Debezium与ApacheKafka集成,包括集成概述、步骤、注意事项等,通过KafkaConnect,D... 目录一、集成概述二、集成步骤1. 准备 Kafka 环境2. 配置 Kafka Connect3. 安装 D

Java中ArrayList和LinkedList有什么区别举例详解

《Java中ArrayList和LinkedList有什么区别举例详解》:本文主要介绍Java中ArrayList和LinkedList区别的相关资料,包括数据结构特性、核心操作性能、内存与GC影... 目录一、底层数据结构二、核心操作性能对比三、内存与 GC 影响四、扩容机制五、线程安全与并发方案六、工程

Android 悬浮窗开发示例((动态权限请求 | 前台服务和通知 | 悬浮窗创建 )

《Android悬浮窗开发示例((动态权限请求|前台服务和通知|悬浮窗创建)》本文介绍了Android悬浮窗的实现效果,包括动态权限请求、前台服务和通知的使用,悬浮窗权限需要动态申请并引导... 目录一、悬浮窗 动态权限请求1、动态请求权限2、悬浮窗权限说明3、检查动态权限4、申请动态权限5、权限设置完毕后

Spring Cloud LoadBalancer 负载均衡详解

《SpringCloudLoadBalancer负载均衡详解》本文介绍了如何在SpringCloud中使用SpringCloudLoadBalancer实现客户端负载均衡,并详细讲解了轮询策略和... 目录1. 在 idea 上运行多个服务2. 问题引入3. 负载均衡4. Spring Cloud Load

Springboot中分析SQL性能的两种方式详解

《Springboot中分析SQL性能的两种方式详解》文章介绍了SQL性能分析的两种方式:MyBatis-Plus性能分析插件和p6spy框架,MyBatis-Plus插件配置简单,适用于开发和测试环... 目录SQL性能分析的两种方式:功能介绍实现方式:实现步骤:SQL性能分析的两种方式:功能介绍记录

在 Spring Boot 中使用 @Autowired和 @Bean注解的示例详解

《在SpringBoot中使用@Autowired和@Bean注解的示例详解》本文通过一个示例演示了如何在SpringBoot中使用@Autowired和@Bean注解进行依赖注入和Bean... 目录在 Spring Boot 中使用 @Autowired 和 @Bean 注解示例背景1. 定义 Stud

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

SQL 中多表查询的常见连接方式详解

《SQL中多表查询的常见连接方式详解》本文介绍SQL中多表查询的常见连接方式,包括内连接(INNERJOIN)、左连接(LEFTJOIN)、右连接(RIGHTJOIN)、全外连接(FULLOUTER... 目录一、连接类型图表(ASCII 形式)二、前置代码(创建示例表)三、连接方式代码示例1. 内连接(I

Go路由注册方法详解

《Go路由注册方法详解》Go语言中,http.NewServeMux()和http.HandleFunc()是两种不同的路由注册方式,前者创建独立的ServeMux实例,适合模块化和分层路由,灵活性高... 目录Go路由注册方法1. 路由注册的方式2. 路由器的独立性3. 灵活性4. 启动服务器的方式5.