车机多用户系统的适配问题

多用户问题出现背景

记录一下多用户的适配问题:

背景是system/app下面新push了两个apk,一个是我们的业务场景apk一个是虚拟车CarService服务的apk,我们的apk需要链接CarService服务通过AIDL通信。

下面这两张图是未roo的情况(当前车机用户是user14,虚拟车的userid是0): 找不到虚拟车,日志中虚拟车一直在crash:ServiceManager.addService校验未通过

image.png

image.png

接下来开启root后的日志是:

image.png

很神奇吧,这篇文章就是来讲为什么开启Root后可以正常通信的:

我们以往使用的车技都是单用户,因此不存在不同用户不共享数据的问题;但是最近新来了一个项目使用的车机是多用户系统,有关多用户我总结了一些信息,大家可以看下下面的陈述:

多用户的有关系统知识

1.多用户状态下用户新建过程是system/app目录共享只是进行了修改参数(其userid默认为0),data/app目录进行重新安装(其userid是安装时候决定的,多用户下安装也是如此)

2.四大组件启动需要指定对应接受到的用户(默认系统当前用户)

3.systemServer的Binder通信中会携带UserId,如果当前UserId中没有该项服务则找不到对应Binder(因为当前用户为10,但是systemapp下的用户是0需root后才可通信)

4.多开采用的就是这种多用户的方式,uid只要不同就行(userid*10000+appid)。appid是一样的,但是userid不一样所以uid不一样,就可以进行多开。但是不同用户是怎么通信的呢?

5.app读取存储sd卡路径和app私有目录时其实都会软连接到对应的user目录的分区下。

因此多用户切换本质上来说就是将data/app的存储读取信息换了一个目录;对于系统app来说只是修改了些参数,改变了系统的某些属性;对于servicemanager来说是切换到了另外一个用户使用的binder线程池(这也是为什么root后虚拟车就可以添加到servicemanager中的原因)

6.因此我们使用多用户的时候需要考虑的一个点就是怎么能让我们的app和系统app通信,这是两个不同的用户。 车机启动默认是userid10,但是system下面的app是user0.通信的前提是当前车机用户下app的binder线程池中得有系统服务的binder. 这就导致冲突了 车机用户是10系统用户确实0后面讲解如何解决

7.系统是可以限制的,可以限制对应APP必须所属的userid。(这也是这篇文章重点要讲的知识因为这个知识点就是我们的解决方案)

多用户导致的问题是什么和为什么

第一个问题是我们的进程再绑定Service的时候一直在重连

车机启动系统默认的用户是user10,而我们需要链接的服务却是在user0下,即使我们的APK和虚拟车都是user0也连接不上,根据上面罗列出来的第三点可知:

我们需要链接的Binder中是绑定的当前系统用户也就是user10,所以在进行使用服务的时候报了一个找不到Service的异常。因为这个服务压根就不在user10下,他是在user0下的,自然链接失败。

第二个问题是虚拟车一直在报ServiceManager.addService的验证不通过异常

这个也很好理解,在进行添加系统服务时ServiceManager会验证当前系统用户和对应需要添加的Service所属用户是否一致,如果不一致(也就找不到)则不让添加。

问题该如何解决?

这里对上面第六个知识点中提出的问题进行解答:

最简单的方式就是切换ROOT用户,使用adb root切换到系统用户user0下就可以正常链接服务,而且虚拟车也可以正常添加到ServiceManager中了

原因就是user0下的 servicemanager可以检索到这个虚拟车服务了。

切换用户后记得要杀一下进程,切换用户的过程AMS虽说杀死进程但是数据依然会保留,使用的还是user10的数据

但是问题绝不可能这么简单的就带过了,测试同学需要测试的时候必须手动root这个还好,如果是用户呢?用户可不能root,所以还得找其他解决方案,庆幸的是在今天下午我发现了一个特别怪异的现象:

一个特别怪的突破点

我们部门的另外一位同事,他的APP同样也是在system/app下面的,userid却始终是user10。我就有疑问了:system/app下面的不应该都是user0吗?怎么可能他的是10,后来和他们的leader聊了下发现他们的APP是提前和ROM那边沟通好的,可以限制他们的userid,所以他们的userid一直是10

问题解决~

因此我们和虚拟车的沟通也就有了解决方案,没错:就是告知ROM厂商限制虚拟车的userid为10,这样我们的app就可以在系统默认启动的user10用户下正常连接服务虚拟车服务也可以在user10下添加到SystemServer中

解决之后带来的后遗症

问题是解决了,但是有一个很严重的后遗症困扰着我:

先把结论放出来:上面被ROM限制userid10后的APP1他拉起的也只能是userid10的进程

同样是system/app没有限制userid为什么他是userid10

疑问点出来了:另外一个也是system下面的进程APP2他虽然没有被ROM限制userid,但是他的userid却也是10,这是为什么呢???唯一的不同是这个APP2会被APP1再次拉起

