【车载Android】多用户(一) - Linux用户与Android多用户

news2024/10/6 5:59:57

现如今手机这样的移动设备已经是人手一台了,但是汽车依然是以家庭为单位使用,不同的家庭成员对于汽车的使用存在着差异,比如空间、功能、影音风格等。因此,“智能汽车”需要具备千人千面的特性,能够适应不同的用户和场景。这就要求车载信息娱乐系统必须实现这一关键目标,为不同的驾驶员提供个性化的服务和体验。

Android是一个基于Linux内核的操作系统,它支持多用户模式,即可以在同一台设备上创建多个用户账户,每个用户都有自己的应用、数据和设置。这样可以保护用户的隐私,也可以方便不同的使用场景。但是,Android的多用户机制并不完全等同于Linux的用户组机制,它们之间依然有较大的差异。

本系列文章将从Linux用户的概念入手,逐步分析车载Android多用户机制的原理和特点,以及它们在车载系统中的应用和适配。分为以下章节:

【车载Android】多用户(一) - Linux用户与Android多用户

【车载Android】多用户(二) - Android Automotive 多用户原理

【车载Android】多用户(三) - 构建可感知多用户的车载应用

首先我们先来介绍,linux中用户和用户组的概念。

Linux 用户与用户组

在 Linux系统中用户用户组是一种用来标识和分类系统中的不同实体的方法。它与文件操作权限息息相关。

Linux 用户

Linux 用户是指可以登录到系统或运行某些进程的实体,它们有一个唯一的用户名和用户 ID(UID)。

Linux 用户分为两种类型:系统用户普通用户

  • 系统用户:指用来运行系统服务或后台进程的用户,它们通常不需要或不允许登录到系统,只负责特定的功能。
  • 普通用户:指用来登录到系统或运行交互式进程的用户,它们通常有自己的密码、主目录和默认 shell,可以根据自己的需求使用系统资源。

Linux中的root用户就是系统用户,它具有系统中所有的权限,它不需要登录,也不需要密码,它只是用来运行系统或服务的,root可以访问和修改任何文件和设置,也可以创建和删除其他用户。

root用户是系统的超级管理员,也是系统的默认用户。root用户的UID是0,这是一个特殊的值,表示这个账号是管理员账号。

Linux 用户组

Linux 用户组是指一组具有相同或相似属性或角色的用户的集合,它们有一个唯一的组名和组 ID(GID)。

Linux 用户组分为两种类型:主用户组次用户组

  • 主用户组:指每个用户在创建时就分配的默认用户组,它决定了该用户在没有指定其他用户组时所属的用户组。
  • 次用户组:指除了主用户组之外,用户还可以加入的其他用户组,它可以让用户拥有更多的权限或资源。

Linux 用户和用户组一般认为有以下4点作用:

  • 管理系统中不同类型和级别的实体,提高系统的安全性和效率。
  • 控制文件或目录的访问权限,保护数据的隐私和完整性。
  • 分配系统资源,优化系统性能和负载。
  • 实现多任务和多用户的功能,提高系统的灵活性和可扩展性。

Linux 文件权限

Linux 的文件系统中,每个文件或目录都有一个所有者(owner)和一个所属组(group),以及三种类型的权限(read、write、execute)。

文件权限简介

文件或目录的所有者(owner)是指创建该文件或目录的用户,或者被授权修改该文件或目录的用户。所有者通常拥有对该文件或目录的最高权限

文件或目录的所属组(group)是指与该文件或目录相关联的用户组,或者被授权访问该文件或目录的用户组。所属组通常拥有对该文件或目录的次高权限

文件或目录的权限(read、write、execute)是指对该文件或目录的操作能力,分为三种类型:

  • 读取(read):表示可以查看该文件或目录的内容或属性。简写:r。
  • 写入(write):表示可以修改该文件或目录的内容或属性。简写:w
  • 执行(execute):表示可以运行该文件或目录作为一个程序或命令。简写:x。

不同的用户类型(所有者、所属组、其他用户)可以拥有不同的权限,这些权限可以用数字或字母来表示。例如,rwx 表示拥有读取、写入和执行的权限,而 7 表示拥有所有权限(4+2+1),如何计算得出,后面会解释。

