车载核心服务CarService

一:CarService简介

Google考虑更多是车载的独立性,需要与androidOS分开,有自己的独立性,才好针对车载拓展,还有就是复用性,他自己在一个单独的进程,区别于ams等。AAOS作为车载操作系统, 需要与车辆上其他的子系统互联互通

AAOS定义了,标准的硬件抽象层HAL(Hardware Abstraction Layer)来规范各个子系统与Framework的调用接口,并且通过CarService以及相关的Car API,对上层应用提供标准编程接口

AAOS并没有大刀阔斧的改变Android原有的整体架构, 几乎所有的核心服务(AMS, WMS, PKMS)与手机并无区别,采用的是同一套代源码, 所以我们可以将AAOS 理解为Android OS + Android Automotive Services更为贴切.传统的手机系统加上相关的汽车服务,构成了现在的AAOS, 而其中CarService就是提供汽车相关功能的最主要的模块

车载分层架构

说明

     应用层: app发出控制消息

carservice: carservice通过HIDL(类似aidl实现进层通信)将信息给到HAL Service,HAL Service将消息处理后传递给mcu

         mcu: 行车总大脑

   can总线: 实时消息传递

          ecu: 电子控制单元,具体的执行控件

二:CarService的启动流程

看看CarService源码位置

aosp12\packages\services\Car\service

CarService作为Android Automotive的核心服务,他是在SystemServer中启动的。SystemServer会在StartOtherServices()方法中让SystemServiceManager先通过反射的形式,创建出StartCarServiceHelperService这个对象,并调用其onStart方法, 进入到CarServiceHelperService.java文件中

最终在onStart()方法中启动CarService,并加载jni库为CarService提供必要的API

CarService的onCreate()

主要逻辑:

1:持有mVehicle对象我们才可以与Vehicle HAL层进行通信

Car AIP (客户端) ------> CarService ------> ICarImpl ------> VehicleHal ------> obd can .... 硬件

2:创建ICarImpl对象,并调用init方法,需要通过它才能拿到很多的Service,的IBinder客户端

创建各个核心服务对象,将创建的服务对象依次添加到一个list中保存起来,这里主要是为了方便Service之 间的相互访问。

3:很多的Service添加到ServiceManager中,所以Car API中才可能顺利得到 很多的Service 来使用

4:设定SystemProperty,将CarService设定为创建完成状态,只有包含CarService在内的所有的核心Service都完成初始化,才能结束开机动画并发送开机广播

三:如何使用CarService

使用方法:

步骤1: 通过Car.createCar()方法可以创建出Car的对象。

步骤2:Car.createCar()需要传入ServiceConnection,并在service连接成功后,获取想要的Manager 实例(binder的客户端)

步骤3:构建出Car对象后还需要调用connect()才会连接到CarService上。

步骤1说明

通过getPackageManager().hasSystemFeature(String string)判断系统是否支持特定的模块功能

if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {

Car carApiClient = Car.createCar(context, mCarServiceConnection);

}

步骤2说明

Car.createCar()需要传入ServiceConnection,并在service连接成功后,获取想要的Manager 实例,实现方式如下:

步骤3说明:

carApiClient.connect();

注意:connect()只能调用一次,如果当前已经处于连接状态,再次调用connect()会抛出异常,

client如果没有捕获该异常,则会引起client端程序崩溃(血的教训!)。

Car.java中通过绑定服务CarService成功后onBind方法返回ICarImpl实例,在启动流程中我们知道ICarImpl中已经拥有所有service的binder(stub)

Car.getCarManager()方法,最终调用到stub.asInterface()方法获取到客户端的Binder对象(proxy),缓存到容器方便以后使用。

如下图调用:

这三步是Android9之前的使用方法

Android10后直接使用

Car carClient = Car.createCar(context);

CarHvacManager manager = (CarHvacManager) carClient.getCarManager(Car.HVAC_SERVICE);

四:CarService系列服务介绍

谷歌在CarService中实现了许多与汽车密切相关的服务, 每个汽车服务, 也会有自己对应的客户端。

CarService对象只是获取各个Manager的媒介,它本身并不承担管理传感器.空调等具体的任务,

具体实现需要获取对应的Manager中API和对应服务来实现。

五:汽车服务运用

汽车服务 --- CarPropertyService 介绍

绝大部分与车辆硬件功能相关联的属性,如空调, 车舱功能, 车辆传感器等,都是通过CarPropertyService来读取或者设置的,CarPropertyManager 是CarPropertyService在客户端的代理, 通过CarPropertyManager提供的API,可以设置和获取车辆各个属性的状态;

