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

而在Android 中又有所不同,因为Android为单用户系统,这时UID 便被赋予了新的使命,android为每个应用几乎都分配了不同的UID,不像传统的linux,每个用户相同就为之分配相同的UID。这也表明Android只能是单用户系统,在设计之初就被他们的工程师删除了多用户功能,而使之成了数据共享的工具。

首先需要明确的一点是,App的UID是安装的时候确认的。而与安装相关的源码目录是:
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开始的。

Android UID 机制的更多相关文章

  1. 理解Android安全机制

    本文从Android系统架构着手,分析Android的安全机制以SE Android,最后给出一些Android安全现状和常见的安全解决方案. 1.Android系统架构 Android采用分层的系统 ...

  2. Android安全机制(2) Android Permission权限控制机制

    http://blog.csdn.net/vshuang/article/details/44001661 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 1.概述 Andro ...

  3. [置顶] Android安全机制分析

    Android系统是基于Linux内核开发的,因此,Android系统不仅保留和继承了Linux操作系统的安全机制,而且其系统架构的各个层次都有独特的安全特性[2] . 1. Linux内核层安全机制 ...

  4. Android 安全机制

    转:http://www.cnblogs.com/GnagWang/archive/2011/03/21/1990507.html 1 Android 安全机制概述 Android 是一个权限分离的系 ...

  5. 深入讲解Android Property机制

    深入讲解Android Property机制 侯亮 1      概述 Android系统(本文以Android 4.4为准)的属性(Property)机制有点儿类似Windows系统的注册表,其中的 ...

  6. 抽丝剥茧:理解Android权限机制

    前一段时间面试官问我Android在Linux的基础上,权限做了哪些改变.霹雳呱啦说了一堆,但是说着说着,始终感觉自己说的缺了点东西,自己理解还是不够到位,而且网上的很多文章在原理上基本都是大同小异, ...

  7. Android随笔之——Android广播机制Broadcast详解

    在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理.这个广播跟我们传统意义中的电台广播有些相似之处.之所以叫做广播,就 ...

  8. Android广播机制的深入学习

    部分内容转载自http://www.cnblogs.com/lwbqqyumidi/p/4168017.html 1.Android广播机制概述 Android广播分为两个方面:广播发送者和广播接收者 ...

  9. Android签名机制

    Android APK 签名比对 发布过Android应用的朋友们应该都知道,Android APK的发布是需要签名的.签名机制在Android应用和框架中有着十分重要的作用. 例如,Android系 ...

随机推荐

  1. jq 字符串去除空格

    1.去除首尾空格: var txt = $('#Txt').val().trim(); txt = txt.replace(/(^\s*)|(\s*$)/g, ""); 2.去除所 ...

  2. Failed to create agent because it is not close enough to the NavMesh

    主要原因是:两个相同对象navmesh点太近造成. 解决方案:通过NavMesh.SamplePosition 获得可以行走点 ;i<;i++) { , mRadius); , 3.14f); ...

  3. Oracle 有排序的分页SQL写法

    第一种: SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A ) 第二种: SELECT * FROM ( ...

  4. Oracle 12c 创建新的数据库实例、用户

    前提:安装好了Oracle 12c数据库,已有一个数据库实例xe,登录用户/密码:system/oralce 我用的是docker安装的Oracle 12c的实例: docker run --name ...

  5. srs之深入浅出看流媒体

    本文转载:https://blog.csdn.net/zjqlovell/article/details/50786040 CDN这几年爆炸式增长,带宽提速是根源,而HTTP始终还是那个屌样,因此目前 ...

  6. Scania SDP3 2.38.2.37.0 Download, Install, Activate: Confirmed

    Download: Scania Diagnos & Programmer SDP3 2.38.2.37.0 free version and tested version SDP3 2.38 ...

  7. NC 63凭证辅助相关表

    1:通过公司主键(pk_org)在AccChartVO(表:bd_accchart)找:pk_accchart 2:通过科目编码和pk_accchart在AccAsoaVO(表:bd_accasoa) ...

  8. 静态链接库与动态链接库----C/C++

    http://blog.csdn.net/freestyle4568world/article/details/49817799

  9. Scikit-learn 安装

    Scikit-Learn 3 pip 安装 如果安装了Python,没有安装pip,使用Windows + R,输入cmd,回车打开命令行,输入 python -m pip install -U pi ...

  10. angular4.0懒加载

    用angular4.0进行前后端分离已经好几个月了,现在接近了尾声,pc端和移动端.可是却还存在着很多问题,最近这几天一直在研究懒加载问题,因为通过ng build --prod打包后主文件很大,有2 ...