知道这个唯一的不同后,排除所有的常量,唯一的变量就是这个APP1的userid。或者更宽泛一点说你的app是哪个userid那么你拉起的进程也就是哪个userid

因为不同用户是隔离的,如果他是user10的APP的话那么他也就只能拉起user10的APP了。这个后遗症是之后我一直琢磨不明白的地方,到这里我才豁然开朗,接下来给一总结知识点结束这篇文章:

上面的知识点中忘记提到了一个重要的点:

APP1拉起另外一个APP2时,这个拉起的APP2的userid是多少呢?

答案是和系统当前用户无关,不同用户之间是隔离的,APP2的userid和APP1的userid是一样的。

也就是说不同用户下的同一个APP1如果要和另外一个APP2通信的话那么他是否拉起另外一个APP2的依据是判断APP1的userid下是否有APP2的进程如果有就不需要拉起,如果没有就需要重新创建进程。

举个具体的例子:

系统默认用户还是user10,我们的进程userid是0(system/app下)。一个userid为10的APP需要拉起我们的进程,他会判断这个APP的usreid发现是10,然后检索userid10下面发现并没有我们的进程,所以他会再次拉起一个userid为10的我们的进程

此时我们的进程是有两个的,一个是系统默认启动的user0,一个是被userid10进程拉起来的。

参考链接

这篇文章讲的是多用户的适配

这篇文章讲的是应用分身

基础知识:

(主要是介绍了userid,uid和appid的区别)

  1. blog.csdn.net/qq_34888036…
  2. www.yht7.com/news/156702

多用户下进程的保留与重建:

(这两篇文章还是主要看多用户的切换创建删除流程比较好,基础点讲的没有第一个链接好)

1. 深入理解Android系统多用户_多用户下environment.get_ulangch的博客-CSDN博客  ​​​​​​​

2.  Android--多用户模式_disallow_cross_profile_copy_paste_我是普通人的博客-CSDN博客

本文转载于:车机多用户系统的适配问题 - 掘金 (juejin.cn)

主页链接:北洋 的个人主页 - 文章 - 掘金 (juejin.cn)

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

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

相关文章

Python之Xlwings操作excel

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、xlwings简介二、安装与使用1.安装2.使用3.xlwings结构说明 二、xlwings对App常见的操作App基础操作工作簿的基础操作工作表的基础操作工作表其他操作 读取单元格…

JDK常用诊断工具

工具描述javapJava 反编译工具,主要用于根据 Java 字节码文件反汇编为 Java 源代码文件jcmdJava 命令行(Java Command),用于向正在运行的 JVM 发送诊断命令请求jconsole图形化用户界面的监测工具,主要用于监测并显示运行于 Java 平台上的应用程序的性能和资源占用等信息jdeps用…

移动端调试工具vConsole

安利一款好用的移动端调试工具vConsole vConsole 是腾讯推出的一个轻量、可拓展、针对手机网页的前端开发者调试面板。 官网:https://alloyteam.github.io/AlloyLever/ 特性 查看 console 日志查看网络请求查看页面 element 结构查看 Cookies、localStorage 和 SessionStor…

MOV导出序列帧并在Unity中播放

MOV导出序列帧并在Unity中播放 前言项目将MOV变成序列帧使用TexturePacker打成一个图集将Json格式精灵表转换为tpsheet格式精灵表导入Unity并播放总结 鸣谢 前言 收集到一批还不错的MG动画,想要在Unity中当特效播放出来,那首先就得把MOV变成序列帧&…

堆排序与TopK问题

一、堆排序 堆排序(升序):堆排序的思想就是先用数组模拟建大堆,然后把根结点与最后一个结点值交换,最后一个结点的值就是最大值,然后再把前(n-1)个元素重新建大堆,然后根结点与最后一个结点值交换,就找出了…

小红书笔记爬虫

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ 🐴作者:秋无之地 🐴简介:CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作,主要擅长领域有:爬虫、后端、大数据…

LNMP架构搭建论坛

目录 一、LNMP简介: 二、LNMP搭建: 1.前提准备: 关闭防火墙和安全机制: 2.编译安装nginx: 3.编译安装mysql: 3.1 安装依赖环境: 3.2 创建mysql运行用户: 3.3 编译安装&#xff1a…

c语言练习题52:写一个函数判断当前机器是大端还是小端

代码&#xff1a; #include<stdio.h> int check_sys() {int a 1;return *(char*)&a;//小端retrun 1 大端return 0&#xff1b; } int main() {if (check_sys() 1) {printf("小端\n");}elseprintf("大端\n"); } 这里首先取a的地址&#xff0c…

docker部署nginx总结和踩坑

