ndk-build 指令碼

ndk-build 指令碼使用 NDK 基於 Make 的建構系統建構專案。我們針對 ndk-build 使用的 Android.mkApplication.mk 設定提供了更詳細的說明文件。

內部原理

執行 ndk-build 指令碼相當於執行下列指令:

$GNUMAKE -f <ndk>/build/core/build-local.mk
<parameters>

$GNUMAKE 指向 GNU Make 3.81 以上版本,<ndk> 則指向 NDK 安裝目錄。您可以使用這項資訊從其他殼層指令碼 (或甚至從自己的 Make 檔案) 叫用 ndk-build。

從指令列叫用

ndk-build 指令碼位於 NDK 安裝目錄頂層。如要從指令列執行這個指令碼,請在應用程式專案目錄或其子目錄中進行叫用。 例如:

$ cd <project>
$ <ndk>/ndk-build

在這個範例中,<project> 指向專案的根目錄,<ndk> 則是您安裝 NDK 的目錄。

選項

所有 ndk-build 的參數都會直接傳遞給執行 NDK 建構指令碼的基礎 GNU make 指令。請搭配使用 ndk-build 和表單 ndk-build <option> 中的選項。例如:

$ ndk-build clean

可用的選項如下:

clean
移除所有之前產生的二進位檔。

注意:在 Mac OS X 中,執行 ndk-build clean 時如有大量平行執行作業,可能會發生包含下列訊息的建構錯誤:

rm: fts_read: No such file or directory

為了避免這個問題,建議不要使用 -jN 修飾符,或為 N 選取較小的值 (例如 2)。

V=1
啟動建構作業,並顯示建構指令。
-B
強制執行完整的重新建構。
-B V=1
強制執行完整的重新建構,並顯示建構指令。
NDK_LOG=1
顯示內部 NDK 記錄訊息 (用於偵錯 NDK 本身)。
NDK_DEBUG=1
強制執行可進行偵錯的建構 (參閱表 1)。
NDK_DEBUG=0
強制執行發布子版本 (參閱表 1)。
NDK_HOST_32BIT=1
一律使用 32 位元模式的工具鏈。
NDK_APPLICATION_MK=<file>
使用 NDK_APPLICATION_MK 變數指向的特定 Application.mk 檔案進行建構。
-C <project>
建構位於 <project> 的專案路徑的原生程式碼。如果不想在終端機透過 cd 切換到這個路徑,這項功能將非常實用。

可進行偵錯與發布子版本

使用 NDK_DEBUG 選項 (在特定情況下搭配使用 AndroidManifest.xml) 來指定偵錯子版本或發布子版本、最佳化相關行為以及是否包含符號。表 1 顯示了每個可能的設定組合結果。

表 1. NDK_DEBUG (指令列) 和 android:debuggable (資訊清單) 組合的結果。

資訊清單設定NDK_DEBUG=0NDK_DEBUG=1未指定 NDK_DEBUG
android:debuggable="true"偵錯;符號;最佳化*1 偵錯;符號;未最佳化*2(與 NDK_DEBUG=1 相同)
android:debuggable="false"發布;符號;最佳化 發布;符號;未最佳化發布;無符號;最佳化*3
*1:有助於進行剖析。
*2:用於執行 ndk-gdb 的預設值。
*3: 預設模式。

注意:「NDK_DEBUG=0」等同於「APP_CLICKIM=release」,並使用「-O2」編譯。「NDK_DEBUG=1」等同於「Application.mk」中的「APP_OptIM=debug」,並使用「-O0」編譯。如要進一步瞭解「APP_optIM」,請參閱 Application.mk

指令列的語法範例如下:

$ ndk-build NDK_DEBUG=1

要求

一般來說,您需要 GNU Make 4 才能使用 ndk-build 或 NDK。NDK 包含其自己的 GNU Make 副本,除非您將 $GNUMAKE 環境變數設為指向不適當的 Make,否則 NDK 將會使用這個副本。

JSON 編譯資料庫

在 NDK r18 以上版本中,ndk-build 可以產生 JSON 編譯資料庫

您可以使用 ndk-build compile_commands.json 產生資料庫而無需建構程式碼,也可以使用 ndk-build GEN_COMPILE_COMMANDS_DB=true 建構程式碼,同時產生資料庫。