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

news2024/10/6 0:34:09

多用户问题出现背景

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

背景是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.coloradmin.cn/o/1005366.html

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

相关文章

什么是无人机全自动飞行系统?概念、构成、作用深度解析

无人机的工业化应用深入催生出新的痛点,无人机应用飞手培养难、成本高、技术参差不齐,以及应急响应和采集作业价值等没有得到充分释放,由此无人机自动飞行系统、无人机自动机场横空出世,因其无人化、自动化、无人机值守的应用特性…

免费的代码审查工具你知道这几个就够了?新手程序员必读

代码质量关系到一个项目的好坏,一直以来都是程序员和项目经理所关心的事情,在之前代码的检查用于人工或者静态页面,再后来就会用的各种工具来做因为不良的代码不仅会影响代码的可维护性,而且还会在某些情况下影响其性能。此外&…

MYSQL优化——B+树讲解

B-/B树看 MySQL索引结构 B-树 B-树,这里的 B 表示 balance( 平衡的意思),B-树是一种多路自平衡的搜索树.它类似普通的平衡二叉树,不同的一点是B-树允许每个节点有更多的子节点。下图是 B-树的简化图. B-树有如下特点: 所有键值分布在整颗树中; 任何一…

远程双屏电脑的时候有的窗口默认打开在第二块屏幕上,导致无法看到和操作【伸手党福利】

解决方法: 点击看不到的窗口,使之处于激活状态 win 左箭头 或者 win右箭头 Alt空格 按M 按 左箭头 或者 右箭头 就能看到窗口移出来了。

2023-9-12 分组背包问题

题目链接&#xff1a;分组背包问题 #include <iostream> #include <algorithm>using namespace std;const int N 110;int n, m;int v[N][N], w[N][N], s[N]; int f[N];int main() {cin >> n >> m;for(int i 1; i < n; i ){cin >> s[i];for(…

VSCODE 使用技巧

vscode批量去掉代码中空行的方法 1、在vscode中使用ctrl f组合快捷键打开替换窗口. 2、输入下面的正则表达式 ^\s*(?\r?$)\n https://mp.weixin.qq.com/s/ZKV2sZWszxBLNTNLEWhsng

PHP-学习笔记-部署wordpress

这部署wordpress 准备工作wordpress和php的版本需要进行匹配apache和php的匹配一二 php和mysql的匹配msyqlapache 正式使用注意事项 准备工作 wordpress和php的版本需要进行匹配 https://make.wordpress.org/core/handbook/references/php-compatibility-and-wordpress-versio…

Bug管理工具推荐:了解常用Bug管理工具

引言 在软件开发过程中&#xff0c;Bug&#xff08;缺陷&#xff09;是不可避免的。为了高效地跟踪、记录和解决Bug&#xff0c;Bug管理工具成为了软件开发团队的必备利器。这些工具能够帮助团队识别、管理和解决Bug&#xff0c;从而提高软件质量和开发效率。 1、Zoho Project…

ATF(TF-A) SPMC威胁模型-安全检测与评估

安全之安全(security)博客目录导读 ATF(TF-A) 威胁模型汇总 目录 一、简介 二、评估目标 1、数据流图 三、威胁分析 1、信任边界 2、资产 3、威胁代理 4、威胁类型 5、威胁评估 5.1 端点在直接请求/响应调用中模拟发送方或接收方FF-A ID 5.2 篡改端点和SPMC之间的…

Unity-UML类图讲解

例如“动物”矩形框&#xff0c;代表一个类&#xff08;Class)。 类图分三层&#xff0c;第一层显示类的名称&#xff0c;如果是抽象类&#xff0c;则就用斜体显示。 第二层是类的特性&#xff0c;通常就是字段和属性。 第三层是类的操作&#xff0c;通常是方法或行为。 注…

LeetCode(力扣)45. 跳跃游戏 IIPython