我们简单举个例子,在控制台执行ls -l命令,输出的结果如下:

  • -rw-r--r--

第一个字段表示文件的类型和权限。第一个字符表示文件的类型,-表示普通文件,d表示目录,l表示链接文件。后面的九个字符分为三组,每组三个字符,分别表示文件所有者文件所属组其他用户对该文件的权限。r表示可读,w表示可写,x表示可执行,-表示没有该权限。

  • link

第三个字段表示文件的所有者。这是一个用户名,表示该文件属于哪个用户。

  • link

第四个字段表示文件所属的组。这是一个用户组名,表示该文件可以被哪些用户共享。

修改文件权限

在Linux系统我们可以使用chmod指令修改文件或目录权限,它的格式是:

chmod [选项] 权限 文件或目录

其中,权限可以用数字或字母来表示,数字表示的权限是三位数,每一位数的范围是0到7,分别表示不同的权限组合。每一位数又可以分解为三个二进制位,分别表示执行权限,1表示有该权限,0表示没有该权限。例如:

  • 0 表示没有任何权限,二进制为000。
  • 1 表示只有执行权限,二进制为001。
  • 2 表示只有写权限,二进制为010。
  • 3 表示有写和执行权限,二进制为011。
  • 4 表示只有读权限,二进制为100。
  • 5 表示有读和执行权限,二进制为101。
  • 6 表示有读和写权限,二进制为110。
  • 7 表示有读、写和执行权限,二进制为111。

三位数的权限分别表示文件所有者、文件所属组和其他用户对该文件或目录的权限。例如:

  • 777 表示所有者、所属组和其他用户都有读、写和执行权限,二进制为111 111 111。
  • 644 表示所有者有读和写权限,所属组和其他用户只有读权限,二进制为110 100 100。
  • 755 表示所有者有读、写和执行权限,所属组和其他用户只有读和执行权限,二进制为111 101 101。

例如:我们在控制台中执行chmod 777 06.SystemUI功能与源码结构分析.pptx指令,输出结果如下《06.SystemUI功能与源码结构分析.pptx 》这个文件权限,已经被成功修改了。

chmod 777 会把指定的文件或目录的权限设置为所有者所属组其他用户都有执行权限。这是一种非常宽松的权限设置,一般不推荐使用,在Android中系统甚至可能会阻止你设定如此宽松的权限,因为它可能会导致文件或目录被任意修改或删除。除非你确实需要让所有用户都能访问和操作该文件或目录,否则你应该使用更严格的权限设置。

修改用户和用户组

在Linux系统我们可以使用chown指令修改文件或目录所有者和所属组,它的格式是:

chown [选项] 用户名[:组名] 文件或目录

其中,用户名表示要把文件或目录的所有者改为该用户,组名表示要把文件或目录的所属组改为该组。如果省略组名,表示只修改所有者,不修改所属组。如果用户名和组名都省略,表示不修改所有者和所属组。

举个例子:

chown link 06.SystemUI功能与源码结构分析.pptx 

把《06.SystemUI功能与源码结构分析.pptx》这个文件的所有者改为link用户,不修改所属组。

chown link:root 06.SystemUI功能与源码结构分析.pptx 

把《06.SystemUI功能与源码结构分析.pptx》这个文件的所有者改为link用户,所属组改为root组。

chown :root 06.SystemUI功能与源码结构分析.pptx 

把《06.SystemUI功能与源码结构分析.pptx》这个文件的所属组改为root组,不修改所有者。

chown命令的作用是改变文件或目录的归属关系,从而影响到文件或目录的访问权限。一般来说,只有文件或目录的所有者或者root用户才能使用chown命令。


Android UID 概念

在介绍Android多用户之前,我们还需要把Android系统中UID的概念搞清楚,因为在日常口语交流中,我们经常会把Android系统的多用户模式和Android UID中的用户搞混。

Android应用程序的UID是指用户标识符,承袭自Linux的UID体系。它是Android在安装应用程序时分配给每个应用程序的一个唯一的数字。UID在应用程序不重新安装的情况下保持不变。