CarPropertyService同时对应着 CarCabinManager, CarHvacManager,CarInfoManager,CarPropertyManager, CarSensorManager和 CarVendorExtensionManager这六个对象,可以说是一个服务分担多个角色. 所以在Android11时, 谷歌直接推荐使用CarPropertyManager 来对应CarPropertyService

六:编译car api

编译后可以供其他app使用

编译方式1:

1:source build/envsetup.sh

2:lunch sdk_car_x86_64-userdebug

3:make -j16

4:make android.car

编译成功后的jar存放在/out/soong/.intermediates/packages/services/Car/car

lib/android.car/android_common/javac/目录里哦

编译方式2:

make android.car-system-stubs

编译成功后的jar存放在/out/soong/.intermediates/packages/services/Car/car-lib/android.car

system-stubs/android_common/javac/目录里

实际项目中这种模式较为常用

编译方式3:

make android.car-stubs

三合一的方式:derry@ubuntu:~/AOSP12$ make android.car android.car-system-stubs android

car-stubs -j32a

编译成功后的jar存放在/out/soong/.intermediates/packages/services/Car/car-lib/android.car

stubs/android_common/javac/目录里。

编译出的CarLib库仅包含没有被@SystemApi修饰方法,而且方法同样不包含实现细节,是最严格的编

译模式。

此模式下编译出的CarLib甚至已经没有CarDiagnosticManager这个系统API了。

如何引入编译后的库?

参考:Android.bp - OpenGrok cross reference for /packages/apps/Car/Settings/Android.bp

在android.bp文件中加入引用

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

神经网络学习小记录77——深入浅出Self-Attention自注意力机制与Transformer模块

神经网络学习小记录77——深入浅出Self-Attention自注意力机制与Transformer模块 学习前言代码下载Self-Attention自注意力机制详解一、Self-attention结构解析二、Self-attention的矩阵运算三、Multi-Head多头注意力机制 TransformerBlock的构建一、视觉部分的TransformerBloc…

设计模式 代理模式(静态代理 动态代理) 与 Spring Aop源码分析 具体是如何创建Aop代理的

代理模式 代理模式是一种结构型设计模式,它通过创建一个代理对象来控制对真实对象的访问。这种模式可以用于提供额外的功能操作,或者扩展目标对象的功能。 在代理模式中,代理对象与真实对象实现相同的接口,以便在任何地方都可以使…

【Java SE语法篇】8.面向对象三大特征——封装、继承和多态

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 文章目录 1. 封装1.1 封装的概念1.2 为什么封装1.3 封装的实现…

【c/python】用GTK实现一个带菜单的窗口

一、用python 在GTK中创建一个带菜单的窗口,可以通过使用Gtk.MenuBar、Gtk.Menu和Gtk.MenuItem组件来构建菜单。以下是一个基本的例子,展示了如何使用Python的PyGObject库创建一个简单的带菜单栏的GTK窗口。 import gi gi.require_version(Gtk, 3.0) f…

androidkiller的两种异常情况

第一种反编译时异常: Exception in thread “main” org.jf.dexlib2.dexbacked.DexBackedDexFile$NotADexFile: Not a valid dex magic value: cf 77 4c c7 9b 21 01 修改方法: 编辑 AndroidKiller 的 bin/apktool 目录下有一个 apktool.bat 文件 修改成…

SpringCloud:微服务

文章目录 微服务服务架构演变单例架构(集中式架构)分布式架构 微服务SpringCloud 微服务 服务架构演变 单例架构(集中式架构) 单例架构: 将业务的所有功能集中在一个项目中开发,打成一个包部署 优点&…

RK3568笔记八: Display子系统

modetest 是由 libdrm 提供的测试程序,可以查询显示设备的特性,进行基本的显示测试,以及设置显示的模式。 我们可以借助该工具来学习 Linux DRM 应用编程,另外为了深入分析 Rockchip DRM driver,有必要先了解一下这个…

设置了uni.chooseLocation,小程序中打不开

设置了uni.chooseLocation,在小程序打不开,点击没反应,地图显现不出来; 解决方案: 1.Hbuilder——微信开发者工具路径没有配置 打开工具——>设置 2.微信小程序服务端口没有开 解决方法:打开微信开发…

宝塔面板使用phpMyAdmin 502 Bad Gateway

第一步软件商店安装PHP 第二步设置phpMyAdmin,选择PHP版本 – 解决