部署脚本 docker run --name nginx -v C://docker/nginx/nginx.conf:/etc/nginx/nginx.conf -v C://docker/nginx/conf.d/:/etc/nginx/conf.d/ -v C://docker/nginx/html:/usr/share/nginx/html -p 80:80 -d nginx前提 需要创建目录 C://docker/nginx/ 准备3个文件 C://docke…

js面试题(更新中...)

js面试题&#xff08;更新中...&#xff09; 1.js类型及检测方式JS内置类型数据类型检验 1.js类型及检测方式 JS内置类型 原始数据类型&#xff1a;基础类型存储在栈内存&#xff0c;被引用或拷贝时&#xff0c;会创建一个完全相等的变量&#xff1b;占据空间小、大小固定&am…

原型链(一定要搞懂啊!!!>-<)

一、概念 1、prototype 习惯称作“显示原型”&#xff0c;只有构造函数才有的属性。 2、构造函数 能用new关键字创建的对象叫做构造函数 3、__proto__ 习惯称作“隐式原型”&#xff0c;每一个实例都有的属性&#xff0c;该属性指向他构造函数的“显示原型”。Function对象…

2.14 PE结构:地址之间的转换

在可执行文件PE文件结构中&#xff0c;通常我们需要用到地址转换相关知识&#xff0c;PE文件针对地址的规范有三种&#xff0c;其中就包括了VA&#xff0c;RVA&#xff0c;FOA三种&#xff0c;这三种该地址之间的灵活转换也是非常有用的&#xff0c;本节将介绍这些地址范围如何…

如何实现Spring的事务管理功能:@Transactional声明式事务

在Spring MVC中处理SQL事务&#xff0c;可以使用Spring的事务管理功能来实现。Spring提供了多种配置和编程方式来管理事务&#xff0c;以下是一种常见的基于注解的方法来处理SQL事务&#xff1a; 1. 配置数据源和事务管理器&#xff1a;首先&#xff0c;您需要配置数据源和事务…

Mac端交互式原型设计 Axure RP 8 for Mac汉化

Axure RP 8是一款专业的交互原型设计工具&#xff0c;它被广泛应用于用户体验设计、界面设计和产品原型制作等领域。该软件提供了丰富的功能和工具&#xff0c;使用户能够创建出具有高度交互性和可视化效果的原型。 Axure RP 8的主要特点和功能包括&#xff1a; 1. 快速原型&a…

产教融合 | 力软联合重庆科技学院开展低代码应用开发培训

近日&#xff0c;力软与重庆科技学院联合推出了为期两周的低代码应用开发培训课程&#xff0c;来自重庆科技学院相关专业的近百名师生参加了此次培训。 融合研学与实践&#xff0c;方能成为当代数字英才。本次培训全程采用线下模式&#xff0c;以“力软低代码平台”为软件开发…

光谱通用款积分球

随着惯性约束聚变&#xff08;ICF&#xff09;物理理论的不断发展以及精密物理实验要求的不断提高&#xff0c;激光驱动器的光束路数急剧增多&#xff0c;光路长度和元器件数目成倍增长。模块化是新一代激光驱动器的发展趋势。对于高功率激光多参数测量系统&#xff0c;模块化设…

《DevOps实践指南》- 读书笔记(五)

DevOps实践指南 Part 4 第二步 &#xff1a;反馈的技术实践14. 建立能发现并解决问题的遥测系统14.1 建设集中式监控架构14.2 建立生产环境的应用程序日志遥测14.3 使用遥测指导问题的解决14.4 将建立生产遥测融入日常工作14.5 建立自助访问的遥测和信息辐射器14.6 发现和填补遥…

Java+Swing形成GUI图像界面

一、Swing 简介 Swing 主要用来开发 GUI 程序,GUI(Graphical User Interface)即图形用户界面。Java 中针对 GUI 设计提供了丰富的类库,这些类分别位于 java.awt 和 java.swing 中,简称 AWT 和 Swing ;其中,AWT(Abstract Window Toolkit)是抽象窗口工具包,是 Java 平…

【视觉SLAM入门】7.4.后端优化 --- 基于位姿图和基于因子图

"议论平恕&#xff0c;无所向背” 1. 位姿图1.1 具体做法1.2 小结 2. 因子图2.1 具体做法2.1.1 贝叶斯网络2.1.2 因子图2.1.3 更具体的因子图2.1.4 增量的求解方法 引入&#xff1a; 上节BA将位姿和路标都作为优化的节点&#xff0c;H矩阵也告诉我们路标远大于位姿&#…

Python绘图系统16:动态更新tkinter组件

文章目录 前情提要源代码模式输入序列源码 Python绘图系统&#xff1a; &#x1f4c8;从0开始的3D绘图系统&#x1f4c9;一套3D坐标&#xff0c;多个函数&#x1f4ca;散点图、极坐标和子图自定义控件&#xff1a;极坐标&#x1f4c9;绘图风格&#x1f4c9;风格控件图表类型和…