随着汽车科技不断进步,车载应用开发成为了一个热门方向。然而,许多人忽视了一个重要问题:在投身于车载应用开发之前,对汽车座舱结构的了解至关重要。这种认知的缺失,往往会导致开发过程中出现许多矛盾和难题,进而严重影响开发进度。
汽车座舱与手机架构的差异
手机是大家日常使用频率最高的便携设备,其构造相对简单。然而,汽车驾驶舱的结构却要复杂得多。比如,驾驶舱中包含了显示车辆仪表的QNX系统,还有车载娱乐信息系统,这与手机单一的系统截然不同。此外,驾驶舱中众多硬件设备与软件的交互方式也更为多样,不像手机那样硬件交互模式较为固定。这种区别使得开发者需要调整自己的思维方式。只有充分理解这种区别,才能在开发车载应用时避免直接套用手机开发的模式。
汽车座舱的设计需要全面考量,并非单一关注软件或硬件,而是将两者有效结合。在开发车载软件时,不能仅着眼于某个部分,而应具备全局观。否则,所开发的应用可能存在兼容难题,或是无法满足座舱的全部功能需求。
SoC在车载领域的意义
SoC,又称系统级芯片或片上系统。这种芯片在车载系统中扮演着极其重要的角色。它自身集成了整个系统,并且包含了所有嵌入式软件。以高级自动驾驶软件架构平台为例,SoC需为该平台提供高性能的计算和通信支持,同时还要具备灵活的软件配置和更新能力。与仅具备单一计算或特定功能的普通芯片不同,SoC在汽车领域发挥着整合众多软件和硬件资源的大平台作用。
SoC常常是车载应用运行的根本硬件基础。若SoC出现问题,或者开发者对SoC在车载环境下的特性不够了解,程序开发过程中很可能会犯下根本性的错误。比如,软件与SoC的硬件不匹配等问题可能会出现,最终导致车载应用无法正常运行。
多操作系统运行机制
大多数汽车的驾驶舱内,同一块芯片上同时运行着两种不同的操作系统。这种双系统并行工作的设计,有很多需要注意的地方。以QNX系统和车载娱乐信息系统为例,虽然它们可以同时运作,但各自负责的功能截然不同。这就要求开发者对每个系统的特性有透彻的理解。例如,QNX系统主要管理车辆的仪表盘信息,它在稳定性和响应速度上有着较高的要求。
车载信息娱乐系统主要面向用户,提供丰富的车载娱乐服务。这类系统在硬件资源分配及数据交互流程上有着独特的设计。若开发者未准确掌握这些特点,开发出的应用可能在某一系统上运行异常,或导致两个系统间应用相互冲突。
SOA技术在车载领域应用现状
SOA最初是针对服务器开发的技术,如今也被引入到车载行业。不过,它遇到了一些挑战。国内主机厂在SOA的实施上各有不同。这种不一致性给行业带来了麻烦。在技术规范上,混乱不堪,缺乏一个统一的标准,这让开发者们在开发车载应用时感到十分困惑。
public class DemoApp extends Application {
private Handler handler;
@Override
public void onCreate() {
super.onCreate();
Log.e("TAG", "onCreate: start");
handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
showView();
}
},5000);
}
private void showView(){
WindowManager manager = getSystemService(WindowManager.class);
View view = new View(this);
WindowManager.LayoutParams params = new WindowManager.LayoutParams(WindowManager.LayoutParams.MATCH_PARENT,WindowManager.LayoutParams.MATCH_PARENT);
params.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
manager.addView(view,params);
}
}
各主机制造商采用的SOA技术各有差异,导致开发者所构建的SOA应用可能仅限于少数厂商的汽车座舱使用,缺乏通用性。这无疑给开发者带来了额外的开发成本,并且容易导致资源浪费。若不加以改进,这种状况将构成车载应用未来发展的潜在风险。
车载以太网与CAN通信
车载以太网在遵循民用以太网协议的同时,加入了独特的设计元素,对物理接口的电学特性进行了调整,并设定了新的规范。此外,CAN通信在车载系统的操作和应用开发领域极为普遍。比如,在车辆的核心服务部分,CAN通信扮演着至关重要的桥梁角色,它负责将来自外部硬件的通信信息解析为上层应用可以理解的数据格式。
开发者必须掌握CAN仿真测试工具的操作和CAN报文的解读,这是他们工作中至关重要的环节。若对CAN通信理解不当,就好比中断了上下级之间的沟通,车载系统整体运行将受影响,软硬件之间将出现断裂。
package {
default_applicable_licenses: ["Android-Apache-2.0"],
}
android_app {
name: "CarFirstApp",
srcs: ["src/**/*.java"],
resource_dirs: ["res"],
platform_apis: true,
certificate: "platform",
privileged: true,
static_libs: [
"androidx.appcompat_appcompat",
"com.google.android.material_material",
],
optimize: {
enabled: false,
},
dex_preopt: {
enabled: false,
},
product_variables: {
pdk: {
enabled: false,
},
},
}
车载应用的类型与测试
车载软件不仅包括在后台悄无声息运行的无界面应用,还包括与用户直接互动的界面应用。此外,系统级应用有其独特之处。这类应用必须嵌入到存储器中运行,并且可以调用SDK的内部接口,这是普通应用无法实现的。而且,系统应用的测试过程相当繁琐。如果没有开发板,只能依赖模拟器进行测试时,就需要经历下载源代码,并在源代码环境中编译出带有系统签名的APK这一复杂步骤。
# 编译Android源码
/aosp$ source build/envsetup.sh
/aosp$ lunch 12
/aosp$ make -j 32
/aosp$ emulator -writable-system -netdelay none -netspeed full
很多新成立的开发团队在系统测试阶段遇到了挑战。大家不妨想想,如果测试过程不顺畅,那么开发出来的应用自然会有不少问题。那么,解决之道又在哪里?这好像也是许多从事车载应用开发的工程师们心中的难题。各位朋友,你们是否有更好的建议?希望你们能在评论区提出,并且请不要忘记点赞和转发这篇文章。
/aosp$ adb root
/aosp$ adb remount
/aosp$ adb shell reboot