UID对每个应用程序是唯一的,除非应用程序明确请求与另一个应用程序共享一个用户标识符,可以在AndroidManifest.xml中使用sharedUserId标签设定。但是两个应用程序必须用相同的签名。

<!-- 共享System标识符 -->
android:sharedUserId="android.uid.system"

如果我们想要查找某个应用程序的UID,至少有以下两种方法:

  1. adb shell dumpsys package [package-name] | grep userId

在终端中执行下面的指令查看SystemUI的userId。

  1. 查看/data/system/packages.xml文件(需要root权限)

/data/system/packages.xml 存储了系统中已安装的应用程序的详细信息,比如包名、用户标识符、权限、版本、签名等。这个文件由PackageManager服务管理,它会在应用程序安装、更新或卸载时更新这个文件。这个文件对于系统的正常运行和应用程序的状态维护非常重要,因此它的访问权限受到严格的限制,只有系统应用程序才能读写这个文件。

每个已安装的应用程序都会有一个条目在那里。如果packages . xml显示乱码,需要先执行adb shell setprop persist.sys.binary_xml false再重启设备即可。

例如,SystemUI它的条目如下,sharedUserId="10141"就是SystemUI的userId。

<package name="com.android.systemui" codePath="/system_ext/priv-app/SystemUIGoogle" nativeLibraryPath="/system_ext/priv-app/SystemUIGoogle/lib" primaryCpuAbi="x86_64" publicFlags="541638157" privateFlags="-1930424216" ft="185ea7e39b8" ut="185ea7e39b8" version="33" sharedUserId="10141" packageSource="0" isOrphaned="true" loadingProgress="1.0" domainSetId="9c94bf40-3aa4-4763-9c0a-54626d70db90">
    <sigs count="1" schemeVersion="3">
        <cert index="6" />
    </sigs>
    <proper-signing-keyset identifier="2" />
</package>

再比如,Settings的它的条目如下,可以看出系统设置的userId=1000。

<package name="com.android.settings" codePath="/system_ext/priv-app/SettingsGoogle" nativeLibraryPath="/system_ext/priv-app/SettingsGoogle/lib" primaryCpuAbi="x86_64" publicFlags="944356933" privateFlags="-1938812568" ft="185ea799250" ut="185ea799250" version="33" sharedUserId="1000" packageSource="0" isOrphaned="true" loadingProgress="1.0" domainSetId="835bfdc5-ce0c-4635-8cec-746f2b76059d">
    <sigs count="1" schemeVersion="3">
        <cert index="6" />
    </sigs>
    <proper-signing-keyset identifier="2" />
</package>

Android系统在linux用户的基础上扩展了很多具有特殊权限的用户,一些常见的系统应用或者服务的userid如下:

  • system:uid=1000,这是一个特殊的用户,用于运行系统级别的进程,类似于Linux中的root用户。它拥有很高的权限,可以访问和修改系统设置和文件。
  • radio:uid=1001,这是一个用于运行电话、短信、数据等通信相关的进程的用户。它拥有访问网络和发送短信等权限。
  • bluetooth:uid=1002,这是一个用于运行蓝牙相关的进程的用户。它拥有访问蓝牙设备和设置等权限。
  • media:uid=1013,这是一个用于运行媒体相关的进程的用户。它拥有访问音频、视频、图片等媒体资源等权限。
  • sdcard_rw:uid=1019,这是一个用于运行SD卡相关的进程的用户。它拥有读写SD卡上的文件等权限。

在Android系统中,具有特殊权限的应用的userid是在系统编译时分配,userId从1000开始分配,而普通些常见的系统应用或者服务的userid是在应用安装时分配的,userId从10000开始分配。

注意:SystemUI的AndroidManifest.xml中android:sharedUserId是"android.uid.systemui"而不是"android.uid.system" ,所以SystemUI的userid是从10000开始计数。

系统设置的android:sharedUserId="android.uid.system"所以它的userid会固定是1000。

有经验的同学可能会有一个疑问,当我们在开发时,在控制台执行adb shell ps -A|grep systemui出现第一端标识符是什么含义?

这个u0_a141 表示该应用是机主用户(也称 系统用户userId=U0)下面的应用,id是 141,普通应用程序的UID 都是从 10000开始的,所以我们可以计算出SystemUI的 UID 就是 10141。而这里提到的机主用户就是本系列文章将会重点介绍的Android多用户模式中一种重要的用户!机主用户的userID和应用的userID共同组成了当前进程的用户标识符

Android 多用户

Android 多用户是一种系统功能,可以让一台 Android 设备上添加多个用户,每个用户都有自己的应用数据和设置。这样,不同的人可以在同一台设备上使用不同的帐号和应用,互不干扰。

在原生的Android系统中可以按照【系统设置】->【系统】->【多用户】的步骤开启多用户功能。如图所示:

仔细观察的话,会发现两个用户Launcher显示的壁纸并不相同,这是因为,不同用户之间用户空间不同应用数据也并不共享。如果我们在新用户中安装一个应用,机主用户也是无法看到的。

在控制台中执行ps -A|grep launcherps -A|grep systemui

可以看到当前系统中分别存在两个launcher和systemui进程,而这两进程最大区别就是进程的用户名不同,分别是u0_a138u10_a138U0系统用户U10次要用户

Android 用户类别

Android 设备管理使用以下用户类别。

  • 系统用户:添加到设备的第一个用户。除非恢复出厂设置,否则无法移除系统用户;此外,即使其他用户在前台运行,系统用户也会始终处于运行状态。该用户还拥有特殊权限以及只有自己可以调整的设置。
  • 次要用户:除系统用户之外添加到设备的任何用户。次要用户可以移除(由次要用户自行移除或由管理员用户移除),且不会影响设备上的其他用户。此类用户可以在后台运行,在后台运行时可以继续连接到网络。
  • 访客用户:临时的次要用户。访客用户设置中有明确的删除选项,当访客用户不再有用时,可快速将其删除。一次只能有一个访客用户。

  • 管理员用户:有权创建和移除其他用户以及控制一些常规多用户设置的用户。默认情况下,只有系统用户属于管理员用户

在拥有的权限上,系统用户>管理员用户>非管理员用户(次要用户)>访客用户。其中系统用户的默认userid为0,此后新创建的userid从10开始依次累加。

注意:当系统切换到新用户时,系统用户的应用进程会一直运行在后台,但是当切换到系统用户时,所有非系统用户都会休眠。

Android 用户空间

在同一台设备上创建多个用户账户时,每个用户都有自己的应用、数据和设置。这样可以保护用户的隐私,也可以方便不同的使用场景。不同用户间,有着不同应用和数据的原理是基于Linux的用户和权限机制,以及Android的沙箱机制。不同用户安装的应用apk会存放在/data/app/目录下,被不同的用户共用,当一个用户更新应用时,另一个用户下的apk也会被同步更新。

每个用户都有一个唯一的用户名,每个应用也有一个唯一的用户ID。每个用户都有自己的存储空间,每个应用都有自己的数据目录。系统会根据UID来区分和隔离不同用户和应用的数据,只有拥有相应权限的用户或应用才能访问或修改数据。

例如,假设设备上有两个用户机主用户新用户,每个用户都安装了一个相同的应用Launcher。那么,Launcher在每个用户下都会有一个不同的UID,比如U0_a和U10_a。Launcher在每个用户下也会有一个不同的数据目录,内置存储路径是:/data/user/{userid},外置空间路径是:/storage/emulated/{userid}。

系统会保证只有U0才能访问/data/user/0/launcher,只有U10才能访问/data/user/10/launcher,而其他用户都不能访问这些目录。

总结

本篇介绍了从linux用户、权限到Android多用户的基础知识和概念,Android Automotive中的多用户以及实现原理将在下一篇介绍,如何构建可感知多用户的车载应用,这会在第三篇着重讲解。

好了,感谢你的阅读,希望对你有所帮助。

参考资料:

https://source.android.com/docs/security/app-sandbox?hl=zh-cn

https://source.android.com/docs/devices/automotive/users_accounts/multi_user?hl=zh_cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/744310.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux中Makefile详细教程

目录 Makefile Makefile的介绍 Makefile简单的编写 .PHONY 问题&#xff1a; 如果只执行make&#xff0c;它执行的是Makefile里哪一段语句呢&#xff1f; 怎么知道我的可执行程序是最新的呢&#xff1f; Makefile编译多个文件 进度条小程序 Makefile Makefile的介绍 …

Acwing.860 染色法判定二分图(二分图染色法)

题目 给定一个n个点m条边的无向图&#xff0c;图中可能存在重边和自环。 请你判断这个图是否是二分图。 输入格式 第一行包含两个整数n和m。 接下来m行&#xff0c;每行包含两个整数u和v&#xff0c;表示点u和点v之间存在一条边。 输出格式 如果给定图是二分图&#xff0c…

openpnp - 汇川 Inovance IS620PS2R8I-IAB-C的参数读取

文章目录 openpnp - 汇川 Inovance IS620PS2R8I-IAB-C的参数读取概述笔记伺服和配套电机型号官方伺服调试软件笔记H00H01H02H03H04H05H06H07H08H09H0AH0BH0CH0DH0FH11H12H16H17H30H31自定义组备注END openpnp - 汇川 Inovance IS620PS2R8I-IAB-C的参数读取 概述 设备中用到了…

Enterprise:使用 MySQL connector 同步 MySQL 数据到 Elasticsearch

Elastic MySQL 连接器是 MySQL 数据源的连接器。它可以帮我们把 MySQL 里的数据同步到 Elasticsearch 中去。在今天的文章里&#xff0c;我来详细地描述如何一步一步地实现。 在下面的展示中&#xff0c;我将使用 Elastic Stack 8.8.2 来进行展示。 无缝集成&#xff1a;将 Ela…

两只小企鹅(Python实现)

目录 1 和她浪漫的昨天 2 未来的旖旎风景 3 Python完整代码 1 和她浪漫的昨天 是的,春天需要你。经常会有一颗星等着你抬头去看&#xff1b; 和她一起吹晚风吗﹖在春天的柏油路夏日的桥头秋季的公园寒冬的阳台&#xff1b; 这世界不停开花&#xff0c;我想放进你心里一朵&#…

docker 里面各种 command not found 总结

一、ip&#xff1a;command not found 执行命令&#xff1a; apt-get update & apt-get install -y iproute2 二、yum&#xff1a;command not found 执行命令&#xff1a; apt-get update & apt-get install -y yum 三、ping&#xff1a;command not found 执行命…

113、基于51单片机的智能电子密码锁控制系统设计(程序+原理图+PCB源文件+Proteus仿真+参考论文+开题报告+设计资料+焊接指导书+元器件清单等)

摘 要 在日常的生活和工作中, 住宅与部门的安全防范、单位的文件档案、财务报表以及一些个人资料的保存多以加锁的办法来解决。具有防盗报警等功能的电子密码锁代替密码量少、安全性差的机械式密码锁已是必然趋势。随着科学技术的不断发展&#xff0c;人们对日常生活中的安全保…

多元融合:流媒体传输网络的全盘解法

我们在寻找「网络」的全盘解法。 音视频数字化在消费领域的红利俨然见顶&#xff0c;而产业级视频应用激活了更多场景下的业务模式。与此同时&#xff0c;音视频客户也从单一的业务需求&#xff0c;趋向于多种业务并行存在的需求。 固有的网络能满足新兴的业态吗&#xff1f;延…

帧同步实现PuppetMaster布娃娃系统的问题

1&#xff09;帧同步实现PuppetMaster布娃娃系统的问题 ​2&#xff09;如何屏蔽Unity打包在IQOO安卓手机上出现一侧是黑边的现象 3&#xff09;SLG或者策略游戏的联盟边界线是如何实现的 这是第343篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖…

Acwing算法基础 前缀和与差分

