位置: IT常识 - 正文

车机系统开发——Android Automotive(安卓车机系统开发)

编辑:rootadmin
车机系统开发——Android Automotive Android Automotive介绍

推荐整理分享车机系统开发——Android Automotive(安卓车机系统开发),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:车机 开发,车机 开发,车载系统开发流程,车载系统开发,车载系统开发,车机系统原理,车机系统开发流程,车机 开发,内容如对您有帮助,希望把文章链接给更多的朋友!

Android Automotive是⼀个基本的Android平台,它运⾏预安装的(车载信息娱乐)IVI系统,Android应⽤程序以及可选的第⼆⽅和第三⽅Android应⽤程序。

Android Automotive的硬件抽象层(HAL)为Android框架提供了一致的接口(无需考虑物理传输层)。此车载HAL是开发Android Automotive实现的接口。

系统集成商可以将特定于功能的平台HAL接口(如HVAC)与特定于技术的网络接口(如 CAN 总线)连接,以实现车载 HAL 模块。典型的实现可能包括运行专有实时操作系统(RTOS)的专用微控制器单元 (MCU),该微控制器单元用于CAN总线访问或类似操作,可通过串行链路连接到运行Android Automotive的CPU。

AutoMotive整体架构

系统应用层

Android Automotive 为系统定制了一些专门适用车载系统的应用,以代替传统的手机应用模块。

系统应用层的Application都位于源码目录下:packages/apps/Car/

包含的应用如下

系统框架层

系统框架层提供了多个模块,来对Android Automotive 进行支持,最重要的有一个服务CarService (com.android.car) 。

系统框架层的模块都位于源码目录下:packages/services/Car/

CarService是一个类似Android系统中SystemSever的服务。它由一个服务启动,而里面又控制着数十个子模块服务。

CarService

CarService中CarService只作为服务的入口,具体的业务逻辑都在内部的子服务中处理,CarService的子服务如下。

CarService启动

CarService本质上是一个特殊的APP,它编译后生成CarService.apk;在系统中,它是在/system/priv-app/CarService/CarService.apk

CarService在启动启动时,由SystemServer拉起

代码:frameworks/base/services/java/com/android/server/SystemServer.java

private static final String CAR_SERVICE_HELPER_SERVICE_CLASS = "com.android.internal.car.CarServiceHelperService";private void startOtherServices() { mActivityManagerService.systemReady(() -> { if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) { traceBeginAndSlog("StartCarServiceHelperService"); mSystemServiceManager.startService(CAR_SERVICE_HELPER_SERVICE_CLASS); traceEnd(); } });}

代码:frameworks/opt/car/services/src/com/android/internal/car/CarServiceHelperService.java

private static final String CAR_SERVICE_INTERFACE = "android.car.ICar";public class CarServiceHelperService extends SystemService {​ @Override public void onStart() { Intent intent = new Intent(); intent.setPackage("com.android.car"); intent.setAction(CAR_SERVICE_INTERFACE); if (!getContext().bindServiceAsUser(intent, mCarServiceConnection, Context.BIND_AUTO_CREATE, UserHandle.SYSTEM)) { Slog.wtf(TAG, "cannot start car service"); } System.loadLibrary("car-framework-service-jni"); }} SystemServer中ActivityManagerService.systemReady后会通过SystemServiceManager启动CarServiceHelperServiceCarServiceHelperService中绑定CarService 代码:packages/services/Car/service/AndroidManifest.xml<service android:name=".CarService" android:singleUser="true"> <intent-filter> <action android:name="android.car.ICar" /> </intent-filter></service>

通过在CarService的AndroidManifest的配置,CarServiceHelperService可以通过包名和action的名称实现和CarService绑定。

Car API

Car API 是Android系统为汽车应用提供的一套SDK接口(Android Automotive Library)。

源代码位于packages/services/Car/car-lib目录下

Google官方的API文档在Android Q之后,也开始支持Android Automotive库。

链接地址: https://developer.android.google.cn/reference/android/car/package-summary

车机系统开发——Android Automotive(安卓车机系统开发)

同CarService一样Car API 也提供的多个模块对应不同的功能调用。

硬件抽象层

硬件抽象层主要是提供了一个native服务android.hardware.automotive.vehicle@2.0-service,负责处理车辆相关的业务。

硬件抽象层的模块位于源码目录下hardware/interfaces/automotive/

VehicleService

VehicleService是一个native服务,代码实现在目录hardware/interfaces/automotive/vehicle/2.0/default/impl/vhal_v2_0/

