Android車載應(yīng)用開(kāi)發(fā)與分析(11)- 車載Android應(yīng)用開(kāi)發(fā)入門指南

1. 前言 - 移動(dòng)互聯(lián)網(wǎng)退潮下的汽車大戰(zhàn)

將時(shí)間回退到2017年我大學(xué)剛畢業(yè)時(shí),彼時(shí)移動(dòng)互聯(lián)網(wǎng)就已經(jīng)開(kāi)始退潮,各大個(gè)培訓(xùn)機(jī)構(gòu)也紛紛停止了Android相關(guān)的培訓(xùn),曾經(jīng)熱火朝天的應(yīng)用開(kāi)發(fā)從那時(shí)起,就開(kāi)始走向下坡路,小程序以及眾多跨平臺(tái)框架也讓市場(chǎng)對(duì)Android原生開(kāi)發(fā)的需求逐年降低,市場(chǎng)需求的降低也造就了Android開(kāi)發(fā)的面試變得史無(wú)前例的“卷”。

終于我在2019年選擇離開(kāi)了互聯(lián)網(wǎng),投身當(dāng)時(shí)還不是非?;馃岬能囕dAndroid領(lǐng)域繼續(xù)從事Android原生開(kāi)發(fā)。而這一年中國(guó)首個(gè)外商獨(dú)資的整車制造項(xiàng)目,“上海特斯拉超級(jí)工廠”開(kāi)工了。

特斯拉在智能化和電子化上的巨大優(yōu)勢(shì)將智能汽車推向了一個(gè)全新的高度,先進(jìn)的自動(dòng)駕駛以及BMS電池管理系統(tǒng),深深震撼了全世界的人,在當(dāng)時(shí)的國(guó)人眼中特斯拉幾乎就是新能源汽車的代名詞,時(shí)至今日,Model Y和Model 3已也依然是新能源汽車領(lǐng)域的暢銷車型。

眾所周知汽車工業(yè)是發(fā)達(dá)國(guó)家重要的經(jīng)濟(jì)支柱,而中國(guó)是世界上最大汽車生產(chǎn)和銷售國(guó),特斯拉的熱銷立馬就引發(fā)了一場(chǎng) 鯰魚效應(yīng) ,國(guó)內(nèi)外的汽車制造商紛紛開(kāi)始布局智能化汽車,汽車工業(yè)走向了軟件定義汽車的時(shí)代。軟件定義汽車的核心思想是,決定未來(lái)汽車的是以人工智能為核心的軟件技術(shù),車載軟件在汽車領(lǐng)域的重要性首次被拔高到了前所未有的高度,就這樣一場(chǎng)轟轟烈烈的車載軟件技術(shù)大戰(zhàn)上演了。

2. 智能汽車座艙基本結(jié)構(gòu)

在從事車載Android應(yīng)用開(kāi)發(fā)前,必須要對(duì)汽車座艙的基本結(jié)構(gòu)有一個(gè)大體的認(rèn)知,只有意識(shí)到汽車座艙是一種與手機(jī)完全不同的架構(gòu),才能更好的助力我們?nèi)蘸髮W(xué)習(xí)車載Android應(yīng)用的開(kāi)發(fā)。下面就來(lái)介紹一個(gè)比較主流的車載操作系統(tǒng)架構(gòu)。

注意:并不是所有的車載操作系統(tǒng)都采用了下面的架構(gòu),比如,特斯拉采用的是基于Linux一套架構(gòu)。

上面就是目前主流汽車座艙采用技術(shù)架構(gòu),我們從上到下依次介紹:

T-BOX

T-Box又稱TCU(車聯(lián)網(wǎng)控制單元),指安裝在汽車上用于控制跟蹤汽車的嵌入式系統(tǒng),是車載信息交互系統(tǒng)核心部件,有了它汽車才能實(shí)現(xiàn)聯(lián)網(wǎng)功能,所以也起到中央網(wǎng)關(guān)的作用。通常包括GPS單元、移動(dòng)通訊外部接口電子處理單元、微控制器、移動(dòng)通訊單元以及存儲(chǔ)器等。
對(duì)車輛,T-Box可提供車輛故障監(jiān)控、電源管理、遠(yuǎn)程升級(jí)、數(shù)據(jù)采集、智慧交通等功能,對(duì)車主,T-Box可為提供車輛遠(yuǎn)程控制、安防服務(wù)等功能。
T-BOX屬于外圍硬件,與中控、儀表并不集成在一個(gè)主板上。