LeetCode45. 跳跃游戏 II 题目链接代码 题目链接 https://leetcode.cn/problems/jump-game-ii/description/ 代码 class Solution:def jump(self, nums: List[int]) -> int:if len(nums) 1:return 0curdis 0nextdis 0step 0for i in range(len(nums)):nextdis max(…

Redis缓存魔法:如何轻松提升你的应用性能

Redis&#xff0c;作为一个开源的、内存中的数据结构存储系统&#xff0c;已经成为了许多开发者和企业的首选工具。无论是作为数据库、缓存还是消息代理&#xff0c;Redis都展现出了其强大的性能和灵活性。在本文中&#xff0c;我们将深入探讨Redis的魅力&#xff0c;以及如何有…

爬虫容易进局子?——爬虫的一些内幕

爬虫其实没有你想的那么简单。你是否曾接到过陌生电话&#xff0c;对方不仅知道你的姓名&#xff0c;还了解你的生日、地址等个人信息&#xff1f;这不再是巧合&#xff0c;而是来自于这个黑暗产业链的信息搜集。这些个人信息&#xff0c;从何而来&#xff1f;那不得不说——爬…

TikTok挑战:社交模式对现实友情的冲击

随着社交媒体平台的崛起&#xff0c;我们的社交模式正在经历着前所未有的变革。TikTok&#xff0c;作为最具代表性的短视频分享应用之一&#xff0c;已经深刻地改变了我们的社交方式和互动模式。然而&#xff0c;这种改变并不总是带来积极的影响&#xff0c;特别是当我们思考Ti…

Fast-DDS 服务发现简要概述

阅读本文章需要对DDS基础概念有一些了解&#xff0c;一些内容来自Fast-DDS官方文档&#xff0c;一些是工作中踩过的坑。 1. 服务发现阶段 满足OMG标准的DDS服务发现分为两部分&#xff0c;分别是: PDP(Participant Discovery Protocol 参与者发现协议)&#xff1a;参与者确认…

带裂纹板受拉力状态下的边界位移输出

上边界位移获取思路&#xff1a; 首先获取上边界线&#xff0c;再获取上边界线上的节点&#xff0c;再提取节点的位移&#xff0c;输出成txt文件后导出到MATLAB中绘图 !选择37号线上的所有节点 alls,all lsel,r,,,37 nsll !获取37号线的节点总数&#xff0c;node_num *get,node…

IDEA设置Maven 镜像

第一步&#xff1a;右键项目&#xff0c;选择Maven->Create ‘settings.xml’ 已经存在的话是Open ‘settings.xml’&#xff1a; 第二步&#xff1a;在settings.xml文件中增加阿里云镜像地址&#xff0c;代码如下&#xff1a; <?xml version"1.0" encodin…

FVCOM流域、海洋水环境数值模拟方法及实践教程

详情点击公众号&#xff1a;技术科研吧&#xff0c;链接&#xff1a;FVCOM流域、海洋水环境数值模拟方法及实践教程 一&#xff1a;FVCOM水动力相关理论 1.主流海洋数值模式特点&#xff08;FVCOM、POM、HYCOM等&#xff09; 2.不同坐标系下FVCOM控制方程推导 3.FVCOM有限体积…

flink命令行提交jar包任务

1. 环境准备 1.1 flink环境准备 关于如何安装flink&#xff0c;这个写的非常详细&#xff0c;https://blog.csdn.net/qq_43699958/article/details/132826440 在flink的bin目录启动flink cluster [rootlocalhost bin]# ./start-cluster.sh1.2 Linux环境准备 1.2.1 关闭linu…

flutter国内镜像配置

在windows中添加镜像 打开环境变量 PUB_HOSTED_URLhttps://pub.flutter-io.cn FLUTTER_STORAGE_BASE_URLhttps://storage.flutter-io.cn 为 Flutter 设定镜像配置 如果你在国内使用 Flutter&#xff0c;那么你可能需要找一个与官方同步的可信的镜像站点&#xff0c;帮助你的…