当前位置: 首页 > news >正文

Android UID 和 userID 以及 appID

我们知道Android 操作系统是基于Linux内核的,所以Android 的UID 是基于 Linux UID的。

Linux UID

Linux 本身就是一个多用户操作系统,每一个用户都会有一个UID,不同UID 之间的资源访问是受限的。
其中,Linux的DAC权限模型,控制的不同UID资源间的读、写、执行。也就是所谓的 “777” 权限。
d: 标识文件夹
r : 读权限
w:写权限
x : 执行权限
在这里插入图片描述
Android 平台就是利用基于 Linux 用户的保护机制识别和隔离应用资源,为此,Android 会为每个 Android 应用分配一个唯一的用户 ID (UID),并在自己的进程中运行。

例如,应用的内部存储,data/data/应用包名/ 正是此机制一个直接应用,每个应用都有一个单独的UID,无法对彼此数据的直接访问。
在这里插入图片描述

Android appID

在单用户时代, 每个package单独分配一个uid/gid来进行管理(共享uid/gid的除外)。而在支持多用户之后,同一个 app, 在不同的 android user 下运行时, 其 uid 是不同的。 因此,无法使用唯一的 uid 来标识一个 android package。所以引入了 appID 来标识一个 android package, appID 在安装时确定, 与运行状态无关, 因此, 在不同的 android user 下, 同一个 package 的 appID 是不变的。

如果默认不创建多个用户时,android 只有一个用户时 uid == appID

	public static final int FIRST_APPLICATION_UID = 10000;public static final int LAST_APPLICATION_UID = 19999;size ==> 第几个安装。所以 最多安装9999 个应用appId = Process.FIRST_APPLICATION_UID + size;

Linux userID

Android在创建每个用户时,都会分配一个整型的 userID。对于主用户(正常下的默认用户)来说,userId为0,之后创建的userId将从10开始计算,每增加一个userId加1。

有了 appID 和 UserID之后,我们就可以通过组合它们来生成新的 UID,但是有两种情况。
如果默认不创建多个用户时,
UserID = 0
uid = appID
创建多用户时:
UserID = 10
uid = UserID * 100000 + appID
我们来看看 UserID 的规则代码

	// frameworks/base/core/java/android/os/UserHandle.javapublic static int getUid(@UserIdInt int userId, @AppIdInt int appId) {if (MU_ENABLED && appId >= 0) {return userId * PER_USER_RANGE + (appId % PER_USER_RANGE);} else {return appId;}}public static @UserIdInt int getUserId(int uid) {if (MU_ENABLED) {// public static final int PER_USER_RANGE = 100000;return uid / PER_USER_RANGE;} else {return UserHandle.USER_SYSTEM;}}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 代码随想录 刷题记录-28 图论 (5)最短路径
  • 中秋之美——html5+css+js制作中秋网页
  • 深入理解单元测试
  • 对随机游走问题的分析特定行为模式的建模
  • 将Google Chrome或Microsoft Edge浏览器的地址栏隐藏的方法
  • 代理模式(权限、远程调用、延迟加载、日志和缓存)
  • 在vscode中用virtual env的方法
  • JVM5-垃圾回收
  • pandas读取带有表头的数据文件,读取无表头的数据文件
  • C语言深入理解指针4
  • 小琳AI课堂:深入学习Transformer模型
  • 2024国赛数学建模备战:灰色预测,国赛数学建模思路代码 模型
  • 如果文件从存储卡中被误删除,存储卡数据恢复如何恢复?
  • 亚信安全荣获“2024年网络安全优秀创新成果大赛”优胜奖
  • Android Radio2.0——交通公告状态设置(二)
  • 【EOS】Cleos基础
  • Angular2开发踩坑系列-生产环境编译
  • avalon2.2的VM生成过程
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • orm2 中文文档 3.1 模型属性
  • React16时代,该用什么姿势写 React ?
  • SpringCloud(第 039 篇)链接Mysql数据库,通过JpaRepository编写数据库访问
  • v-if和v-for连用出现的问题
  • vue的全局变量和全局拦截请求器
  • 不用申请服务号就可以开发微信支付/支付宝/QQ钱包支付!附:直接可用的代码+demo...
  • 第十八天-企业应用架构模式-基本模式
  • 给Prometheus造假数据的方法
  • 构建二叉树进行数值数组的去重及优化
  • 检测对象或数组
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • 使用iElevator.js模拟segmentfault的文章标题导航
  • 使用Swoole加速Laravel(正式环境中)
  • 用quicker-worker.js轻松跑一个大数据遍历
  • Semaphore
  • 第二十章:异步和文件I/O.(二十三)
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • #etcd#安装时出错
  • (poj1.2.1)1970(筛选法模拟)
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (二)换源+apt-get基础配置+搜狗拼音
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (十五)使用Nexus创建Maven私服
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (原創) 如何刪除Windows Live Writer留在本機的文章? (Web) (Windows Live Writer)
  • (转)Google的Objective-C编码规范
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .net core 的缓存方案
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .Net Core 中间件验签
  • .NET Core使用NPOI导出复杂,美观的Excel详解
  • .NET HttpWebRequest、WebClient、HttpClient
  • .NET 指南:抽象化实现的基类
  • .Net(C#)自定义WinForm控件之小结篇
  • .NetCore部署微服务(二)