安卓在SOA中的运用

安卓在运用SOA研发的过程中,会针对实际情况对研发的架构和流程进行优化,通过优化过的架构和实施方案,不仅可以大大提升了整车开发的效率和灵活行以及功能落地的稳定性,同时也增加了系统的向上兼容性。

目前基于车载SOA系统的研发,应用层和底层以太网之间的交互主要是基于JNI来实现的,JNI是将cpp的动态库内置到app或者系统目录下,供app进行使用,参考下图所示:

应用层:java/kotlin代码,各种系统/三方APP

应用框架层:java/C/C++代码 Framework API+JNI方法 服务端、客户端、Linux驱动。

在这层里定义的API都是用Java语言编写。但是又因为它包含了JNI的方法,JNIJava Native Interface)用C/C++编写接口,根据函数表查询调用核心库层里的底层方法,最终访问到 Linux 内核

本地依赖库/系统运行库层:C和C++

Android Runtime:核心库+Dalvik系统库

HAL(硬件抽象层):C++实现,HAL层是上层应用对底层硬件操作屏蔽的一个软件层次,就是上层应用不必关心底层硬件具体是如何工作的,只需要调用底层提供的统一接口即可。HAL层对接具体的硬件BSP接口,比如音视频接口、收音机接口、网络接口、spi接口等。

linux内核层:C语言

Android的第一层是有C语言实现,第二层由C和C++实现,第三、四层主要是有java实现的。

第1、2层之间,从linux的操作系统的角度来看,是由内核和用户空间的分界线,

第2、3层之间是本地代码层和java代码层的接口。

第3、4层之间,是android的系统API的接口。

技术难点

1.app和动态库相当于一体的,动态库中的报错也会导致app出现闪退等问题。JNI的实现方式是JVM有一套cpp和java的对应表,并依赖于JNIEnv,运行时错误很难及时定位。会大大增加系统的耦合度,也会增加调试的困难。

2.JNI的cpp是基于ndk的,并非以标准的cpp方式进行研发,与标准cpp写法有不同,需要重新熟悉。

3.车载系统服务的发布和订阅等,是通过OTA进行统一升级的,无法做到版本的记录和控制,目前的车载SOA系统会不会考虑到接口的向下兼容性。

技术实现要点

1.接口定义模块,在应用层中定义aidl接口并获取aidl接口文件,接口文件编译模块,编译aidl接口文件,生成cpp接口文件和cpp接口。hal层,用于接收应用层提供的cpp接口文件,建立hal层与cpp接口的对接渠道。

2.该架构的特征在于所述接口文件编译模块编译aidl接口文件后,自动生成java接口文件和java接口,所述java接口和cpp接口的功能定义相同;所述应用层接收java接口文件,以建立所述应用层与java接口的对接。通过上述技术方案,大大提升了接口定义的效率,且需要实现某项功能,并依赖与hal层时,可自己先定义该功能的java接口,并将生成的cpp接口文件提供给hal层,应用层自身先可按照该java接口来实现后续功能,并不耽误自己的功能实现,也不依赖对方的实现时间

3.binder模块,应用层实现java接口作为上层的client,hal层实现cpp接口作为底层server,应用层和hal层间通过binder模块以binder模式进行通信。通过上述技术方案,方便了当hal层向应用层的发送某些功能,加强了应用层与hal层之间的联系,所述binder模式通过binder driver实现,所述应用层获取hal层的一个接口作为代理接口;应用层调用代理接口并生成请求数据,发送给binder driver;hal层通过binder模块读取binder driver中的请求数据,处理并将结果返回。通过binder driver使hal层既可以读取应用层发出的请求,也可以将处理结果返回,方便了应用层和hal层之间的双向通信。在应用层中定义aidl接口并获取aidl接口文件的步骤之后包括:定义所述aidl接口文件版本号,hal层支持所有版本的服务接口。

技术总结:

车载智能系统技术领域,公开了一种基于Android AIDL的车载SOA分层开发架构及方法,方法包括在应用层中定义AIDL接口并获取AIDL接口文件;编译AIDL接口文件,获取CPP接口文件并生成CPP接口,获取JAVA接口文件并生成JAVA接口;应用层将CPP接口文件提供给HAL层,以建立HAL层与CPP接口的对接;应用层接收JAVA接口文件,以建立应用层与JAVA接口的对接。存在应用层和HAL层两个进程,大大提升了架构的清晰度,降低了耦合度,同时也提升了稳定性,使运行错误时容易进行定位,大大降低调试难度。

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

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

