Android Ninja實踐

如果有自己編譯過AOSP的源碼牺勾,可能大家都會遇到這樣的一個問題:

ninja: error: '*******', needed by '*********', missing and no known rule to make it

在剛剛開始接觸AOSP的時候正罢,我基本上都會直奔主題,大概清楚問題后禽最,然后解決問題腺怯、重新編譯,所以一直都沒有注意到一個關(guān)鍵字:"Ninja"川无,今天我們就一起來學習/實踐一下這個"熟悉的陌生人"呛占,主要介紹一下目前Android的編譯系統(tǒng),以及以一個小Demo為例懦趋,實踐一下Ninja的使用晾虑,如果想了解更多關(guān)于Ninja在AOSP中的使用,見參考鏈接。

一帜篇、Android編譯系統(tǒng)

早期的Android系統(tǒng)采用Android.mk的配置來編譯源碼糙捺,從Android 7.0開始引入Android.bp粤剧。大體梳理一下Android版本相應的發(fā)展演變過程:

  • Android 7.0引入ninja和kati
  • Android 8.0使用Android.bp來替換Android.mk谤逼,引入Soong
  • Android 9.0強制使用Android.bp
Android Build

上圖就是各個文件之間的轉(zhuǎn)化關(guān)系网棍,這里涉及到Ninja, kati, Soong, bp概念篷扩,簡單介紹一下:

1. Ninja

ninja是一個編譯框架,會根據(jù)相應的ninja格式的配置文件進行編譯潮孽,但是ninja文件一般不會手動修改喻粹,而是通過將Android.bp文件轉(zhuǎn)換成ninja格文件來編譯帜慢。

2. Android.bp

Android.bp的出現(xiàn)就是為了替換Android.mk文件坏快。bp跟mk文件不同铅檩,它是純粹的配置,沒有分支莽鸿、循環(huán)等流程控制昧旨,不能做算數(shù)邏輯運算。如果需要控制邏輯祥得,那么只能通過Go語言編寫兔沃。

3. Soong

Soong類似于之前的Makefile編譯系統(tǒng)的核心,負責提供Android.bp語義解析级及,并將之轉(zhuǎn)換成Ninja文件粘拾。Soong還會編譯生成一個androidmk命令,用于將Android.mk文件轉(zhuǎn)換為Android.bp文件创千,不過這個轉(zhuǎn)換功能僅限于沒有分支、循環(huán)等流程控制的Android.mk才有效入偷。

4. Blueprint

Blueprint是生成追驴、解析Android.bp的工具,是Soong的一部分疏之。Soong負責Android編譯而設計的工具殿雪,而Blueprint只是解析文件格式,Soong解析內(nèi)容的具體含義锋爪。Blueprint和Soong都是由Golang寫的項目丙曙,從Android 7.0,prebuilts/go/目錄下新增Golang所需的運行環(huán)境其骄,在編譯時使用亏镰。

5. Kati

kati是專為Android開發(fā)的一個基于Golang和C++的工具,主要功能是把Android中的Android.mk文件轉(zhuǎn)換成Ninja文件拯爽。代碼路徑是build/kati/索抓,編譯后的產(chǎn)物是ckati。

二、Ninja的介紹

從上面我們可以看到逼肯,Android最后的編譯工作都會交給Ninja耸黑,那么它到底是個什么東西呢,為什么Google需要在Android引入Ninja呢篮幢?

Ninja is a small build system with a focus on speed. It differs from other build systems in two major respects: it is designed to have its input files generated by a higher-level build system, and it is designed to run builds as fast as possible.

Ninja是一個專注于速度的構(gòu)建系統(tǒng)大刊,和其他構(gòu)建系統(tǒng)相比,主要有兩點不同:

  • Ninja的輸入文件一般都是有更高級的構(gòu)建系統(tǒng)產(chǎn)生的三椿,比如cmake缺菌;
  • Ninja設計之初就是為了更快的構(gòu)建;

其實從第一點赋续,我們就能看出來Ninja的設計哲學:相比Makefile是設計出來給人手寫的男翰,但是Ninja設計出來是給其它程序生成的。 如果說Makefile是C語言纽乱,那么Ninja就是匯編語言蛾绎。 如果說Makefile是一個DSL,那么Ninja就是一種配置文件鸦列。 Makefile支持分支租冠、循環(huán)等流程控制,而Ninja只支持一些固定形式的配置薯嗤。

三顽爹、Ninja的實踐

工欲善其事,必先利其器骆姐,所以我們需要先準備好相關(guān)工具:CMake镜粤,ninja,以Mac OS為例玻褪,安裝步驟為:

brew install cmake
brew install ninja

正式開始肉渴,以一個最簡單的Hello,Ninja為例:

  • main.cpp
#include <iostream>
int main() {
  std::cout << "Hello, Ninja!" << std::endl;
  return 0;
}
  • CMakeLists.txt
cmake_minimum_required(VERSION 3.13)
project(ninja)

set(CMAKE_CXX_STANDARD 14)

add_executable(ninja main.cpp)

OK带射,一個簡單的Hello同规,Ninja的C++工程已經(jīng)完成,接下來我們開始編譯窟社,使用如下命令券勺,生成build.ninja文件:

[min@bogon:] ninja $ cmake -G Ninja -B build .
-- The C compiler identification is AppleClang 9.1.0.9020039
-- The CXX compiler identification is AppleClang 9.1.0.9020039
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc
-- Check for working C compiler: /Library/Developer/CommandLineTools/usr/bin/cc -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Detecting C compile features
-- Detecting C compile features - done
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++
-- Check for working CXX compiler: /Library/Developer/CommandLineTools/usr/bin/c++ -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- Configuring done
-- Generating done
-- Build files have been written to: /Users/min/Desktop/workspace/c/ninja/build

可以看到在build目錄下,生成了如下文件:

[min@bogon:] build $ tree  -L 2
.
├── CMakeCache.txt
├── CMakeFiles
│   ├── 3.15.5
│   ├── CMakeOutput.log
│   ├── CMakeTmp
│   ├── TargetDirectories.txt
│   ├── cmake.check_cache
│   └── ninja.dir
├── build.ninja
├── cmake_install.cmake
└── rules.ninja

其中最重要的就是這個build.ninja文件灿里,接下來关炼,我們使用Ninja命令,開始編譯:

[min@bogon:] ninja $ cd build/
[min@bogon:] build $ ninja
[2/2] Linking CXX executable ninja
[min@bogon:] build $ ./ninja
Hello, Ninja!

至此匣吊,一個簡單的Hello, Ninja!就已經(jīng)實踐完成了盗扒,具體關(guān)于AOSP中Ninja的編譯跪楞,希望大家可以自己去摸索一下~

四、參考

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末侣灶,一起剝皮案震驚了整個濱河市甸祭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌褥影,老刑警劉巖池户,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凡怎,居然都是意外死亡校焦,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門统倒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來寨典,“玉大人,你說我怎么就攤上這事房匆∷食桑” “怎么了?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵浴鸿,是天一觀的道長井氢。 經(jīng)常有香客問我岳链,道長花竞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任掸哑,我火速辦了婚禮约急,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘苗分。我一直安慰自己烤宙,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布俭嘁。 她就那樣靜靜地躺著,像睡著了一般服猪。 火紅的嫁衣襯著肌膚如雪供填。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天罢猪,我揣著相機與錄音近她,去河邊找鬼。 笑死膳帕,一個胖子當著我的面吹牛粘捎,可吹牛的內(nèi)容都是我干的薇缅。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼攒磨,長吁一口氣:“原來是場噩夢啊……” “哼泳桦!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起娩缰,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤灸撰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拼坎,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浮毯,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年泰鸡,在試婚紗的時候發(fā)現(xiàn)自己被綠了债蓝。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡盛龄,死狀恐怖饰迹,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情讯嫂,我是刑警寧澤蹦锋,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站欧芽,受9級特大地震影響莉掂,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜千扔,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一憎妙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧曲楚,春花似錦厘唾、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至趟大,卻和暖如春鹤树,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背逊朽。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工罕伯, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叽讳。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓追他,卻偏偏與公主長得像坟募,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子邑狸,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

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

  • 一 概述 1.1 編譯系統(tǒng)變化 隨著android工程越來越大懈糯,包含的module越來越多,以makefile...
    Little熊貓閱讀 30,481評論 4 15
  • 參考 Android soong build系統(tǒng)介紹:http://www.reibang.com/p/8001...
    f9a278f67ea9閱讀 2,655評論 0 1
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,699評論 0 3
  • 一 blueprint介紹 之前我們介紹推溃,blueprint負責解析Android.bp文件內(nèi)容昂利,我的理解是blu...
    Little熊貓閱讀 5,619評論 0 5
  • 樹葉隨秋風搖個不停 貪戀那些錯過的風景 你總向往遠方向往著杳無音訊 快樂就像天邊的云 路燈總是在深夜亮起 雨季卻喜...
    思人樹閱讀 228評論 0 0