SOC

SoC的定義多種多樣,由于其內(nèi)涵豐富、應(yīng)用范圍廣,很難給出準(zhǔn)確定義。一般說(shuō)來(lái), SoC稱為系統(tǒng)級(jí)芯片,也有稱片上系統(tǒng)(System on Chip),意指它是一個(gè)產(chǎn)品,是一個(gè)有專用目標(biāo)的集成電路,其中包含完整系統(tǒng)并有嵌入軟件的全部?jī)?nèi)容。
車載Soc和我們最常見(jiàn)的手機(jī)Soc非常類似,內(nèi)部集成了CPU和GPU。目前最主流的車載Soc是高通的SA8155,它就是高通在手機(jī)Soc驍龍855的基礎(chǔ)上發(fā)展而來(lái)的。

MCU

微控制單元(Microcontroller Unit;MCU) ,又稱單片微型計(jì)算機(jī)(Single Chip Microcomputer )或者單片機(jī),是把中央處理器(Central Process Unit;CPU)的頻率與規(guī)格做適當(dāng)縮減,并將內(nèi)存(memory)、計(jì)數(shù)器(Timer)、USB、A/D轉(zhuǎn)換、UART、PLC、DMA等周邊接口,甚至LCD驅(qū)動(dòng)電路都整合在單一芯片上,形成芯片級(jí)的計(jì)算機(jī)。

一般汽車座艙內(nèi),集成SOC的主板上也會(huì)額外集成一個(gè)或多個(gè)MCU。

AutoSAR

Adaptive AutoSAR 是一種適用于高級(jí)自動(dòng)駕駛的軟件架構(gòu)平臺(tái),提要提供高性能的計(jì)算和通信,提供靈活的軟件配置,支撐應(yīng)用的更新。
Adaptive AutoSAR 的主要架構(gòu)分為硬件層、ARA(AutoSAR Run-timeFor Adaptive實(shí)時(shí)運(yùn)行環(huán)境)以及應(yīng)用層。
應(yīng)用層包含的應(yīng)用程序模塊(AA)運(yùn)行在ARA之上,每個(gè)AA以獨(dú)立的進(jìn)程運(yùn)行。ARA由功能集群提供的應(yīng)用接口組成,他們屬于自適應(yīng)平臺(tái)。自適應(yīng)平臺(tái)提供Adaptive AutoSAR 的基本功能和標(biāo)準(zhǔn)服務(wù)。
每個(gè)AA可以向其他AA發(fā)生服務(wù)?;谶@種架構(gòu),整車的功能之間可以解耦。

Hypervisor

一種運(yùn)行在基礎(chǔ)物理服務(wù)器和操作系統(tǒng)之間的中間軟件層,可允許多個(gè)操作系統(tǒng)和應(yīng)用共享硬件。也可叫做VMM( virtual machine monitor ),即虛擬機(jī)監(jiān)視器。
目前主流的汽車座艙,都是同時(shí)在一個(gè)Soc上運(yùn)行著兩個(gè)不同的操作系統(tǒng),一個(gè)是顯示汽車儀表盤的QNX系統(tǒng),另一個(gè)用于車載信息娛樂(lè)的Android系統(tǒng),其底層技術(shù)原理就是Hypervisor。

QNX