相关文章

软件游戏缺失XINPUT1_3.dll怎么安装,马上教会你

当我们打开某个软件或游戏时,系统提示“XINPUT1_3.dll丢失”怎么办,XINPUT1_3.dll是一个动态链接库文件,它包含了许多用于处理输入设备的函数。当计算机丢失这个文件时,一些依赖于它的应用程序可能无法正常运行,导致输…

实践:基于双向LSTM模型完成文本分类任务

目录 1 数据处理 1.1 数据加载 1.2 构造Dataset类 1.3 封装DataLoader 2 模型构建 3 模型训练 4 模型评价 5 模型预测 5 拓展实验 5.1 使用Pytorch内置的单向LSTM进行文本分类实验 ​编辑 5.2 使用Paddle内置的单向LSTM进行文本分类实验 总结 电影评论可以蕴含…

打印菱形和金字塔类型(总结)

首先,在之前的学习中,我们了解了菱形的打印,今天我们来对金字塔和菱形这类打印图形的问题,我们来做一个总结。 这个总结的来源是这今天做了一道题 这道题的答案如下 这个题做起来并不难,拓展到这类问题中,…

Axure软件大全:原型设计下载与学习指南!

Axure可以有效地创建原型,包括绘制APP和网页的原型图、框架图、结构图等。Axure内置的小部件可以用来构建动态交互。即使新手设计师不懂程序代码,也可以在Axure中创建复杂、动态、功能丰富的原型。对于想要深入研究和花时间学习程序的设计师来说&#xf…

深入解析云原生与Kubernetes:现代化应用开发的未来

云原生是一种创新的软件开发和部署方法论,旨在使应用程序能够更好地适应云环境的特性和需求。而Kubernetes作为云原生的核心技术,提供了强大的容器编排和管理能力,改变了应用部署和运行的方式。本文将深入探讨云原生和Kubernetes的概念、原理…

Elasticsearch:带有自查询检索器的聊天机器人示例

本工作簿演示了 Elasticsearch 的自查询检索器 (self-query retriever) 将问题转换为结构化查询并将结构化查询应用于 Elasticsearch 索引的示例。 在开始之前,我们首先使用 langchain 将文档分割成块,然后使用 ElasticsearchStore.from_documents 创建…

【基础】【Python网络爬虫】【1.认识爬虫】什么是爬虫,爬虫分类,爬虫可以做什么

Python网络爬虫基础 认识爬虫1.什么是爬虫2.爬虫可以做什么3.为什么用 Ptyhon 爬虫4.爬虫的分类通用爬虫聚焦爬虫功能爬虫增量式爬虫分布式爬虫 5.爬虫的矛与盾(重点)6.盗亦有道的君子协议robots7.爬虫合法性探究 认识爬虫 1.什么是爬虫 网络爬虫&…

Go(Golang)的10个常见代码片段用于各种任务

探索有用的Go编程代码片段 提供“前10名”Go(Golang)代码片段的明确列表是具有挑战性的,因为代码片段的实用性取决于您试图解决的具体问题。然而,我可以为您提供十个常用的Go代码片段,涵盖了各种任务和概念&#xff1…

基于PI控制的PMSM永磁同步电机控制系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 PMSM数学模型 4.2 矢量控制策略 4.3 PI控制器设计 4.4 控制系统实现 5.完整工程文件 1.课题概述 基于PI控制的PMSM永磁同步电机控制系统simulink建模与仿真。其中,基于PI(…

Python爬虫-爬取当日中药材价格数据

🎈 博主:一只程序猿子 🎈 博客主页:一只程序猿子 博客主页 🎈 个人介绍:爱好(bushi)编程! 🎈 创作不易:喜欢的话麻烦您点个👍和⭐! 🎈…

Pix2Seq 算法阅读记录

目录 前向传播过程 训练过程: 网络结构 前向传播过程 batch_preds--> tgt-->tgtcat(tgt, padding)-->tgt_embedding-->tgt_mask,tgt_padding_mask 以NLP的角度,tgt 代表了 词汇表的长度,encoder部分直接对图像进行处理&#…

Spring Cloud Gateway + Nacos 灰度发布

前言 本文将会使用 SpringCloud Gateway 网关组件配合 Nacos 实现灰度发布&#xff08;金丝雀发布&#xff09; 环境搭建 创建子模块服务提供者 provider&#xff0c;网关模块 gateway 父项目 pom.xml 配置 <?xml version"1.0" encoding"UTF-8"?…