`
Jack22
  • 浏览: 133293 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Android程序运行时权限与文件系统权限的区别

 
阅读更多

要区分apk运行时的拥有的权限与在文件系统上被访问(读写执行)的权限两个概念。
apk程序是运行在虚拟机上的,对应的是Android独特的权限机制,只有体现到文件系统上时才使用linux的权限设置。
(一)linux文件系统上的权
-rwxr-x--x system   system       4156 2010-04-30 16:13 test.apk
代表的是相应的用户/用户组及其他人对此文件的访问权限,与此文件运行起来具有的权限完全不相关。
比如上面的例子只能说明system用户拥有对此文件的读写执行权限;system组的用户对此文件拥有读、执行权限;其他人对此文件只具有执行权限。
而test.apk运行起来后可以干哪些事情,跟这个就不相关了。
千万不要看apk文件系统上属于system/system用户及用户组,或者root/root用户及用户组,就认为apk具有system或root权限
(二)Android的权限规则

(1)Android中的apk必须签名
这种签名不是基于权威证书的,不会决定某个应用允不允许安装,而是一种自签名证书。
重要的是,android系统有的权限是基于签名的。比如:system等级的权限有专门对应的签名,签名不对,权限也就获取不到。

默认生成的APK文件是debug签名的。
获取system权限时用到的签名,见:如何使Android应用程序获取系统权限

 

(2)基于UserID的进程级别的安全机制 
大家都知道,进程有独立的地址空间,进程与进程间默认是不能互相访问的,是一种很可靠的保护机制。
Android通过为每一个安装在设备上的包(apk)分配唯一的linux userID来实现,名称为"app_"加一个数字,比如app_43
不同的UserID,运行在不同的进程,所以apk之间默认便不能相互访问。

Android提供了如下的一种机制,可以使两个apk打破前面讲的这种壁垒。
在AndroidManifest.xml中利用sharedUserId属性给不同的package分配相同的userID,通过这样做,两个package可以被当做同一个程序,
系统会分配给两个程序相同的UserID。当然,基于安全考虑,两个package需要有相同的签名,否则没有验证也就没有意义了。

(这里补充一点:并不是说分配了同样的UserID,两程序就运行在同一进程, 下面为PS指令摘取的,
显然,system、app_2分别对应的两个进程的PID都不同,不知Android到底是怎样实现它的机制的)

User   PID PPID
system    953   883   187340 55052 ffffffff afe0cbcc S system_server
app_2     1072 883   100264 19564 ffffffff afe0dcc4 S com.android.inputmethod.
system    1083 883   111808 23192 ffffffff afe0dcc4 S android.process.omsservi
app_2     1088 883   156464 45720 ffffffff afe0dcc4 S android.process.acore

(3)默认apk生成的数据对外是不可见的 
实现方法是:Android会为程序存储的数据分配该程序的UserID。
借助于Linux严格的文件系统访问权限,便实现了apk之间不能相互访问似有数据的机制。
例:我的应用创建的一个文件,默认权限如下,可以看到只有UserID为app_21的程序才能读写该文件。
-rw------- app_21   app_21      87650 2000-01-01 09:48 test.txt

如何对外开放?
<1> 使用MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE 标记。
When creating a new file with getSharedPreferences(String, int), openFileOutput(String, int), or openOrCreateDatabase(String, int, SQLiteDatabase.CursorFactory), you can use the MODE_WORLD_READABLE and/or MODE_WORLD_WRITEABLE flags to allow any other package to read/write the file. When setting these flags, the file is still owned by your application, but its global read and/or write permissions have been set appropriately so any other application can see it.


(4)AndroidManifest.xml中的显式权限声明 
Android默认应用是没有任何权限去操作其他应用或系统相关特性的,应用在进行某些操作时都需要显式地去申请相应的权限。
一般以下动作时都需要申请相应的权限:

A particular permission may be enforced at a number of places during your program's operation:

  • At the time of a call into the system, to prevent an application from executing certain functions.
  • When starting an activity, to prevent applications from launching activities of other applications.
  • Both sending and receiving broadcasts, to control who can receive your broadcast or who can send a broadcast to you.
  • When accessing and operating on a content provider.
  • Binding or starting a service.


在应用安装的时候,package installer会检测该应用请求的权限,根据该应用的签名或者提示用户来分配相应的权限。
在程序运行期间是不检测权限的。如果安装时权限获取失败,那执行就会出错,不会提示用户权限不够。
大多数情况下,权限不足导致的失败会引发一个 SecurityException, 会在系统log(system log)中有相关记录。

(5)权限继承/UserID继承 
当我们遇到apk权限不足时,我们有时会考虑写一个linux程序,然后由apk调用它去完成某个它没有权限完成的事情,很遗憾,这种方法是行不通的。
前面讲过,android权限是经营在进程层面的,也就是说一个apk应用启动的子进程的权限不可能超越其父进程的权限(即apk的权限), 
即使单独运行某个应用有权限做某事,但如果它是由一个apk调用的,那权限就会被限制。
实际上,android是通过给子进程分配父进程的UserID实现这一机制的。

(三)常见权限不足问题分析

首先要知道,普通apk程序是运行在非root、非system层级的,也就是说看要访问的文件的权限时,看的是最后三位。
另外,通过system/app安装的apk的权限一般比直接安装或adb install安装的apk的权限要高一些。

言归正传,运行一个android应用程序过程中遇到权限不足,一般分为两种情况:
(1)Log中可明显看到权限不足的提示。
此种情况一般是AndroidManifest.xml中缺少相应的权限设置,好好查找一番权限列表,应该就可解决,是最易处理的情况。

有时权限都加上了,但还是报权限不足,是什么情况呢?
Android系统有一些API及权限是需要apk具有一定的等级才能运行的。 
比如 SystemClock.setCurrentTimeMillis()修改系统时间,WRITE_SECURE_SETTINGS权限好像都是需要有system级的权限才行。
也就是说UserID是system.

(2)Log里没有报权限不足,而是一些其他Exception的提示,这也有可能是权限不足造成的。
比如:我们常会想读/写一个配置文件或其他一些不是自己创建的文件,常会报java.io.FileNotFoundException错误。
系统认为比较重要的文件一般权限设置的也会比较严格,特别是一些很重要的(配置)文件或目录。

-r--r----- bluetooth bluetooth      935 2010-07-09 20:21 dbus.conf
drwxrwx--x system   system            2010-07-07 02:05 data 

dbus.conf好像是蓝牙的配置文件,从权限上来看,根本就不可能改动,非bluetooth用户连读的权利都没有。

/data目录下存的是所有程序的私有数据,默认情况下android是不允许普通apk访问/data目录下内容的,通过data目录的权限设置可知,其他用户没有读的权限。
所以adb普通权限下在data目录下敲ls命令,会得到opendir failed, Permission denied的错误,通过代码file.listfiles()也无法获得data目录下的内容。


上面两种情况,一般都需要提升apk的权限,目前我所知的apk能提升到的权限就是system(具体方法见:如何使Android应用程序获取系统权限),
至于是否有root级的,如何提升至root级不得而知,知道的朋友劳烦告知,感激不尽

分享到:
评论

相关推荐

    Android运行时权限

    在Android系统中,运行时权限是一种安全机制,自Android 6.0(API级别23)引入,旨在增强用户对应用程序权限的控制。这个机制要求应用程序在运行时请求某些敏感的权限,而不是像以前那样在安装时一次性获取所有权限...

    Android修改系统文件访问权限

    在init.rc中定义的service是在系统启动时由系统自动创建的,并且运行在root权限下,因此非常适合用来执行需要较高权限的操作,比如修改系统文件权限。 3. **JNI (Java Native Interface)**:JNI是Java平台的标准...

    Android6.0运行时权限框架封装

    Android 6.0的运行时权限框架使得用户可以在应用程序运行时对每个权限进行单独授权或拒绝,这增加了用户的隐私保护和对应用行为的透明度。 "Android6.0运行时权限框架封装"是指一种开发策略,它帮助开发者更方便地...

    android文件读写权限

    与读取权限一样,从Android 6.0开始,也需要在运行时获取用户授权。 三、AndroidManifest.xml配置 在Android项目的`AndroidManifest.xml`文件中,我们需要声明所需的权限。对于文件读写权限,添加以下代码: ```...

    Android 在程序运行时申请权限的实例讲解

    Android 程序运行时申请权限是 Android 操作系统中一个非常重要的机制,旨在保护用户的隐私和设备的安全。从 Android 6.0 开始,Google 推出了 Runtime Permission机制,该机制允许用户在安装应用程序后,选择性地...

    Android 6.0 运行时权限检查

    在Android 6.0(API级别23)及以上版本,系统引入了运行时权限模型,对应用程序的权限管理进行了重大改革。在此之前,用户在安装应用时一次性授予所有权限,但在Android 6.0之后,应用在运行时可以请求权限,让用户...

    Android-在Kotlin中处理Android运行时权限的最简单方法

    在Android开发中,自从Android 6.0(API级别23)引入了运行时权限模型,应用程序不再在安装时获取所有权限,而是需要在运行时根据需要请求用户许可。Kotlin作为现代Android开发的首选语言,提供了简洁的语法来处理...

    Qt Android 读写文件权限与录制音频权限询问Demo

    在Android系统中,读写文件权限分为内部存储和外部存储两种。内部存储权限用于访问应用私有的数据目录,而外部存储权限则允许访问公共的外部存储区域。在Qt中,可以使用QStandardPaths类来获取这些路径,并使用QFile...

    Android 6.0运行权限Demo

    在此"Android 6.0运行权限Demo"中,展示了如何在应用程序中适配这一新机制。 在Android 6.0之前,应用程序在安装时会一次性获取所有所需的权限,用户在安装时对这些权限没有选择权。然而,Android 6.0之后,系统...

    Android文件目录及文件访问权限等详解Demo

    应用可以在此创建文件,但必须遵循Android的文件权限规则。`Environment.getExternalStorageDirectory()`方法可以获取到外部存储的根目录。 2. **内部存储(Internal Storage)**:这是应用程序私有的存储空间,...

    Android6.0运行时权限Demo

    在Android 6.0(API级别23)中,系统引入了一种名为“运行时权限”的新机制,显著改变了应用程序如何请求和管理用户权限。在之前的Android版本中,应用在安装时会一次性获取所有所需权限,而在Android 6.0及更高版本...

    Android文件系统全面讲解

    在这个“Android文件系统全面讲解”的主题中,我们将深入探讨Android文件系统的结构、操作方式以及如何在应用程序中有效地使用文件。 1. **文件系统的层次结构** Android文件系统采用Linux标准的目录结构,根目录...

    android获取应用程序的权限列表

    在Android系统中,每个应用程序都运行在一个独立的安全沙箱中,拥有特定的权限来访问系统资源和服务。了解和管理这些权限对于开发者和用户来说都至关重要。本文将详细讲解如何在Android系统中获取应用程序的权限列表...

    转载:Android中如何修改系统时间(应用程序获得系统权限)

    在Android系统中,修改系统时间通常涉及到系统的敏感权限,因为这可能会影响到系统及应用的正常运行。本篇文章将深入探讨如何在Android应用程序中获取修改系统时间的权限,并提供相关源码分析。 首先,我们需要理解...

    android系统权限签名

    在Android系统中,权限签名是一项至关重要的安全机制,它确保应用程序的合法性和完整性。这个工具,源自Android的源代码,允许开发者为他们的应用程序添加系统权限的签名,从而使其能够访问和操作那些通常需要更高...

    Android 13读写权限变更,小米14 txt 文件读写

    在Android系统的发展历程中,权限管理一直扮演着重要的角色,特别是在Android 13版本中,对应用程序的存储访问权限进行了重大调整。这次变更主要是为了增强用户数据的安全性和隐私保护。对于开发者来说,这意味着...

    Android自定义权限的使用

    在Android 6.0(API级别23)及以上版本,对于危险权限,即使应用在清单文件中声明了,也需要在运行时动态请求用户的许可。 要创建自定义权限,我们需要遵循以下步骤: 1. **定义权限**: 在`AndroidManifest.xml`...

    Android 串口通信权限问题

    综上所述,Android串口通信权限问题涉及多个方面,包括Android权限系统、第三方库的使用、运行时权限请求以及设备兼容性等。解决这些问题需要深入理解Android系统机制,并在开发过程中采取适当措施,确保应用的稳定...

    Qt for android 动态权限申请

    即使在运行时请求权限,也需要在应用的AndroidManifest.xml文件中声明所需的权限。 ```xml &lt;uses-permission android:name="android.permission.READ_CONTACTS" /&gt; ``` 以上是一个基本的Qt for Android动态...

    Android文件访问权限(第一个)

    - **运行时权限**:自Android 6.0(API级别23)起,针对敏感操作,如访问联系人、位置、存储等,应用需要在运行时请求用户许可,即使在安装时已经声明了相关权限。 - **外部存储权限**:对`/sdcard/`目录的访问,...

Global site tag (gtag.js) - Google Analytics