浅谈电动机监控系统在企业降碳过程中的作用 ——安科瑞 顾烊宇

1.前言 据《2017-2022年中国电力工业产业专项调查及十三五市场商机分析报告》显示,从我国目前全社会用电结构来看,工商业用户耗电量约占 80%,其中电机耗电约占工业用电的 75%,全国总耗电的 60%,是用户终端耗电占比较大…

系列六、Spring Security中的认证 授权 角色继承

一、Spring Security中的认证 & 授权 & 角色继承 1.1、概述 关于Spring Security中的授权,请参考【系列一、认证 & 授权】,这里不再赘述。 1.2、资源类 /*** Author : 一叶浮萍归大海* Date: 2024/1/11 20:58* Description: 测试资源*/ Re…

flutter 打包安卓apk 常用配置

打包之前需要先不配置不然会报错 Execution failed for task ‘:app:mergeReleaseResources’. APP目录下的build.gradleaaptOptions.cruncherEnabled falseaaptOptions.useNewCruncher false如图 配置targetSdkVersion 、minSdkVersion 在android/app/src目录下的build.…

java数据结构与算法:单链表 SinglyLinkedList

单链表 SinglyLinkedList 创建实现类并实现方法 package com.lhs;public class SinglyLinkedList<E> implements List<E>{// 头节点private Node<E> first;// 尾节点private Node<E> last;// 节点数量private int size;public static class Node<…

VMware workstation安装debian-12.1.0虚拟机并配置网络

VMware workstation安装debian-12.1.0虚拟机并配置网络 Debian 是一个完全自由的操作系统&#xff01;Debian 有一个由普罗大众组成的社区&#xff01;该文档适用于在VMware workstation平台安装debian-12.1.0虚拟机。 1.安装准备 1.1安装平台 Windows 11 1.2软件信息 软…

【时事篇-03】20240113棋盘麦粒的问题 (黑白棋盘填入不同色彩文字,2的次方、sum法)

作品展示&#xff1a; 背景需求 棋盘麦粒的每个棋盘格子里有多少麦粒呢&#xff1f;64格一共需要多少麦粒 用Python写一个答案吧 项目:棋盘麦粒The grain problem 2的次方 sum() 作者:阿夏 时间:2024年1月13日19:03在印度有一个古老的传说&#xff1a;舍罕王打算奖赏国际象棋…

强化学习应用(一):基于Q-learning的物流配送路径规划研究(提供Python代码)

一、Q-learning算法简介 Q-learning是一种强化学习算法&#xff0c;用于解决基于马尔可夫决策过程&#xff08;MDP&#xff09;的问题。它通过学习一个值函数来指导智能体在环境中做出决策&#xff0c;以最大化累积奖励。 Q-learning算法的核心思想是使用一个Q值函数来估计每…

大模型实战营Day4 XTuner大模型单卡低成本微调实战

FINETUNE简介 LLM下游应用中&#xff0c;增量预训练和指令跟随是经常会用到的两种微调模式 指令跟随微调 使用场景&#xff1a;让模型学会对话模板&#xff0c;根据人类指令进行对话 训练数据&#xff1a;高质量的对话&#xff0c;问答数据 为什么需要指令微调&#xff1f; 因为…

1222. 密码脱落(dp划分)

题目&#xff1a; 1222. 密码脱落 - AcWing题库 思路&#xff1a; 代码&#xff1a; #include<cstdio> #include<cstring> using namespace std; const int N1010; int f[N][N];//表示以L和R为两端点的字符串的“最长”回文序列长度 char s[N];//存储输入的字符串…

java每日一题——ATM系统编写(答案及编程思路)

前言&#xff1a; 基础语句学完&#xff0c;也可以编写一些像样的程序了&#xff0c;现在要做的是多加练习&#xff0c;巩固下知识点&#xff0c;打好基础&#xff0c;daydayup! 题目&#xff1a;模仿银行ATM系统&#xff0c;可以创建用户&#xff0c;存钱&#xff0c;转账&…

探索商超货架场景目标检测性能,基于YOLOv8【n/s/m/l/x】全系列参数模型开发构建商超货架场景下亨氏米粉食品种类检测识别系统

在前面的系列博文中&#xff0c;我们陆续应用实践开发了很多有趣的项目&#xff0c;但是在密集排布场景下如商超购物场所内货架上货物种类目标检测模型的开发我们则少有涉及&#xff0c;正值周末&#xff0c;本文的主要目的就是想要实践构建这一场景下的目标检测模型&#xff0…