QNX是一種商用的、遵從POSIX規(guī)范的類Unix實(shí)時(shí)操作系統(tǒng),目標(biāo)市場(chǎng)主要是面向嵌入式系統(tǒng),具備高運(yùn)行效率、高可靠性特點(diǎn),并在工控領(lǐng)域擁有近40年的使用經(jīng)驗(yàn),被廣泛應(yīng)用于汽車、軌道交通、航空航天等對(duì)安全性、實(shí)時(shí)性要求較高的領(lǐng)域。
QNX在車載操作系統(tǒng)市場(chǎng)的占有率超過(guò)75%,在更注重生態(tài)和內(nèi)容的車載娛樂(lè)系統(tǒng)占有率也超過(guò)60%,而在強(qiáng)調(diào)安全性的儀表盤以及駕駛輔助領(lǐng)域,QNX的市占率更是達(dá)到了近100%。

2010年QNX被加拿大RIM公司收購(gòu),而這家公司就是黑莓BlackBerry的母公司。

SOA

SOA(Service-OrientedArchitecture)是一種基于業(yè)務(wù)實(shí)現(xiàn)的粗粒度松耦合的面向服務(wù)的分布式架構(gòu),即實(shí)現(xiàn)業(yè)務(wù)和技術(shù)的分離,又實(shí)現(xiàn)業(yè)務(wù)和技術(shù)的自由組合。
以位置服務(wù)為例,很多車內(nèi)應(yīng)用會(huì)用到位置信息,像天氣、拍照、導(dǎo)航,這些應(yīng)用根據(jù)自身服務(wù)有不同的需求,對(duì)位置信息的處理各不相同,SOA就可以很好地解決這個(gè)問(wèn)題。
SOA原本是服務(wù)器開(kāi)發(fā)中用到的技術(shù),現(xiàn)如今也被用在車載操作系統(tǒng)領(lǐng)域,但是目前關(guān)于SOA的技術(shù)規(guī)范比較混亂,國(guó)內(nèi)主機(jī)廠商外對(duì)于SOA的實(shí)現(xiàn)方式也有區(qū)別。
SOA并不車載操作系統(tǒng)必須的,其實(shí)目前為止已經(jīng)上市的車型中,很少采用了SOA架構(gòu),所以它還只是車載操作系統(tǒng)未來(lái)的一個(gè)發(fā)展方向。

2021年上汽零束率先發(fā)布業(yè)界首個(gè)車載SOA軟件架構(gòu)規(guī)范。威馬汽車科技集團(tuán)旗下的W6號(hào)稱國(guó)內(nèi)首款采用SOA的量產(chǎn)車。

車載以太網(wǎng)

車載以太網(wǎng)是一種用以太網(wǎng)連接車內(nèi)電子單元的新型局域網(wǎng)技術(shù),與傳統(tǒng)以太網(wǎng)使用4對(duì)非屏蔽雙絞線電纜不同,車載以太網(wǎng)在單對(duì)非屏蔽雙絞線上可實(shí)現(xiàn)100Mbit/s,甚至1Gbit/s的傳輸速率,同時(shí)還滿足汽車行業(yè)對(duì)高可靠性、低電磁輻射、低功耗、帶寬分配、低延遲以及同步實(shí)時(shí)性等方面的要求。

車載以太網(wǎng)的設(shè)計(jì)是為了滿足車載環(huán)境中的一些特殊需求。例如:滿足車載設(shè)備對(duì)于電氣特性的要求(EMI/RF);滿足車載設(shè)備對(duì)高帶寬、低延遲以及音視頻同步等應(yīng)用的要求;滿足車載系統(tǒng)對(duì)網(wǎng)絡(luò)管理的需求等。因此可以理解為,車載以太網(wǎng)在民用以太網(wǎng)協(xié)議的基礎(chǔ)上,改變了物理接口的電氣特性,并結(jié)合車載網(wǎng)絡(luò)需求專門定制了一些新標(biāo)準(zhǔn)。針對(duì)車載以太網(wǎng)標(biāo)準(zhǔn),IEEE組織也對(duì)IEEE 802.1和IEEE 802.3標(biāo)準(zhǔn)進(jìn)行了相應(yīng)的補(bǔ)充和修訂。

CAN

