Android应用分类和安全Domain
2016-04-25 16:26
302 查看
Android系统应用
System APP vs. (Non-system) Ordinary APP
在Android系统中,应用可以分为系统应用(安装在/system/app分区上的)和非系统应用(安装在/data/app分区上的)。由于没有root权限的话/system分区是只读的,因此普通用户无法卸载系统应用。注意系统应用和是否用ROM platform key签名没有关系,一个用platform key签名的应用也可以安装在普通/data/app分区上。用platform key签名的APP可以访问某些signatureOrSystem权限的操作。比如,静默安装和卸载其他非系统应用(background installation or uninstallation)的权限。
系统应用拥有某些system-only的权限,这些权限普通应用是无法访问的。注意,这里所说的权限和root/sudo/su权限是不同的。比如,Android 2.3之前允许普通应用重置系统中错过的电话计数(missed call),而这一权限从Android 2.3开始,是一个只有system-only的权限。如果一个重置上面的计数的应用被放置在/system分区,那么该应用不需要root权限就能使用重置功能。类似的系统权限还比如禁止(Disable)设置gps mock location.
系统应用可以像普通应用一样升级,但是升级后的APP不会放到原有的ROM中,相比普通应用,系统应用有一个特殊能力就是能重置到ROM第一次安装时的版本。
系统应用不能像普通应用一样移动到外部的SD卡上,如果卸载了系统应用的升级版本,那么升级版本占用的内部空间会释放。
Privileged系统应用
从Android 4.4 KK起(之前系统分区中的APP都有signatureOrSystem permission),为了进一步控制好系统权限,对系统应用进一步区分成了Privileged和Non-Privileged. 只有Privileged系统应用才具有系统权限 (“system”-level permission),而Privileged系统应用就是那些APK文件被放在/system/priv-app中的系统应用。比如WRITE_SECURE_SETTINGS的权限,在/system/app中的系统应用是无法访问的,只有Privileged系统应用才可以(APK在/system/priv-app中),这里的系统应用无需platform证书,就有signatureOrSystem权限。Android系统中判断一个应用是否是系统应用还是用ApplicationInfo.FLAG_SYSTEM (表明应用在/system分区上),KK后新增了一个隐藏标志FLAG_PRIVILEGED来表示Priveleged系统应用。
Android APP的SE Context domain类别
应用的domain可以分成以下几个类别,具体的定义可以参考AOSP代码external/sepolicy/*_app.te.platform_app
“Apps signed with platform key.” 用platform key签名的APP。比如,用于安装包的PackageInstaller.system_app
“Apps that run with the system UID”, 比如com.android.settings. 注意system app的权限和system server不同。untrusted_app
“Apps are labeled based on mac_permissions.xml and seapp_contexts”.在目前的AOSP(M)中,所有non-system apps而且没有用platform key签名的system app的domain均为untrusted_app.
isolated_app
“APP with UID between AID_ISOLATED_START (99000) and AID_ISOLATED_END (99999)”. chrome sandbox isolated process.系统应用,platform签名,安全域
System app? | Platform signed? | 安装位置 | 有权限signatureOrSystem? | Security Domain |
---|---|---|---|---|
YES | YES | /system/app | YES | platform_app |
YES | NO | /system/app | (< KK) YES; (>=KK) apk在/system/priv-app -> YES,否则NO | Process User:如果是system,那么是system_app,否则是untrusted_app/isolated_app |
NO | YES | /data/app | YES | platform_app |
NO | NO | /data/app | NO | untrusted_app/isolated_app |
查看APP运行时的Domain
如何查看一个APP的Domain
启动APP,用ADB shell ps命令找到该APP对应的进程PIDps -Z PID
如何查看系统中某个Domain的进程
例如查看属于’platform_app’ domain的进程可以用如下命令:ps -Z | grep 'platform_app'
Reference
[1]http://android.stackexchange.com/questions/17871/what-are-the-differences-between-a-system-app-and-user-app[2]http://stackoverflow.com/questions/19868138/aosp-privileged-vs-system-app
[3]https://groups.google.com/forum/#!topic/android-platform/Vsa4IsJcOPE
[4]https://www.ricston.com/blog/explaining-behavior-android-application-system-apps-nonsystem-apps/
[5]http://stackoverflow.com/questions/28914215/is-it-possible-to-use-the-package-name-as-the-domain-name-in-android-selinux
相关文章推荐
- Android开发改变状态栏的颜色
- Android自动化测试之Monkey Test(一)
- Android Intent和Bundle机制实例详解
- gdb 远程调试android进程
- Android唯一识别号
- 【已解决】Android不能自动生成R.java
- Android studio butterknife简单使用
- Android开发框架
- Android ImageView长按保存图片及截屏相关知识
- android 断点下载---XUtils
- Android 手机上获取物理唯一标识码
- 论android的优化
- 如何获取Android RecyclerView滑动的距离
- Android Studio编译保留指定的so库
- Android loopj 文件上传
- Android:处理调用系统相机照片被压缩问题
- Android SDK和N多Android开发资源
- Android* 操作系统上的应用程序远程调试
- Activity(一)—生命周期及启动模式
- Android学习(44) -- 自定义控件(8) 下拉刷新(添加header)