android用户和AID
- linux用户和组
- android UID
adb进入手机,执行ps,如下图所示,在USER一栏除了有system,root以外,还有类似media_rw,u0_a78这种名字,那么这些字符串到底代表了什么?
linux用户和组
Android是在linux基础上构建的,而用户和组是linux中很重要的概念。linux系统允许多用户同时操作,用户和组主要是为了多用户同时工作来服务的。同时,linux还定义了对文件和目录进行操作的权限,操作的动作包括读、写、执行。
- 1.读权限:
对文件来说,顾名思义,允许读取文件的内容;对目录,读权限允许列出目录中的内容。 - 2.写权限:
对文件来说,就是可写入内容;对目录,允许修改目录的内容,比如删除、添加文件。 - 3.可执行:
对文件来说,就是可执行或者脚本;对目录有执行权限,可以允许你cd到该目录中,记得以前看过内核文件系统的路径解析代码,如果目录没可执行权限,则返回错误。
linux对某一文件或者目录的权限的管理分为:文件拥有者,文件所属于的组,其他用户。例如:
drwxr-xr-x 2 user user 4096 Jan 9 10:11 documents
- 1
- 1
文件documents,拥有者user的权限为读写可执行(rwx),组user的权限为读可执行(r-x),其他用户的权限为读可执行(r-x)。
注:linux一个用户可以属于多个组;而某个文件一般只属于一个组。但是如果支持posix acl扩展,利用setfacl getfacl等命令也能使得某个文件属于多个组。在我理解,acl扩展主要是为了弥补linux拥有者:组:其他用户这种模式的“粗犷”。
举个例子,如果用户user2也想去写documents这个文件,我们可以想到几种方法来实现:
1.将user2加入到组user中
2.给documents的其他用户增加写权限
从上面两个解决方法,都能感觉有些太过粗糙,对other定义的太过宽泛,而acl就是为了解决这个问题而产生的,简单地来说acl就是可以设置特定用户或者用户组对于一个文件的操作权限。
android UID
对android而言,是“单”用户的(从代码看貌似现在也支持多用户了),AOSP将linux用户这个概念做了修改。给每一个安装运行的app赋予不同的UID。下面结合代码看看这些system,root等字符串到底是什么(代码基于android 5.1)。
在system/core/include/private/android_filesystem_config.h中,有定义了数字的AID,从注释可以看出各个数字所对应的含义:
#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 */
#define AID_MDNSR 1020 /* MulticastDNSResponder (service discovery) */
#define AID_GPS 1021 /* GPS daemon */
#define AID_UNUSED1 1022 /* deprecated, DO NOT USE */
#define AID_MEDIA_RW 1023 /* internal media storage write access */
#define AID_MTP 1024 /* MTP USB driver access */
#define AID_UNUSED2 1025 /* deprecated, DO NOT USE */
#define AID_DRMRPC 1026 /* group for drm rpc */
#define AID_NFC 1027 /* nfc subsystem */
#define AID_SDCARD_R 1028 /* external storage read access */
#define AID_CLAT 1029 /* clat part of nat464 */
#define AID_LOOP_RADIO 1030 /* loop radio devices */
#define AID_MEDIA_DRM 1031 /* MediaDrm plugins */
#define AID_PACKAGE_INFO 1032 /* access to installed package details */
#define AID_SDCARD_PICS 1033 /* external storage photos access */
#define AID_SDCARD_AV 1034 /* external storage audio/video access */
#define AID_SDCARD_ALL 1035 /* access all users external storage */
#define AID_LOGD 1036 /* log daemon */
#define AID_SHARED_RELRO 1037 /* creator of shared GNU RELRO files */#define AID_SHELL 2000 /* adb and debug shell user */
#define AID_CACHE 2001 /* cache access */
#define AID_DIAG 2002 /* access to diagnostic resources *//* The 3000 series are intended for use as supplemental group id's only.* They indicate special Android capabilities that the kernel is aware of. */
#define AID_NET_BT_ADMIN 3001 /* bluetooth: create any socket */
#define AID_NET_BT 3002 /* bluetooth: create sco, rfcomm or l2cap sockets */
#define AID_INET 3003 /* can create AF_INET and AF_INET6 sockets */
#define AID_NET_RAW 3004 /* can create raw INET sockets */
#define AID_NET_ADMIN 3005 /* can configure interfaces and routing tables. */
#define AID_NET_BW_STATS 3006 /* read bandwidth statistics */
#define AID_NET_BW_ACCT 3007 /* change bandwidth statistics accounting */
#define AID_NET_BT_STACK 3008 /* bluetooth: access config files */#define AID_EVERYBODY 9997 /* shared between all apps in the same profile */#define AID_MISC 9998 /* access to misc storage */
#define AID_NOBODY 9999#define AID_APP 10000 /* first app user */#define AID_ISOLATED_START 99000 /* start of uids for fully isolated sandboxed processes */
#define AID_ISOLATED_END 99999 /* end of uids for fully isolated sandboxed processes */#define AID_USER 100000 /* offset for uid ranges for each user */#define AID_SHARED_GID_START 50000 /* start of gids for apps in each user to share */
#define AID_SHARED_GID_END 59999 /* start of gids for apps in each user to share */
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
其中APP的AID是从10000开始,而AID_USER为100000。从注释上看,Android现在也支持多用户了,AID_USER(100000)是每个用户的offset;而AID_APP表示用户安装的app的赋值的起始数值,而system,root这些AID系统已经固定。大概的意思是,第n个用户所安装的第m个apk的uid为n*AID_USER+10000+m (其中n从0开始,m每个apk都不同)。例如用户1所安装的第123个apk所对应的AID为0*100000+10000+123为10123,而用户2所安装的第123个apk所对应的AID为1*100000+10000+123为110123(每个用户最多可能装99000-10000=89000个app^_^)。
static const struct android_id_info android_ids[] = {{ "root", AID_ROOT, },{ "system", AID_SYSTEM, },{ "radio", AID_RADIO, },{ "bluetooth", AID_BLUETOOTH, },{ "graphics", AID_GRAPHICS, },{ "input", AID_INPUT, },{ "audio", AID_AUDIO, },{ "camera", AID_CAMERA, },{ "log", AID_LOG, },{ "compass", AID_COMPASS, },{ "mount", AID_MOUNT, },{ "wifi", AID_WIFI, },{ "adb", AID_ADB, },{ "install", AID_INSTALL, },{ "media", AID_MEDIA, },{ "dhcp", AID_DHCP, },{ "sdcard_rw", AID_SDCARD_RW, },{ "vpn", AID_VPN, },{ "keystore", AID_KEYSTORE, },{ "usb", AID_USB, },{ "drm", AID_DRM, },{ "mdnsr", AID_MDNSR, },{ "gps", AID_GPS, },// AID_UNUSED1{ "media_rw", AID_MEDIA_RW, },{ "mtp", AID_MTP, },// AID_UNUSED2{ "drmrpc", AID_DRMRPC, },{ "nfc", AID_NFC, },{ "sdcard_r", AID_SDCARD_R, },{ "clat", AID_CLAT, },{ "loop_radio", AID_LOOP_RADIO, },{ "mediadrm", AID_MEDIA_DRM, },{ "package_info", AID_PACKAGE_INFO, },{ "sdcard_pics", AID_SDCARD_PICS, },{ "sdcard_av", AID_SDCARD_AV, },{ "sdcard_all", AID_SDCARD_ALL, },{ "logd", AID_LOGD, },{ "shared_relro", AID_SHARED_RELRO, },{ "shell", AID_SHELL, },{ "cache", AID_CACHE, },{ "diag", AID_DIAG, },{ "net_bt_admin", AID_NET_BT_ADMIN, },{ "net_bt", AID_NET_BT, },{ "inet", AID_INET, },{ "net_raw", AID_NET_RAW, },{ "net_admin", AID_NET_ADMIN, },{ "net_bw_stats", AID_NET_BW_STATS, },{ "everybody", AID_EVERYBODY, },{ "misc", AID_MISC, },{ "nobody", AID_NOBODY, },
};
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
那么ps中第一列的用户id字符串和AID数字到底是如何转换的?在bionic/libc/bionic/stubs.cpp中,app_id_from_name函数就是从字符串到数字AID的转换,从注释就可以看出具体的转换方法和含义。
字符串已u*_开始,其中*为0,1,2….,为不同的用户,后面a代表app,i代表isolated,system,root等可以参考上面的数组android_ids[]。
// Translate a user/group name to the corresponding user/group id.
// u0_a1234 -> 0 * AID_USER + AID_APP + 1234
// u2_i1000 -> 2 * AID_USER + AID_ISOLATED_START + 1000
// u1_system -> 1 * AID_USER + android_ids['system']
// returns 0 and sets errno to ENOENT in case of error
static unsigned app_id_from_name(const char* name) {if (name[0] != 'u' || !isdigit(name[1])) {errno = ENOENT;return 0;}char* end;unsigned long userid = strtoul(name+1, &end, 10);if (end[0] != '_' || end[1] == 0) {errno = ENOENT;return 0;}unsigned long appid = 0;if (end[1] == 'a' && isdigit(end[2])) {// end will point to \0 if the strtoul below succeeds.appid = strtoul(end+2, &end, 10) + AID_APP;} else if (end[1] == 'i' && isdigit(end[2])) {// end will point to \0 if the strtoul below succeeds.appid = strtoul(end+2, &end, 10) + AID_ISOLATED_START;} else {for (size_t n = 0; n < android_id_count; n++) {if (!strcmp(android_ids[n].name, end + 1)) {appid = android_ids[n].aid;// Move the end pointer to the null terminator.end += strlen(android_ids[n].name) + 1;}}}// Check that the entire string was consumed by one of the 3 cases above.if (end[0] != 0) {errno = ENOENT;return 0;}// Check that user id won't overflow.if (userid > 1000) {errno = ENOENT;return 0;}// Check that app id is within range.if (appid >= AID_USER) {errno = ENOENT;return 0;}return (unsigned)(appid + userid*AID_USER);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
android用户和AID相关推荐
- android 技能标签功能_iOS和Android用户体验设计差异
摘要:iOS和Android用户体验设计差异 关键词:iOS,Android,用户体验设计 本文将讨论iOS和Android之间的具体设计差异. 基本差异 1.设计规范 iOS和Android遵循不同 ...
- 【Android教程】Android用户系统管理
原文:http://android.eoe.cn/topic/android_sdk Android用户迷恋于在自己的设备上安装他们所喜欢的应用.让您的应用受用户喜欢的一种方法就是让它个性化.Andr ...
- android用户界面之AlarmManager教程实例汇
qianqianlianmeng android用户界面之AlarmManager教程实例汇 AlarmManager使用教程 1. 如何利用AlarmManager机制在一定时间后启动某Activi ...
- 百万 Android 用户受感染!
点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 还是在 Google 官方商店 -- Google Play 上! 作者 | 言则 责编 | ...
- android ui设计与开发工具,Android用户体验与UI设计
Android用户体验与UI设计 编辑 锁定 讨论 上传视频 本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 本书是一部介绍Android用户体验.UI设计理念和方法论的作品 ...
- android icloud云盘,现在 Android 用户也可以在手机上使用 iCloud 了
在 2020 年为自家的云服务推出移动版网站还真是新潮呢 如果你是 Macbook 或 同时拥有 iPhone 手机的 Android 用户的话,那么一个好消息是,今天 Apple 终于为自家的云服务 ...
- 智能网关程序及Android用户控制程序,基于ARM Cortex-A8与 Android平台的智能家居系统设计毕业论文...
目录 第一章绪论 (6) 1.1选题背景及意义 (6) 1.2智能家居研究现状 (6) 1.2.1智能家居的起源 (6) 1.2.2智能家居在国外的发展 (6) 1.2.3智能家居在国内的发展 (6) ...
- android版本分布报告,安卓网Android用户地域分布报告:广东占比20%
2011年间,Android全球市场份额超越iPhone,易观2011Q4数据显示,国内Android手机销量份额已从Q2的46.8%上升至68.69%,安卓网行业数据分析处,就安卓市场的用户使用数据 ...
- android 原生分享界面_原生 Android 用户终于能用上骚扰电话拦截了
虽然对大部分国产手机用户而言,骚扰电话早已不再是一个令人头痛的问题.但如果你使用的是原生/类原生 Android 系统(例如 Google Pixel),骚扰电话拦截这件事就变得非常棘手了.所以和很多 ...
- 没法不起床:Android用户必备的闹铃利器
起!床!啦!!!清晨除非有那么一个人能把我从睡梦中彻底摇醒,否则当闹铃响的时候,像我这样赖床的瞌睡虫只会伸手把闹铃设置成"五分钟后叫醒",就这样一直过了两小时或更久,才意识到自己根 ...
最新文章
- 每日百万订单,这样的技术方案更靠谱
- Spring Boot应用程序浪费了内存
- Java并发修改异常的源码解析
- 【代码笔记】Web-HTML-列表
- 诺基亚E5删除自己安装的应用程序
- 软件漏洞-泛微OA-汇总
- git fork的项目与原作者同步
- linux 更新目录时间戳,修改linux 文件的时间戳
- 2022.3.14 阿里笔试
- xp计算机怎么共享,XP系统两台电脑共享文件办法
- python mp3转wav_python 录音,WAV转MP3
- php实现独立模块,poscms独立模块URL规则
- 计算机基础课堂小游戏互动,16个课前热身小游戏:让每一堂课都充满新鲜感
- 100个常用简单英语口语
- 【python数据分析实战】城市餐饮店铺选址问题(2)—— 确定餐馆的具体位置
- 【并行计算】OpenMP编程和MPI编程简单教程
- 【前端问题分析】从输入 URL 到浏览器接收的过程中发生了什么事情?
- 用原生js实现移动端图片轮播
- 计算机毕业设计之java+javaweb的二手商品交易系统
- C++ 扫雷小游戏(380行代码)
热门文章
- IOS测试——keychain_dumper工具的使用
- 计算机死机代码怎么写,如何用代码让电脑死机
- 碎片(Fragments)
- Win32SDK基本 RC资源的使用
- tornado, twister, cyclone,Typhoon,hurricane…到底如何区别?
- python语言由psf组织所有、这是一个商业组织_智慧职教云课堂APP店长实务答案搜题公众号...
- 解决页眉下划线与边框重复问题:设置页眉并保持好“距离“
- 作为一名程序员,我都收集了哪些好玩的生成器?
- 佛山成功办理全省首笔区块链出口退税业务
- 如何计算近似纳什均衡_网络与市场中的计算思维-5.博弈论的基本概念