CAN是控制器域網(wǎng) (Controller Area Network, CAN) 的簡(jiǎn)稱,是由研發(fā)和生產(chǎn)汽車電子產(chǎn)品著稱的德國(guó)BOSCH公司開(kāi)發(fā)了的,并最終成為國(guó)際標(biāo)準(zhǔn)(ISO11898)。是國(guó)際上應(yīng)用最廣泛的現(xiàn)場(chǎng)總線之一。 在北美和西歐,CAN總線協(xié)議已經(jīng)成為汽車計(jì)算機(jī)控制系統(tǒng)和嵌入式工業(yè)控制局域網(wǎng)的標(biāo)準(zhǔn)總線,并且擁有以CAN為底層協(xié)議專為大型貨車和重工機(jī)械車輛設(shè)計(jì)的J1939協(xié)議。近年來(lái),其所具有的高可靠性和良好的錯(cuò)誤檢測(cè)能力受到重視,被廣泛應(yīng)用于汽車計(jì)算機(jī)控制系統(tǒng)和環(huán)境溫度惡劣、電磁輻射強(qiáng)和振動(dòng)大的工業(yè)環(huán)境。
CAN在車載操作系統(tǒng)&應(yīng)用開(kāi)發(fā)中使用非常廣泛,車載Android的核心服務(wù)之一 - CarService本質(zhì)上就是將外部硬件通信報(bào)文解析成上層應(yīng)用可以識(shí)別的數(shù)據(jù),這里的通信報(bào)文目前普遍都是CAN報(bào)文。

CAN通信在車載中使用的是如此廣泛,以至于作為Android程序員,我們都不得不去學(xué)習(xí)CAN仿真測(cè)試工具的使用,有時(shí)候甚至需要我們?nèi)ラ喿x、解析CAN報(bào)文。
值得一提的是CAN仿真測(cè)試工具非常昂貴,雖有國(guó)產(chǎn)替代,但目前依然普遍采用德國(guó)維克多公司出品的各類工具和軟件,價(jià)格在數(shù)萬(wàn)元到數(shù)十萬(wàn)元不等。

3D HMI設(shè)計(jì)工具 & 嵌入式圖形引擎

隨著車載Soc算力的提高,現(xiàn)代座艙越來(lái)越喜歡引入3D化的圖形界面,3D化的界面可以實(shí)時(shí)生成動(dòng)畫反饋,大大提升了界面的美觀性和易用性。目前車載開(kāi)發(fā)中主流的3D HMI設(shè)計(jì)工具&圖形引擎有老牌的游戲開(kāi)發(fā)工具如Unity 3d、Unreal(虛幻),也有專用于汽車HMI設(shè)計(jì)&圖形顯示的 — Kanzi 。

2016年芬蘭汽車軟件公司Rightware以及旗下產(chǎn)品Kanzi,被國(guó)內(nèi)的汽車軟件供應(yīng)商中科創(chuàng)達(dá)收購(gòu)。

上面介紹了汽車座艙的基礎(chǔ)知識(shí),Android應(yīng)用程序員說(shuō)到底還是負(fù)責(zé)在座艙中控,編寫各類型的應(yīng)用,下面就來(lái)介紹車載應(yīng)用與互聯(lián)網(wǎng)應(yīng)用的不同之處。

3. 車載應(yīng)用開(kāi)發(fā)

車載Android應(yīng)用說(shuō)到底就是,在車載Android系統(tǒng)中嵌入一系列系統(tǒng)級(jí)應(yīng)用,這里既包含與用戶存在交互的HMI應(yīng)用,也包含在后臺(tái)運(yùn)行沒(méi)有HMI的Service應(yīng)用。

一般而言,車載應(yīng)用復(fù)雜度比一般的互聯(lián)網(wǎng)應(yīng)用還要低一些。

常見(jiàn)有HMI的車載應(yīng)用如,車載空調(diào)、多媒體應(yīng)用、桌面、SystemUI、系統(tǒng)設(shè)置、車控車設(shè)、藍(lán)牙電話以及一些第三方應(yīng)用等等。

沒(méi)有HMI的應(yīng)用有,CarService、AudioService、AccountService等等。在車載應(yīng)用開(kāi)發(fā)中需要定制大量的Service,這也是應(yīng)用開(kāi)發(fā)中工作量比較大的一部分。

