Android.bp學習筆記


1.Android.bp簡介

Android 7.0之后希望用Android.bp替換Android.mk,bp簡單的配置更方便Ninja 文件的產生,而Blueprint和Soong 就此產生。Android 利用Blueprint和Soong 來解析bp文件,經過最終轉換為ninja files。 Blueprint和Soong都是由Golang寫的項目。 從Android Nougat開始,prebuilts/go/ 目錄下新增了Golang所需的運行環境,在編譯時使用。Android.bp以及相關支持,從Android Nougat開始加入,從 Android Oreo(8.0)開始默認開啟。 如果需要在Android Nougat的版本使用,需要在執行編譯時添加變量: make 'USE_SOONG=true' Soong是以前Android基於make的編譯系統的替代品。它以Android.bp文件替代Android.mk,Android.bp文件用類似JSON的簡潔聲明來描述需要構建的模塊。

 

2.例子1

cc_binary {             //編譯成可執行文件,cc_library_shared編譯成動態庫
    name: "bt_test",    //編譯出的可執行文件的名字為bt_test
    vendor: true,       //編譯出來放在/vendor目錄下(默認是放在/system目錄下)
    srcs: ["bt_test.cpp"], //源文件,格式["a.cpp", "b.cpp"]
    cflags: [
        "-Wall",
        "-Werror",
        "-Wno-unused-parameter",
    ],                    //編譯flag
    include_dirs: [
        "hardware/interfaces/halnode/1.0/default",    //用戶值定的頭文件查找路徑
    ],
    shared_libs: [       //編譯依賴的動態庫
        "liblog",
        "libutils",
        "libhidltransport",
        "android.hardware.halnode@1.0",
        "libhidlbase",
        "libbase",
    ],
}

 

2.其它可用選項

subdirs = ["ndk"]   //指定進入下層ndk目錄進行編譯

export_include_dirs: [   //從其他模塊添加頭文件檢索路徑  "include",  "include/camera" ],

export_shared_lib_headers: ["libcamera_metadata"],

local_include_dirs: ["aidl"],   //如果從當前目錄添加路徑時使用,將./aidl目錄加入頭文件的搜索路徑

static_libs: ["libupdater"],   //指定對庫libupdater進行靜態鏈接   static_executable: true,

 

4.官方最全解釋

Android.bp Build Docs (android-8.0.0-r9):http://note.qidong.name/demo/soong_build/

 

5.變量

Android.bp文件可包含頂級變量賦值:

test_srcs = ["src/test.c"],
cc_binary {
    name: "test",
    srcs: test_srcs,
}

變量范圍限定為聲明它們的文件的其余部分,以及任何子藍圖文件。變量是不可變的,但有一個例外 —— 它們可以附上+= 賦值,但僅在變量被引用之前。

 

6.注釋

注釋方式,與Golang類似。 支持行注釋//與塊注釋/* block */。

 

7.操作符

除了賦值的 = 以外,只有 + 。

 

8.默認模塊

默認模塊可用於在多個模塊中重復相同的屬性。

cc_defaults {
    name: "test_defaults",
    shared_libs: ["libz"],
    stl: "none",
}
cc_binary {
    name: "test1",
    defaults: ["test_defaults"],
    srcs: ["src/test/test1.c"],
}

 

9.常用工具

(1)bpfmt 一個是格式化工具bpfmt。 與gofmt類似,可以格式化Blueprint文件。 (其實,代碼基本上都是從gofmt復制而來。)eg 格式化當前目錄及其遞歸子目錄下的所有Android.bp: # bpfmt -w .

(2)androidmk 另一個是androidmk,負責轉換Android.mk為Android.bp, eg: # androidmk Android.mk > Android.bp

 

10.工具鏈關系

Android.mk、Android.bp、Soong、Blueprint、Ninja 簡單的方式表達這幾個概念之間的作用關系

Android.bp --> Blueprint --> Soong --> Ninja

Makefile or Android.mk --> kati --> Ninja   Android.mk --> Soong --> Blueprint --> Android.bp

 

11.針對不同系統進行編譯

system/core/libusbhost$ cat Android.bp 

cc_library {
    name: "libusbhost",
    vendor_available: true,
    vndk: {
        enabled: true,
    },
    host_supported: true,
    srcs: ["usbhost.c"],
    cflags: ["-Werror"],
    export_include_dirs: ["include"],
    target: {
        android: {    //編譯Android上運行的程序
            cflags: [
                "-g",
                "-DUSE_LIBLOG",
            ],
            shared_libs: ["liblog"],
        },
        darwin: {    //編譯darwin上運行的程序
            enabled: false,
        },
    },
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM