从源码角度分析Android中UID与GID的分配

来源:互联网 发布:淘宝补单 编辑:程序博客网 时间:2024/05/22 09:51

概述

UID一般理解为User Identifier,在linux中就是用户的ID,表明是哪个用户运行了这个程序,GID则表明了这个用户属于哪个组。它们主要用于权限的管理。

而在Android中,部分权限的管理是依赖底层的linux的,所以了解Android的UID/GID十分必要。

网上有下面的一段话:
而在Android 中又有所不同,因为Android为单用户系统,这时UID 便被赋予了新的使命,android为每个应用几乎都分配了不同的UID,不像传统的linux,每个用户相同就为之分配相同的UID。(当然这也就表明了一个问题,android只能时单用户系统,在设计之初就被他们的工程师给阉割了多用户),使之成了数据共享的工具。

这段话有对有错,这篇文章将结合源码来分析UID与GID的分配,使我们有个最清晰的理解。源码版本为4.3。

首先需要明确的一点是,App的UID和GID是安装的时候确认的。而与安装相关的源码目录是:
frameworks\base\services\java\com\android\server\pm

PackageManagerService.java的scanPackageLI方法

private PackageParser.Package scanPackageLI(PackageParser.Package pkg,            int parseFlags, int scanMode, long currentTime) {    ............    //获取一系列属性    pkgSetting = mSettings.getPackageLPw(pkg, origPackage, realName, suid, destCodeFile,                    destResourceFile, pkg.applicationInfo.nativeLibraryDir,                    pkg.applicationInfo.flags, true, false);    ............    //UID赋值    pkg.applicationInfo.uid = pkgSetting.appId;    ............

可以看到在getPackageLPw方法中,获取了UID,那我们打开这个函数看看:
Settings.java的getPackageLPw方法

    private PackageSetting getPackageLPw(String name, PackageSetting origPackage,            String realName, SharedUserSetting sharedUser, File codePath, File resourcePath,            String nativeLibraryPathString, int vc, int pkgFlags, boolean create, boolean add) {            .........            s.userId = newUserIdLPw(s);            .........            }

可以看到UID是newUserIdLPw()指定的,那再打开这个看看:
依然是Settings文件

private int newUserIdLPw(Object obj) {        // Let's be stupidly inefficient for now...        final int N = mUserIds.size();        for (int i = 0; i < N; i++) {            if (mUserIds.get(i) == null) {                mUserIds.set(i, obj);                return Process.FIRST_APPLICATION_UID + i;            }        }        // None left?        if (N > (Process.LAST_APPLICATION_UID-Process.FIRST_APPLICATION_UID)) {            return -1;        }        mUserIds.add(obj);        return Process.FIRST_APPLICATION_UID + N;    }

至此,UID就算是分配下来了。
可以看到for循环和if (mUserIds.get(i) == null)语句限定了一个APP只有一个UID,而这个Process.FIRST_APPLICATION_UID是在frameworks/base/core/java/android/os/Process.java中定义的,其值为10000,这就是为什么Android的UID都是从10000开始的。

再回到PackageManagerService.javascanPackageLI代码:

//invoke installer to do the actual installation    //第二个uid就是GID    int ret = mInstaller.install(pkgName, pkg.applicationInfo.uid,            pkg.applicationInfo.uid);    if (ret < 0) {        // Error from installer        mLastScanError = PackageManager.INSTALL_FAILED_INSUFFICIENT_STORAGE;        return null;    }    // Create data directories for all users    // 指定工作目录    sUserManager.installPackageForAllUsers(pkgName, pkg.applicationInfo.uid);    if (dataPath.exists()) {        pkg.applicationInfo.dataDir = dataPath.getPath();    } else {        Slog.w(TAG, "Unable to create data directory: " + dataPath);        pkg.applicationInfo.dataDir = null;    }

可以看到此函数在运行时,将UID的值直接赋值给了GID,所以通常UID和GID也是相同的。从官方注释这可以看到Android有多用户。事实上,Android某些平板对多用户是支持的,我猜大家常见的是阉割版的吧,所以有误会。
打开UserManagerinstallPackageForAllUsers方法可以看到:

public void installPackageForAllUsers(String packageName, int uid) {    for (int userId : mUserIds) {        // Don't do it for the primary user, it will become recursive.        if (userId == 0)            continue;        mInstaller.createUserData(packageName, UserId.getUid(userId, uid),                userId);    }}

写了这么多,相信大家对UID/GID的分配有了更深刻的理解。欢迎一起讨论哈。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 晚上楼上有挪桌子的声音怎么办 金灶茶具出故障码e7怎么办 起亚k2灯泡掉进大灯总成怎么办 衣服上拆过线的针孔怎么办 驾考科目二坡道定点熄火怎么办 穿着超短裤感觉要漏屁股怎么办 台式电脑开机后无法进入系统怎么办 产后两年了肚子肥胖松弛怎么办 在作文中写上自己的名字怎么办 外出玩耍时迷路了你会怎么办 外出玩耍时孩子总喜欢乱跑怎么办? 如果真的物价高的受不了怎么办 每晚要5次真的受不了怎么办 五年级的学生钢笔字写不好怎么办 全麻醉药过后让人产生幻觉怎么办? 网贷小象优品上被别人冒用了怎么办 当你和老人产生冲突时该怎么办 百度网盘会员到期后容量怎么办 一个人不停的给你发视频聊天怎么办 被谋杀后的身后事应该怎么办 社保交了五年被单位辞退怎么办 桅子花叶子变黄叶杆蔫怎么办 薄荷养的都黄了干掉了怎么办 被烟草局没收的烟要是假烟怎么办 干了10年工程不想干了怎么办 在服务行业当服务员干不下去怎么办 高中生晚上偷着跑出去玩怎么办 货车高速忘记过安全检查站了怎么办 u盘上的文件名称乱码了怎么办 暖气管掉进去一点水泥渣怎么办 暗埋在瓷砖下的暖气管漏水怎么办 埋在瓷砖下面的水管漏水怎么办 埋在瓷砖下的水管漏水怎么办 水压太大把水管撑坏了怎么办 无效安装包与系统不兼容怎么办 圣空法师持五戒范戒了怎么办 美航空要是不改中国台湾标志怎么办 淘宝买的东西质量有问题怎么办 天猫618长达20天c店怎么办 新开的淘宝店铺没有生意怎么办 淘宝账号登陆限制用不了花呗怎么办