Android 从uid到用户名的映射分析

熟悉linux的系统的人都知道uid,android使用linux kernel,也有uid,但是anroid uid的概念和常见的linux系统的uid 概念不太一样。

linux文件系统中,每个文件都会保存属性信息,包括文件所有者uid,文件所在组gid,文件的可读可写可执行权限。这些信息称之为stat信息。

stat信息里只保存了uid,被没用用户名。熟悉ubuntu的朋友都知道,uid和用户名之间的对应关系保存在/etc/passwd目录下,有了uid,再去/etc/passwd文件里找,就能找到uid对应的用户名了。

好,我们进入adb 进入android手机,去找找/etc/passwd文件。Waht the f**k! 坑爹啊, 根本没有这个文件。

这个问题困扰了我很久,于是有一天,我决定看android源码来解决这个问题。

我从android原生shell命令ps入手。android的shell为toolbox,那么ps命令源码自然在toolbox项目下。源码路径为system/core/toolbox/ps.c。

ps命令主要是遍历/proc目录,找到所有数字开头的目录,数字开头的目录是对应pid的信息目录,目录的uid就是对应pid进程的创建者。ps中主要通过这些代码拿到用户名。

    pw = getpwuid(stats.st_uid);
    if(pw == 0) {
        sprintf(user,"%d",(int)stats.st_uid);
    } else {
        strcpy(user,pw->pw_name);
    }
pw的结构如下

struct passwd {
               char   *pw_name;       /* username */
               char   *pw_passwd;     /* user password */
               uid_t   pw_uid;        /* user ID */
               gid_t   pw_gid;        /* group ID */
               char   *pw_gecos;      /* user information */
               char   *pw_dir;        /* home directory */
               char   *pw_shell;      /* shell program */
           };

man 下getpwuid,了解到getpwuid返回uid对应的password database记录的部分信息,password database通常为/etc/passwd文件。

貌似我们又回到了原点,oh god help me。我打算getpwuid看看实现代码,看看它是如何从/etc/passwd文件中找对应的record。

我在google里输入关键字“android getpwuid” (一定要用google哦,百度是搜不到的哦),找到了getpwuid的实现源码,看到了bionic字样,这才恍然大悟。原来android没有用标准的c库,用了bionic库,标准的c库中getpwuid实现一般会到/etc/passwd文件中找uid对应的record,但是bioinc中所用的uid和用户名对应的关系都是在代码里写死的,代码文件为system/core/include/private/android_filesystem_config.h。

看完代码后,有一种释然的感觉,困扰我许久的问题总算是有了答案。今后在分析android的时候,不要用传统的linux的角度去分析,尽量看android源码。

你可能感兴趣的:(android源码)