VehicleServices是Android Automotive在硬件抽象层的入口。它通过initrc启动。

代码:hardware/interfaces/automotive/vehicle/2.0/default/android.hardware.automotive.vehicle@2.0-service.rc

service vendor.vehicle-hal-2.0 /vendor/bin/hw/android.hardware.automotive.vehicle@2.0-service class hal user vehicle_network group system inetVehicleHalManager

VehicleHalManager是Android Automotive在硬件抽象层的API接口。代码在目录

hardware/interfaces/automotive/vehicle/2.0/default/common/。

HAL接口语言

从硬件抽象层到系统框架层,也就是从VehicleService到CarService,从Android O版本开始使用了一种新的HIDL接口。

HIDL 是用于指定 HAL 和其用户之间的接口的一种接口描述语言 (IDL)。虽然从 Android 10 开始,HIDL 已废弃,Android 将在所有位置改用 AIDL。 但是Android Automotive的HIDL架构还保留着,直到Android 13才发生变化。

HIDL使用一种以.hal为后缀文件作为接口定义,在Android Automotive中硬件抽象层到系统框架层使用IVehicle.hal(代码路径:hardware/interfaces/automotive/vehicle/2.0/IVehicle.halhardware/interfaces/automotive/vehicle/2.0/IVehicle.hal)来定义。

代码:hardware/interfaces/automotive/vehicle/2.0/IVehicle.hal

