阅读目录 Linux File Permission Android Permission android_filesystem_config.h fs_config.c 0000 这个阶段搞了很多和Android文件权限相关的问题,虽然一知半解,但也算是对Android权限机制有一些自己的理解。遂将这些内容整理出来。因为权限这部分涉及到的内容很多,故将知识分为几块内容分别去整理。目前能想到的概要如下: Android 权限底层实现原理概述 Android uid,gid的生成与权限机制的联系 Android packageManagerService与权限的千丝万缕(源码解析) Android 从recovery模式下的OTA升级理解权限 Android ROOT 原理 Android 签名 Android 权限大杀器 — Selinux的策略 这是第一篇。2,3,4已经有一些草稿了,但离发出来还有一些时间。5,6,7还在规划中。可以关注新弄的公众号softard,后面比较完善的文章都会在这个号上及时更新。 这里再推荐一本书,这也是查资料找到的一本宝贝,非常牛逼。 0001 Overview 回到顶部 Linux File Permission 众所周知,Android的内核是linux的内核。对于linux来说,系统的一切都是文件。同时,linux为文件系统设计了一套完善的权限机制。下面简单提一下linux文件权限的核心: 比如在Android手机adb shell下查看一个目录 # ls -ld data/data/ drwxrwx--x 113 system system 4096 1970-01-01 15:08 data/data/ 其中,drwxrwx--x这10位代表文件权限,第一位文件类型可以忽略(这里类型是文件夹),后面每三位代表文件拥有的权限,包括rwx(可读,可写,可执行)。system system表示文件属于system用户和属于system组。 翻译过来是,system用户对该文件拥有读写执行权限,system组对该文件拥有读写执行权限,其他用户对该文件拥有执行权限。简单来说就是771权限。 回到顶部 Android Permission Permission权限是Android系统定义的一套权限机制,用于控制APP访问某个硬件设备或某个Android系统的组件。 举两个常见的例子: 如果你的App想要访问存储卡,你需要在你的AndroidManifest文件中使用对应的permission用于向系统请求权限 。 你可以给你的Activity组件加个自定义的访问权限,这样任何想启动该Activity的程序必须在它的AndroidManifest中进行权限的请求。见Android自定义权限。 那么为什么你在AndroidManifest文件请求storage权限你就可以访问设备文件?linux文件属性的权限和Permission到底是怎么联系起来的呢?下面我们来具体来讲。 0010 packages.list & packages.xml Android开机阶段会扫描所有App,从Manifest文件中把App信息和权限存到packages.xml和packages.list文件中,具体的处理过程会在后面第三篇去分析。 因为文件包含所有已安装应用的信息,所以我们尝试安装一个App(com.softard.test),并且查看其信息: packages.list com.softard.test 10052 1 /data/user/0/com.softard.test default none 这里10052是uid,至于其怎么生成的后面第二篇再详谈。 packages.xml 然后对App做个修改,将其改成系统App并签名放到system/app/Test下,再看这两个文件: com.softard.test 1000 0 /data/user/0/com.softard.test platform 3009,3002,1023,1015,3003,3001,1021,1000,2002,2950,1010,1007 看到uid变成了1000,selinux从default变成platform,权限组从none变成3009,3002,1023,1015,3003,3001,1021,1000,2002,2950,1010,1007。而且应用一下子增加了一堆权限: 所以问题来了,改成系统应用后uid为什么变成1000?后面代表权限组的一串数字又都是什么? 0011 Android File Permission 回到顶部 android_filesystem_config.h 在Android中,所有权限的定义都在:system/core/include/private/android_filesystem_config.h 在这个头文件中定义了Android系统的一些用户,包含root用户,system用户,shell用户所对应的值等等。 /* This is the master Users and Groups config for the platform. * DO NOT EVER RENUMBER */ #define AID_ROOT 0 /* traditional unix root user */ #define AID_SYSTEM 1000 /* system server */ #define AID_RADIO 1001 /* telephony subsystem, RIL */ #define AID_BLUETOOTH 1002 /* bluetooth subsystem */ #define AID_GRAPHICS 1003 /* graphics devices */ #define AID_INPUT 1004 /* input devices */ #define AID_AUDIO 1005 /* audio devices */ #define AID_CAMERA 1006 /* camera devices */ #define AID_LOG 1007 /* log devices */ #define AID_COMPASS 1008 /* compass device */ #define AID_MOUNT 1009 /* mountd socket */ #define AID_WIFI 1010 /* wifi subsystem */ #define AID_ADB 1011 /* android debug bridge (adbd) */ #define AID_INSTALL 1012 /* group for installing packages */ #define AID_MEDIA 1013 /* mediaserver process */ #define AID_DHCP 1014 /* dhcp client */ #define AID_SDCARD_RW 1015 /* external storage write access */ #define AID_VPN 1016 /* vpn system */ #define AID_KEYSTORE 1017 /* keystore subsystem */ #define AID_USB 1018 /* USB devices */ #define AID_DRM 1019 /* DRM server *