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

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指令,输出的成果如下:

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

  • -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 》这个文件权限,已经被成功修正了。

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

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。

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

  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出现榜首端标识符是什么意义?

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

这个u0_a141 表明该运用是机主用户(也称 体系用户userId=U0)下面的运用,id是 141,一般运用程序的UID 都是从 10000开端的,所以咱们能够核算出SystemUI的 UID 便是 10141。而这儿提到的机主用户便是本系列文章将会要点介绍的Android多用户形式中一种重要的用户!机主用户的userID和运用的userID共同组成了当前进程的用户标识符

Android 多用户

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

在原生的Android体系中能够按照【体系设置】->【体系】->【多用户】的过程敞开多用户功用。如图所示:

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

仔细观察的话,会发现两个用户Launcher显示的壁纸并不相同,这是由于,不同用户之间用户空间不同运用数据也并不同享。假如咱们在新用户中装置一个运用,机主用户也是无法看到的。

在操控台中履行ps -A|grep launcherps -A|grep systemui

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

能够看到当前体系中别离存在两个launcher和systemui进程,而这两进程最大差异便是进程的用户名不同,别离是u0_a138u10_a138U0体系用户U10非必须用户

Android 用户类别

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

  • 体系用户:添加到设备的榜首个用户。除非康复出厂设置,不然无法移除体系用户;此外,即使其他用户在前台运转,体系用户也会一直处于运转状况。该用户还具有特别权限以及只要自己能够调整的设置。
  • 非必须用户:除体系用户之外添加到设备的任何用户。非必须用户能够移除(由非必须用户自行移除或由管理员用户移除),且不会影响设备上的其他用户。此类用户能够在后台运转,在后台运转时能够持续连接到网络。
  • 访客用户:临时的非必须用户。访客用户设置中有清晰的删去选项,当访客用户不再有用时,可快速将其删去。一次只能有一个访客用户。

【车载Android】多用户(一) - Linux用户与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}。

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

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

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

总结

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

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

参考资料:

source.android.com/docs/securi…

source.android.com/docs/device…