Android編譯系統中的Android.bp、Blueprint與Soong
http://note.qidong.name/2017/08/android-blueprint/
工具鏈關系
Android.mk、Android.bp、Soong、Blueprint、Ninja,它們之間到底有什么關系? 以下用簡單的方式表達這幾個概念之間的作用關系。
Android.bp --> Blueprint --> Soong --> Ninja Makefile or Android.mk --> kati --> Ninja (Android.mk --> Soong --> Blueprint --> Android.bp)
Blueprint是生成、解析Android.bp的工具,是Soong的一部分。 Soong則是專為Android編譯而設計的工具,Blueprint只是解析文件的形式,而Soong則解釋內容的含義。
Android.mk可以通過Soong提供的androidmk
轉換成Android.bp,但僅限簡單配置。 目前Oreo的編譯流程中,仍然是使用kati來做的轉換。
現存的Android.mk、既有的Android.bp,都會分別被轉換成Ninja。 從Android.mk與其它Makefile,會生成out/build-<product_name>.ninja
文件。 而從Android.bp,則會生成out/soong/build.ninja
。 此外,還會生成一個較小的out/combined-<product_name>.ninja
文件,負責把二者組合起來,作為執行入口。
最終,Ninja文件才是真正直接控制源碼編譯的工具。
Android 8.0編譯過程初步分析
https://blog.csdn.net/wear_/article/details/88543353
概述
要想知道編譯的過程,其實看編譯的腳本,以及編譯時產生的log是比較快的方法。
編譯相關的核心文件位於build/core下,而生成的文件在out/soong下,里面有編譯過程中產生的編譯相關文件。
在編譯過程中,首先將所有的android.bp文件收集成out/soong/build.ninja.d,然后以此為基礎生成out/soong/build.ninja規則。而Android.mk收集后生成的是build-aosp_arm.jinja文件。
soong處理后的bp文件生成build.ninja的同時還包含out/soong/Android-aosp_arm.mk,這個文件是編譯完成后模塊的安裝腳本,負責將模塊安裝到對應位置。
在out/soong目錄下有兩個文件.minibootstrap/build.ninja 和.bootstrap/build.ninja兩個目錄。.minibootstrap/build.ninja 主要是用來編譯blueprint和生成.bootstrap/build.ninja。而.bootstrap/build.ninja主要是生成 soong相關工具和out/soong/build.ninja文件。
---------------------
Android8.0.0-r4的編譯系統
https://blog.csdn.net/nwpushuai/article/details/79372837
一、 概述
1.1 編譯系統變化
從Android 7.0開始,android的編譯系統發生了變化,之前依賴Makefile組織編譯系統,從7.0開始逐步引入了kati soong(optional未正式使用,需要USE_SOONG=true開啟),將Android.mk文件轉化成ninja文件,使用ninja文件對編譯系統進行管理。
從8.0開始,android 引入了Android.bp文件來替代之前的Android.mk文件,不同於Android.mk,Android.bp只是純粹的配置文件,不包括分支、循環等流程控制。在android項目上如何進行選擇編譯、解析配置、轉換成ninja等,Soong就被創造出來,將Android.bp轉換為ninja文件進行管理。
同時,Soong還會編譯長生一個androidmk命令可以手動將Android.mk轉換成Android.bp文件。
1.2 代碼位置
Kati的位置是在build/kati/中,平台也自帶編譯好的ckati
Soong的位置在build/soong,它和build/blueprint同時期作用,他們之間的系統關系如下:
Android.bp --> Blueprint --> Soong --> Ninja
Makefile or Android.mk --> kati --> Ninja
Blueprint是生成、解析Android.bp 的工具,是Soong的一部分。Soong是專門為Android的編譯而設計的工具,blueprint只是解析文件的形式,而soong則解釋內容的含義。
Blueprint和Soong都是有Go語言寫的項目,從7.0開始在prebuilts/go/目錄下新增了go語言的運行環境,在編譯是使用。
1.3 Android ninja組織
在編譯過程中,將所有的android.bp文件搜集成out\soong\build.ninja.d , 並以此為基礎生成out\soong\build.ninja規則。
由所有的Android.mk生成build-aosp_arm.ninja文件。通過combined-aosp_arm.ninja將兩個文件組織起來。
builddir = out
include out/build-aosp_arm.ninja
include out/soong/build.ninja
build out/combined-aosp_arm.ninja: phony out/soong/build.ninja
通過編譯的LOG,首先搜集所有的bp文件生成build.ninja,然后搜集所有的mk文件生成build-aosp-arm.ninja文件。
out/soong/.bootstrap/bin/soong_build out/soong/build.ninja
out/build-aosp_arm-cleanspec.ninja is missing, regenerating...
out/build-aosp_arm.ninja is missing, regenerating...
[1/894] including out/soong/Android-aosp_arm.mk ...
經過試驗表明,soong處理后的bp文件生成build.ninja的同時還包含out/soong/Android-aosp_arm.mk,這個文件是編譯完成后模塊的安裝腳本,負責將模塊安裝到對應位置。比如我們現在處理的vndk相關vendor處理就是在這個目錄下進行的。
在out/soong目錄下有兩個文件.minibootstrap/build.ninja 和.bootstrap/build.ninja兩個目錄。.minibootstrap/build.ninja 主要是用來編譯blueprint和生成.bootstrap/build.ninja。而.bootstrap/build.ninja主要是生成 soong相關工具和out/soong/build.ninja文件。
二 、編譯流程
編譯步驟如下:
1、 source build/envsetup.sh:加載命令
2、 lunch:選擇平台編譯選項
3、 make:執行編譯
---------------------
Android編譯系統分析
https://blog.csdn.net/zirconsdu/article/details/8005415
2.2 LOCAL_XXX的列表
Include $(CLEAR_VARS)后,可以做為局部宏定義使用.
說明:
必須定義, 在app或package的Android.mk中必須給定值。
可選定義,在app或package的Android.mk中可以也可以不給定值。
不用定義,在app或package的Android.mk中不要給定值,腳本自動指定值。
LOCAL_PATH, 當前路徑,必須定義。
LOCAL_PACKAGE_NAME, 必須定義,package的名字,這個名字在腳本中將標識app或package。
LOCAL_MODULE_SUFFIX, 不用定義,module的后綴,=.apk。
LOCAL_MODULE, 不用定義,=$(LOCAL_PACKAGE_NAME)。
LOCAL_JAVA_RESOURCE_DIRS, 不用定義。
LOCAL_JAVA_RESOURCE_FILES, 不用定義。
LOCAL_MODULE_CLASS, APPS/ETC(for firmware)/EXECUTABLES/STATIC_LIBRARYS/SHARED_LIBRARYS/JAVA_LIBRARYS
LOCAL_MODULE_TAGS, 可選定義。默認optional。取值范圍user debug eng tests optional samples shell_ash shell_mksh。
LOCAL_ASSET_DIR, 可選定義,推薦不定義。默認$(LOCAL_PATH)/assets
LOCAL_RESOURCE_DIR, 可選定義,推薦不定義。默認product package和device package相應的res路徑和$(LOCAL_PATH)/res。
LOCAL_EXPORT_PACKAGE_RESOURCES, 可選定義,默認null。如果允許app的資源被其它模塊使用,則設置true。
LOCAL_PROGUARD_ENABLED, 可選定義,默認為full,如果是user或userdebug。取值full, disabled, custom。
LOCAL_MANIFEST_FILE AndroidManifest.xml
full_android_manifest, 不用定義,=$(LOCAL_PATH)/AndroidManifest.xml。
LOCAL_CERTIFICATE, 可選定義,默認為testkey。最終
private_key := $(LOCAL_CERTIFICATE).pk8
certificate := $(LOCAL_CERTIFICATE).x509.pem