前缀和与差分 AcWing 795. 前缀和 import java.util.*; public class Main{public static void main(String[] args ){Scanner scnew Scanner(System.in);int nsc.nextInt();int msc.nextInt();int[] arrnew int[n1];arr[0]0;for(int i1;i<n;i) {arr[i]sc.nextInt()arr[i-1…

基于Java+Swing实现表白墙的效果

JavaSwingmysql员工工资管理系统 一、系统介绍二、功能展示1.效果展示 三、系统实现1.salary.java 四、其它系统五、获取源码 一、系统介绍 使用javaswing桌面编程技术实现的一个表白墙的效果 二、功能展示 1.效果展示 基于javaswing表白墙的效果 三、系统实现 1.salary.ja…

Python实现AdaBoost回归模型(AdaBoostRegressor算法)并应用网格搜索算法调优项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档代码讲解&#xff09;&#xff0c;如需数据代码文档代码讲解可以直接到文章最后获取。 1.项目背景 AdaBoost算法&#xff08;Adaptive Boosting&#xff09;是一种有效而实用的Boosting算法&#xff0c;…

C++ | 反向迭代器

目录 前言 一、基本框架 二、起始位置和结束位置 三、反向迭代器的自增与自减 四、反向迭代器的判断 五、list类的修改 六、单独设计反向迭代器类的意义 前言 反向迭代器实际上与我们前面的stack、queue、priority一样&#xff0c;都是适配器&#xff1b;我们可以通过正向…

国网技术学院MySQL课堂练习

一、数据库的安装和配置 在虚拟机中安装WINDOWS7操作系统 正常安装&#xff0c;查询安装教程即可安装必备组件和MYSQL5.7数据库 正常安装&#xff0c;查询安装教程即可修改my.ini配置文件中关于character_set的相关设置 直接补下面的代码即可&#xff0c;作用为设置默认的内…

Hudi基础知识讲解

Hudi概述 Hudi是一种数据湖的存储格式&#xff0c;在Hadoop文件系统之上提供了更新数据和删除数据的能力以及消费变化数据的能力。支持多种计算引擎&#xff0c;提供IUD接口&#xff0c;在 HDFS的数据集上提供了插入更新和增量拉取的流原语。 基础架构图 Hudi特性 ACID事务能…

将一个数组对象里的属性值全部追加到另外一个数组的对象里

介绍 将一个数组对象里的属性值全部追加到另外一个数组的对象里&#xff0c;这里需要使用到 map 遍历&#xff0c;循环数组&#xff0c;依次处理元素&#xff0c;实现重组数组对象 tips&#xff1a; map() 不会对空数组进行检测。 map() 不会改变原始数组。 Object.assign(),…

RocketMQ5.0消息存储<二>_消息存储流程

RocketMQ5.0消息存储<二>_消息存储流程 一、消息存储概览 如下图所示,是消息从生产者发送消息到消费者消费消息的大致流程。 step1:生产者发送消息到消息存储Broker端; step2:单一文件Commitlog存储所有主题消息,确保顺序写入,提高吞吐量; step3:消息通过堆外缓存,…

YOLOv5解析 | 第五篇:yolo.py文件解读

一、前言 文件位置:**./models/yolo.py** 这个文件是YOLOv5网络模型的搭建文件,如果你想改进YOLOv5,那么这么文件是你必须进行修改的文件之一。文件内容看起来多,其实真正有用的代码不多的,重点理解好我文中提到的一个函数两个类即可。 注:由于YOLOv5版本众多,同一个文件…

Nacos详解

Nacos详解 注册中心常见的注册中心ZookeeperEurekaConsulNacos Nacos 注册中心Docker安装&#xff1a;使用&#xff1a;1、引入 Maven&#xff1a;2、添加注解3、配置Nacos其他使用&#xff1a; Nacos 配置中心统一配置管理添加配置文件从微服务拉取配置依赖 Maven&#xff1a;…

工业大数据的来源是什么?有什么用?和工业互联网有关系么?

工业大数据的来源因特定行业和企业而不尽相同。常见的数据来源包括&#xff1a; 1.传感器数据&#xff1a;工业系统和设备通常配备传感器&#xff0c;用于收集温度、压力、湿度、振动等各种参数的数据。 2.机器生成的数据&#xff1a;包括机器和工业设备在运行过程中产生的数…