• 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相关推荐

  1. android 技能标签功能_iOS和Android用户体验设计差异

    摘要:iOS和Android用户体验设计差异 关键词:iOS,Android,用户体验设计 本文将讨论iOS和Android之间的具体设计差异. 基本差异 1.设计规范 iOS和Android遵循不同 ...

  2. 【Android教程】Android用户系统管理

    原文:http://android.eoe.cn/topic/android_sdk Android用户迷恋于在自己的设备上安装他们所喜欢的应用.让您的应用受用户喜欢的一种方法就是让它个性化.Andr ...

  3. android用户界面之AlarmManager教程实例汇

    qianqianlianmeng android用户界面之AlarmManager教程实例汇 AlarmManager使用教程 1. 如何利用AlarmManager机制在一定时间后启动某Activi ...

  4. 百万 Android 用户受感染!

    点击上方"CSDN",选择"置顶公众号" 关键时刻,第一时间送达! 还是在 Google 官方商店 -- Google Play 上! 作者 | 言则 责编 | ...

  5. android ui设计与开发工具,Android用户体验与UI设计

    Android用户体验与UI设计 编辑 锁定 讨论 上传视频 本词条缺少概述图,补充相关内容使词条更完整,还能快速升级,赶紧来编辑吧! 本书是一部介绍Android用户体验.UI设计理念和方法论的作品 ...

  6. android icloud云盘,现在 Android 用户也可以在手机上使用 iCloud 了

    在 2020 年为自家的云服务推出移动版网站还真是新潮呢 如果你是 Macbook 或 同时拥有 iPhone 手机的 Android 用户的话,那么一个好消息是,今天 Apple 终于为自家的云服务 ...

  7. 智能网关程序及Android用户控制程序,基于ARM Cortex-A8与 Android平台的智能家居系统设计毕业论文...

    目录 第一章绪论 (6) 1.1选题背景及意义 (6) 1.2智能家居研究现状 (6) 1.2.1智能家居的起源 (6) 1.2.2智能家居在国外的发展 (6) 1.2.3智能家居在国内的发展 (6) ...

  8. android版本分布报告,安卓网Android用户地域分布报告:广东占比20%

    2011年间,Android全球市场份额超越iPhone,易观2011Q4数据显示,国内Android手机销量份额已从Q2的46.8%上升至68.69%,安卓网行业数据分析处,就安卓市场的用户使用数据 ...

  9. android 原生分享界面_原生 Android 用户终于能用上骚扰电话拦截了

    虽然对大部分国产手机用户而言,骚扰电话早已不再是一个令人头痛的问题.但如果你使用的是原生/类原生 Android 系统(例如 Google Pixel),骚扰电话拦截这件事就变得非常棘手了.所以和很多 ...

  10. 没法不起床:Android用户必备的闹铃利器

    起!床!啦!!!清晨除非有那么一个人能把我从睡梦中彻底摇醒,否则当闹铃响的时候,像我这样赖床的瞌睡虫只会伸手把闹铃设置成"五分钟后叫醒",就这样一直过了两小时或更久,才意识到自己根 ...

最新文章

  1. 每日百万订单,这样的技术方案更靠谱
  2. Spring Boot应用程序浪费了内存
  3. Java并发修改异常的源码解析
  4. 【代码笔记】Web-HTML-列表
  5. 诺基亚E5删除自己安装的应用程序
  6. 软件漏洞-泛微OA-汇总
  7. git fork的项目与原作者同步
  8. linux 更新目录时间戳,修改linux 文件的时间戳
  9. 2022.3.14 阿里笔试
  10. xp计算机怎么共享,XP系统两台电脑共享文件办法
  11. python mp3转wav_python 录音,WAV转MP3
  12. php实现独立模块,poscms独立模块URL规则
  13. 计算机基础课堂小游戏互动,16个课前热身小游戏:让每一堂课都充满新鲜感
  14. 100个常用简单英语口语
  15. 【python数据分析实战】城市餐饮店铺选址问题(2)—— 确定餐馆的具体位置
  16. 【并行计算】OpenMP编程和MPI编程简单教程
  17. 【前端问题分析】从输入 URL 到浏览器接收的过程中发生了什么事情?
  18. 用原生js实现移动端图片轮播
  19. 计算机毕业设计之java+javaweb的二手商品交易系统
  20. C++ 扫雷小游戏(380行代码)

热门文章

  1. IOS测试——keychain_dumper工具的使用
  2. 计算机死机代码怎么写,如何用代码让电脑死机
  3. 碎片(Fragments)
  4. Win32SDK基本 RC资源的使用
  5. tornado, twister, cyclone,Typhoon,hurricane…到底如何区别?
  6. python语言由psf组织所有、这是一个商业组织_智慧职教云课堂APP店长实务答案搜题公众号...
  7. 解决页眉下划线与边框重复问题:设置页眉并保持好“距离“
  8. 作为一名程序员,我都收集了哪些好玩的生成器?
  9. 佛山成功办理全省首笔区块链出口退税业务
  10. 如何计算近似纳什均衡_网络与市场中的计算思维-5.博弈论的基本概念