3.1 系統(tǒng)級(jí)應(yīng)用與普通應(yīng)用的區(qū)別

系統(tǒng)應(yīng)用需要嵌入到Android ROM中運(yùn)行,雖然普通的應(yīng)用也可以嵌入到ROM中,但是系統(tǒng)應(yīng)用可以調(diào)用Android SDK的內(nèi)部API,而這一點(diǎn)是普通應(yīng)用做不到的,總得來(lái)說(shuō)系統(tǒng)應(yīng)用具有以下特點(diǎn)

  • 可以訪問(wèn)Android SDK內(nèi)部的API
  • 不需要申請(qǐng)動(dòng)態(tài)權(quán)限
  • 可配置開(kāi)機(jī)自啟動(dòng)
  • 必須對(duì)應(yīng)用進(jìn)行簽名

接下來(lái)我們實(shí)際上手編寫一個(gè)系統(tǒng)級(jí)應(yīng)用。

3.2 編寫一個(gè)系統(tǒng)級(jí)應(yīng)用

編寫Android系統(tǒng)應(yīng)用與普通的Android應(yīng)用基本相同,我們首先在AndroidStudio中編寫一個(gè)demo,只需要一個(gè)空白的Activity和Application即可。

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);
    }
}

上面的application邏輯很簡(jiǎn)單,app啟動(dòng)5秒后,彈出一個(gè)全屏的Window的。

接下來(lái)在AndroidManifest.xml中注冊(cè)application。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.car"
    android:sharedUserId="android.uid.system">

    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:persistent="true"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/Theme.First">

        <activity
            android:name=".MainActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

在上面源碼中我們需要關(guān)注兩個(gè)普通應(yīng)用用不到的屬性:
android:sharedUserId
將與其他應(yīng)用程序共享的 Linux 用戶 ID 的名稱。默認(rèn)情況下,Android 會(huì)為每個(gè)應(yīng)用分配自己唯一的用戶 ID。但是,如果為兩個(gè)或多個(gè)應(yīng)用將此屬性設(shè)置為相同的值,則它們將共享相同的 ID,前提是它們的證書集相同。具有相同用戶 ID 的應(yīng)用可以訪問(wèn)彼此的數(shù)據(jù),如果需要,可以在同一進(jìn)程中運(yùn)行。
開(kāi)發(fā)系統(tǒng)應(yīng)用時(shí),此項(xiàng)不是必須配置的。配置為android.uid.system后,該應(yīng)用會(huì)變成system用戶,可以訪問(wèn)一些system用戶才能訪問(wèn)的空間。

android:persistent
配置應(yīng)用程序是否應(yīng)始終保持運(yùn)行,默認(rèn)為false。設(shè)為true之后,應(yīng)用在開(kāi)機(jī)廣播發(fā)出之前就會(huì)自行啟動(dòng),而且應(yīng)用被殺死后,也會(huì)立即重啟。
開(kāi)發(fā)系統(tǒng)應(yīng)用時(shí),此項(xiàng)不是必須配置的。

3.3 測(cè)試系統(tǒng)應(yīng)用

3.3.1 準(zhǔn)備測(cè)試環(huán)境

測(cè)試系統(tǒng)應(yīng)用就比較麻煩了,由于手邊沒(méi)有開(kāi)發(fā)板,只能基于模擬器進(jìn)行測(cè)試,所以就必須下載Android的源碼,并使用Android源碼環(huán)境編譯出帶有系統(tǒng)簽名的APK。
下載、編譯Android源碼 請(qǐng)參考 :Android車載應(yīng)用開(kāi)發(fā)與分析(1) - Android Automotive概述與編譯
完成Android源碼編譯后,我們將編寫好的FirstCarApp部分源碼拷貝到 /aosp/packages/apps/Car/ 下,
基于Android源碼環(huán)境的app工程結(jié)構(gòu)與基于Gradle的AndroidStudio工程結(jié)構(gòu)是完全不一樣的,目錄結(jié)構(gòu)如下:

