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í)還不是非常火熱的車載Android領(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ú)效應(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)畫(huà)反饋跛璧,大大提升了界面的美觀性和易用性。目前車載開(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é)在座艙中控叨吮,編寫(xiě)各類型的應(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í)際上手編寫(xiě)一個(gè)系統(tǒng)級(jí)應(yīng)用。

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

編寫(xiě)Android系統(tǒng)應(yīng)用與普通的Android應(yīng)用基本相同幢痘,我們首先在AndroidStudio中編寫(xiě)一個(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拟蜻,前提是它們的證書(shū)集相同。具有相同用戶 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源碼編譯后活烙,我們將編寫(xiě)好的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)的是啸盏,這種基于原生的寫(xiě)法重贺,并不常用。實(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)用舟茶,需要編寫(xiě)一個(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)系作者
  • 序言:七十年代末俺猿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子格仲,更是在濱河造成了極大的恐慌押袍,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件凯肋,死亡現(xiàn)場(chǎng)離奇詭異谊惭,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)侮东,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門圈盔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人悄雅,你說(shuō)我怎么就攤上這事驱敲。” “怎么了煤伟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵癌佩,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我便锨,道長(zhǎng)围辙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任放案,我火速辦了婚禮姚建,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吱殉。我一直安慰自己掸冤,他們只是感情好厘托,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著稿湿,像睡著了一般铅匹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上饺藤,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天包斑,我揣著相機(jī)與錄音,去河邊找鬼涕俗。 笑死罗丰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的再姑。 我是一名探鬼主播萌抵,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼元镀!你這毒婦竟也來(lái)了绍填?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤凹联,失蹤者是張志新(化名)和其女友劉穎沐兰,沒(méi)想到半個(gè)月后哆档,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體蔽挠,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年瓜浸,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了澳淑。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡插佛,死狀恐怖杠巡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情雇寇,我是刑警寧澤氢拥,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站锨侯,受9級(jí)特大地震影響嫩海,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜囚痴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一叁怪、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧深滚,春花似錦奕谭、人聲如沸涣觉。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)官册。三九已至,卻和暖如春难捌,著一層夾襖步出監(jiān)牢的瞬間攀隔,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工栖榨, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留昆汹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓婴栽,卻偏偏與公主長(zhǎng)得像满粗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子愚争,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容