package android.hardware.automotive.vehicle@2.0;​import IVehicleCallback;​interface IVehicle { /** * Returns a list of all property configurations supported by this vehicle * HAL. */​ //返回这个vehicle hal支持的全部property属性 getAllPropConfigs() generates (vec<VehiclePropConfig> propConfigs);​ /** * Returns a list of property configurations for given properties. * * If requested VehicleProperty wasn't found it must return * StatusCode::INVALID_ARG, otherwise a list of vehicle property * configurations with StatusCode::OK */​ getPropConfigs(vec<int32_t> props) generates (StatusCode status, vec<VehiclePropConfig> propConfigs);​ /** * Get a vehicle property value. * * For VehiclePropertyChangeMode::STATIC properties, this method must always * return the same value always. * For VehiclePropertyChangeMode::ON_CHANGE properties, it must return the * latest available value. * * Some properties like RADIO_PRESET requires to pass additional data in * GET request in VehiclePropValue object. * * If there is no data available yet, which can happen during initial stage, * this call must return immediately with an error code of * StatusCode::TRY_AGAIN. */​ get(VehiclePropValue requestedPropValue) generates (StatusCode status, VehiclePropValue propValue);​ /** * Set a vehicle property value. * * Timestamp of data must be ignored for set operation. * * Setting some properties require having initial state available. If initial * data is not available yet this call must return StatusCode::TRY_AGAIN. * For a property with separate power control this call must return * StatusCode::NOT_AVAILABLE error if property is not powered on. */​ set(VehiclePropValue propValue) generates (StatusCode status);​ /** * Subscribes to property events. * * Clients must be able to subscribe to multiple properties at a time * depending on data provided in options argument. * * @param listener This client must be called on appropriate event. * @param options List of options to subscribe. SubscribeOption contains * information such as property Id, area Id, sample rate, etc. */​ subscribe(IVehicleCallback callback, vec<SubscribeOptions> options) generates (StatusCode status);​ /** * Unsubscribes from property events. * * If this client wasn't subscribed to the given property, this method * must return StatusCode::INVALID_ARG. */​ unsubscribe(IVehicleCallback callback, int32_t propId) generates (StatusCode status);​ /** * Print out debugging state for the vehicle hal. * * The text must be in ASCII encoding only. * * Performance requirements: * * The HAL must return from this call in less than 10ms. This call must avoid * deadlocks, as it may be called at any point of operation. Any synchronization * primitives used (such as mutex locks or semaphores) must be acquired * with a timeout. * */​ debugDump() generates (string s);};

IVehicle接口支持功能如下

update-makefiles.sh

通过update-makefiles.sh 可以创建编译HIDL文件的Android.bp。

代码路径:hardware/interfaces/update-makefiles.sh

假设创建一个helloworld模块,在hardware/interfaces 下创建helloworld/1.0/IHelloWorld.hal:

package android.hardware.helloworld@1.0;interface IHelloWorld { justTest(string name); };

通过update-makefiles.sh就可以在对应package的目录下创建Android.bp:

// This file is autogenerated by hidl-gen -Landroidbp.hidl_interface { name: "android.hardware.helloworld@1.0", root: "android.hardware", vndk: { enabled: true, }, srcs: [ "IHelloWorld.hal", ], interfaces: [ "android.hidl.base@1.0", ], gen_java: true,}

name:模块的全名

root:包根目录

interfaces:编译过程中依赖的模块

gen_java:是否编译为Java 使用的接口

当然,还有其他的参数,例如gen_java_constants设为true 的时候会生成为Java 使用的Constants类。

全文概括了车机系统开发中的;Android Automotive原理架构解析;技术参考《车机开发手册》需要可以点击查看更多车载技术知识。

文末

车载HAL是汽车与车辆网络服务之间的接口定义(同时保护传入的数据):

车载HAL与Android Automotive架构:

Car API:内有包含CarSensorManager在内的API。位于/platform/packages/services/Car/car-libCarService:位于 /platform/packages/services/Car/车载 HAL:用于定义OEM可以实现的车辆属性的接口。包含属性元数据(例如,车辆属性是否为int以及允许使用哪些更改模式)。位于hardware/libhardware/include/hardware/vehicle.h。如需了解基本参考实现,请参阅 hardware/libhardware/modules/vehicle/(vehicle意思即车辆)
本文链接地址:https://www.jiuchutong.com/zhishi/281274.html 转载请保留说明!

上一篇:0x0000001e蓝屏代码意思(0x0000001e蓝屏代码的含义)

下一篇:mediapass.exe 进程有什么用 是什么进程 mediapass进程查询(system-coredump进程)

  • 苹果11可以插两张卡吗(苹果11插两个卡是不是信号不稳定)

    苹果11可以插两张卡吗(苹果11插两个卡是不是信号不稳定)

  • 小米米家照片打印机怎么使用(小米米家照片打印机)

    小米米家照片打印机怎么使用(小米米家照片打印机)

  • word另存为快捷键(word2007另存为快捷键)

    word另存为快捷键(word2007另存为快捷键)

  • 华为荣耀8手机机身有多重(华为荣耀8手机,耳机好的但是插了还是外放)

    华为荣耀8手机机身有多重(华为荣耀8手机,耳机好的但是插了还是外放)

  • 华为荣耀9xpro什么系统(华为荣耀9xpro是不是5g手机)

    华为荣耀9xpro什么系统(华为荣耀9xpro是不是5g手机)

  • 华为的语言设置在哪(华为怎么设置语言为英文)

    华为的语言设置在哪(华为怎么设置语言为英文)

  • 微信原图过期怎么解决(微信照片原图过期了怎么办)

    微信原图过期怎么解决(微信照片原图过期了怎么办)

  • miui12稳定版内测什么时候出来(miui12稳定版内测申请成功后怎么更新)

    miui12稳定版内测什么时候出来(miui12稳定版内测申请成功后怎么更新)

  • 抖音小店商品审核要多久(抖音小店商品审核未通过怎样重新上传)

    抖音小店商品审核要多久(抖音小店商品审核未通过怎样重新上传)

  • oppoa5微信深色模式怎么设置(oppoa57微信深色模式)

    oppoa5微信深色模式怎么设置(oppoa57微信深色模式)

  • 电邮账单和云账单是什么意思(云账单邮箱是什么)

    电邮账单和云账单是什么意思(云账单邮箱是什么)

  • pd线是什么(pd线是什么接口)

    pd线是什么(pd线是什么接口)

  • 苹果怎么看自动续费的东西(苹果怎么看自动续费有没有关闭)

    苹果怎么看自动续费的东西(苹果怎么看自动续费有没有关闭)

  • uwp应用是什么意思(uwp版是什么意思)

    uwp应用是什么意思(uwp版是什么意思)

  • 华为p30p无线充电怎么开启(华为p30p无线充电电流多少)

    华为p30p无线充电怎么开启(华为p30p无线充电电流多少)

  • 网络电视可以看春晚吗(网络电视可以看手机却连不上网络)

    网络电视可以看春晚吗(网络电视可以看手机却连不上网络)

  • 苹果11为什么发烫(苹果11为什么发烫这么严重)

    苹果11为什么发烫(苹果11为什么发烫这么严重)

  • 麒麟990与骁龙855哪个厉害(麒麟990与骁龙855差多少)

    麒麟990与骁龙855哪个厉害(麒麟990与骁龙855差多少)

  • imessage被拉黑啥样子

    imessage被拉黑啥样子

  • 钉钉备忘录在哪里(钉钉的备注在哪里)

    钉钉备忘录在哪里(钉钉的备注在哪里)

  • 闲鱼2个月不发货可以吗(闲鱼2个月不发货)

    闲鱼2个月不发货可以吗(闲鱼2个月不发货)

  • lldaloo是什么型号(llo是什么意思中文)

    lldaloo是什么型号(llo是什么意思中文)

  • iphonexr保修范围(苹果xr在保修期间都保什么)

    iphonexr保修范围(苹果xr在保修期间都保什么)

  • oppoa5像素多少万(vivox90pro像素多少万)

    oppoa5像素多少万(vivox90pro像素多少万)

  • 如何使用联想随机操作系统恢复光盘安装Windows XP的图文方法(联想随身充评测)

    如何使用联想随机操作系统恢复光盘安装Windows XP的图文方法(联想随身充评测)

  • Win11用excel总是很卡怎么办? win11系统excel表格很卡的解决办法(win10excel闪退是什么原因)

    Win11用excel总是很卡怎么办? win11系统excel表格很卡的解决办法(win10excel闪退是什么原因)

  • win10默认网关不可用老掉线解决方法(win10默认网关不可用总掉线解决方法)

    win10默认网关不可用老掉线解决方法(win10默认网关不可用总掉线解决方法)

  • 一文讲清chatGPT的发展历程、能力来源和复现它的关键之处(一文讲清资产负债表中各个项目的来龙去脉)

    一文讲清chatGPT的发展历程、能力来源和复现它的关键之处(一文讲清资产负债表中各个项目的来龙去脉)

  • 社保由税务局统一征收的地区
  • 增值税专用发票使用规定 最新
  • 车船税每年都要交吗,一般是多少钱交强险可以晚交吗
  • 月末怎么计提税费
  • 收入与支出怎么算利润率
  • 收到进项发票是什么凭证
  • 固定资产原值错误的账务处理
  • 现金流量科目怎么选择
  • 国际贷款平台
  • 营改增后建筑企业财务核算
  • 资本公积转增资本的条件
  • 社保滞纳金税前怎么算
  • 单利和复利的计算区别
  • 发票密码区出来了一点
  • 结转实物发放的成本分录
  • 什么情况下可以取保候审
  • 普通发票单张限额
  • 零星费用没有发票报销可以做入工资吗
  • 折旧是属于公司成本吗
  • 护建设税和教育费附加?
  • 呆账怎么写会计分录
  • 存货跌价准备的金额
  • 生产成本期末余额在贷方
  • 个税手续费返还要交增值税吗
  • 华为鸿蒙系统如何刷机
  • 收到工会经费怎样做账
  • 上月发票未上传
  • 机械设备购置的程序是什么
  • 如何知道家里网络是多少兆
  • PHP中Http协议post请求参数
  • 经销商计提折扣怎么算
  • 在建工程完工后结转会计分录
  • 发票已到货未到会计处理
  • 别人说你坏话怎么发朋友圈说说
  • vue-router跳转
  • 委托代销双方账务处理
  • vue3组件写法
  • framework怎么用
  • 拉贾安帕特群岛地图中文版
  • php str函数
  • axios用法示例
  • 遍历enumeration
  • 增值税普通发票查询真伪
  • 印花税申报未扣款在哪里查询
  • 企业年报未报会有什么后果
  • 完税证明能作为抵扣凭证吗
  • MySQL中distinct语句去查询重复记录及相关的性能讨论
  • 跨年发票能不能用
  • 出口收汇业务基本原则
  • 诉讼费可以退回私账嘛
  • 计提工会经费是什么凭证
  • 可供分配利润包括提取的盈余公积吗
  • 借方会计科目表
  • 一般纳税人会计分录
  • 建筑施工企业中,负责编制
  • 外卖占比总营业额怎么算
  • 代扣代缴的增值税为什么可以抵扣
  • 企业公司制改建的有关规定
  • sql注入神器
  • SQL Server的通用分页存储过程 未使用游标,速度更快!
  • mysql 5.7.18 winx64密码修改
  • 如何制作u盘系统win7
  • 电脑被攻击了怎么修复
  • win7怎么禁止系统自动更新
  • macbook 苹果系统
  • win10一年更新一次
  • win10未检测到任何网络硬件
  • cocos2d官网
  • Android性能优化 武汉招聘
  • 关于service生命周期的说法正确的是
  • css中标签
  • shell脚本编程实例
  • javascript语言中,以下关于array
  • 从零开始学公文写作
  • 火狐浏览器不支持弹出对话框操作
  • jq form提交
  • 衰竭期矿山开采的矿产品减征幅度
  • 回迁房有没有装电梯的
  • 北京出租车发票微信怎么查真伪?
  • 财税65号第一条
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设