你應(yīng)該注意到了 src 目錄下沒(méi)有androids studio工程結(jié)構(gòu)中的main/java
需要強(qiáng)調(diào)的是,這種基于原生的寫法,并不常用。實(shí)際開(kāi)發(fā)中,我們依然是在Android Studio中開(kāi)發(fā)完畢,將源碼提交到gerrit上,后續(xù)的編譯、簽名、復(fù)制的過(guò)程會(huì)有jenkins幫我們完成。

3.3.2 編譯&運(yùn)行應(yīng)用

源碼環(huán)境下編譯出Android應(yīng)用,需要編寫一個(gè)Android.bp或Android.mk腳本,如果你對(duì)Android.bp或Android.mk并不了解的話請(qǐng)參考:Android.mk 上手指南 | Android.bp入門教程

本篇測(cè)試用的Android.bp腳本如下

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,
        },
    },
}

然后完整編譯一次Android的源碼

# 編譯Android源碼
/aosp$ source build/envsetup.sh 
/aosp$ lunch 12
/aosp$ make -j 32
/aosp$ emulator -writable-system -netdelay none -netspeed full

一般情況下我們可以直接使用emulator指令就可以啟動(dòng)編譯好的模擬器,但是此時(shí)的模擬器的文件系統(tǒng)還是read-only模式,并且不可以執(zhí)行remount指令,通過(guò)添加-writable-system -netdelay none -netspeed full,我們就可以正常使用remount指令了。

/aosp$ adb root
/aosp$ adb remount
/aosp$ adb shell reboot

等模擬器重啟后,我們繼續(xù)編譯出CarFristApp的apk。

link@link-PC:/aosp$ make CarFirstApp
...
## 編譯后輸出的apk路徑
============================================
[100% 4/4] Install: out/target/product/generic_car_x86/system/priv-app/CarFirstApp/CarFirstApp.apk

#### build completed successfully (2 seconds) ####

然后使用adb指令在模擬器中創(chuàng)建一個(gè)CarFristApp目錄,將編譯好的apk push到system/priv-app/CarFristApp/目錄下。

/CarFirstApp$ adb root
/CarFirstApp$ adb remount
# 創(chuàng)建目錄
/CarFirstApp$ adb shell mkdir /system/priv-app/CarFirstApp
/CarFirstApp$ adb push CarFirstApp.apk /system/priv-app/CarFirstApp
# 重啟
/CarFirstApp$ adb shell reboot

等待模擬器重啟結(jié)束后,就可以看到,app會(huì)自行啟動(dòng),然后會(huì)彈出一個(gè)WindowView遮住屏幕。不知道你是否注意到了,無(wú)論是自啟動(dòng),還是彈出一個(gè)遮住屏幕的Window,都沒(méi)有申請(qǐng)權(quán)限的窗口顯示出來(lái),這就系統(tǒng)級(jí)應(yīng)用的一個(gè)重要特點(diǎn)。

在上面的操作中我們選擇把a(bǔ)pk push到priv-app下面,除此以外Android應(yīng)用還有以下幾種安裝路徑,可以根據(jù)實(shí)際需要安裝到不同的目錄中去。
/system/priv-app
該路徑存放一些系統(tǒng)底層的應(yīng)用,比如Setting,systemUI等。該目錄中的app擁有較高的系統(tǒng)權(quán)限,而且如果要使用android:protectionLevel=signatureOrSystem,那么該app必須放到priv-app目錄中去。

/system/app
該目錄中存放的系統(tǒng)app權(quán)限相對(duì)較低,而且當(dāng)擁有root權(quán)限時(shí),就有可能卸載掉這些app。

/vendor/app
該目錄存放vendor廠商的app

/data/app
用戶安裝的第三方app

3.4 車載應(yīng)用的難點(diǎn)

