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)]