車載應(yīng)用開(kāi)發(fā)過(guò)程中,往往都會(huì)遇到以下幾個(gè)難點(diǎn):

  • 調(diào)試耗時(shí)且費(fèi)力
    車載應(yīng)用開(kāi)發(fā)難度其實(shí)并不大,但是很煩!特別是調(diào)試,不同于開(kāi)發(fā)手機(jī)應(yīng)用,車載應(yīng)用的運(yùn)行環(huán)境是基于AOSP定制的,而且大多數(shù)時(shí)候都會(huì)存在數(shù)不清的BUG,有時(shí)系統(tǒng)底層的bug會(huì)在上層應(yīng)用中體現(xiàn),這就要求應(yīng)用開(kāi)發(fā)者必須有能力準(zhǔn)確識(shí)別出這個(gè)bug的歸屬方。

  • 復(fù)雜的UI
    現(xiàn)如今的車載應(yīng)用都會(huì)有著一個(gè)套復(fù)雜且炫酷交互UI,同時(shí),由于車載Android與QNX共享一個(gè)Soc和內(nèi)存,所以多數(shù)時(shí)候系統(tǒng)資源都比主流的手機(jī)要差不少,對(duì)應(yīng)用開(kāi)發(fā)者來(lái)說(shuō),實(shí)現(xiàn)一套復(fù)雜且高性能的HMI,往往會(huì)非常有挑戰(zhàn)性。

  • 對(duì)系統(tǒng)API理解不夠
    開(kāi)發(fā)車載應(yīng)用多數(shù)時(shí)候都會(huì)要求重新定制一個(gè)原本系統(tǒng)中已經(jīng)存在的應(yīng)用,比如系統(tǒng)設(shè)置。這就要求開(kāi)發(fā)者對(duì)于原生應(yīng)用的運(yùn)行方式、調(diào)用的API都有一定的了解。

4. 車載Android開(kāi)發(fā)的前景

讀完以上的內(nèi)容,相信你已經(jīng)對(duì)車載Android的開(kāi)發(fā)有一個(gè)淺顯的認(rèn)識(shí)了。不知道你會(huì)不會(huì)認(rèn)為我在勸你轉(zhuǎn)行做車載Android的開(kāi)發(fā)?答案是NO!

單純的Android應(yīng)用工程師在整車座艙上只能負(fù)責(zé)非常小的一個(gè)技術(shù)領(lǐng)域,這就已經(jīng)決定了這個(gè)職業(yè)的發(fā)展高度,如果想突破這層天花板,就必須要深入到Android系統(tǒng)的底層,掌握Framework、HAL甚至于Native的一些運(yùn)行原理。除此以外,Linux、汽車相關(guān)的知識(shí)也是需要額外學(xué)習(xí)的。

就目前而言,車載Android開(kāi)發(fā)依然有著不錯(cuò)的前景,但還遠(yuǎn)沒(méi)有達(dá)到曾經(jīng)的移動(dòng)互聯(lián)網(wǎng)的熱度,甚至可能以后也不會(huì)達(dá)到,并且就像曾經(jīng)熱火朝天的移動(dòng)互聯(lián)網(wǎng)一樣,隨著大量開(kāi)發(fā)人員的涌入、汽車制造業(yè)的重新洗牌、供需關(guān)系的改變,總有一天它也會(huì)不可避免的走向下坡路。

我曾經(jīng)后悔過(guò)入行車載開(kāi)發(fā),因?yàn)橄啾仁謾C(jī)應(yīng)用開(kāi)發(fā),所需要學(xué)習(xí)知識(shí)實(shí)在太多太雜,調(diào)試過(guò)程也比手機(jī)應(yīng)用復(fù)雜,但是人這一輩何嘗不是在后悔中度過(guò)的呢?


參考資料

[智能座艙:智能化基礎(chǔ)平臺(tái)及架構(gòu)(下)]
[2020年中國(guó)T-BOX行業(yè)現(xiàn)狀分析,乘用車T-Box裝配率迅速提升「圖」]
[車載操作系統(tǒng)(三):智能座艙操作系統(tǒng)]
[首個(gè)專為先進(jìn)智能駕艙打造的一體化HMI工具——Kanzi One重磅發(fā)布]
[Automotive | Android 開(kāi)源項(xiàng)目 | Android Open Source Project]
[車載以太網(wǎng)-電子發(fā)燒友網(wǎng)]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容