天天看點

[Android 基礎] -- 了解 Android.bp一、簡介二、Android.bp 文法

本文轉自于:http://gityuan.com/2018/06/02/android-bp/
介紹 Android 最新的編譯系統

一、簡介

早期的 Android 系統都是采用 Android.mk 的配置來編譯源碼,從 Android 7。0 開始引入 Android.bp。很明顯 Android.bp 的出現就是為了替換掉 Android.mk。

再來說一說跟着 Android 版本相應的發展演變過程:

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

轉換關系圖如下:

[Android 基礎] -- 了解 Android.bp一、簡介二、Android.bp 文法

通過 Kati 将 Android.mk 轉換成 ninja 格式的檔案,通過 Blueprint + Soong 将 Android.bp 轉換成 ninja 格式的檔案,通過 androidmk 将 Android.mk 轉換成 Android.bp,但針對沒有分支、循環等流程控制的 Android.mk 才有效。

這裡涉及到 Ninja,Kati,Soong,bp 概念,接下來分别簡單介紹一下。

1、Ninja

Ninja 是一個編譯架構,會根據相應的 ninga 根式的配置檔案進行編譯,但是 ninja 檔案一般不會手動修改,而是通過将 Android.bp 檔案轉換成 ninja 格式檔案來編譯。

2、Android.bp

Android.bp 的出現就是為了替換 Android.mk 檔案。bp 跟 mk 檔案不同,它是純粹的配置,沒有分支、循環等流程控制,不能做算數邏輯運算。如果需要控制邏輯,那麼隻能通過 Go 語言編寫。

3、Soong

Soong 類似于之前的 Makefile 編譯系統的核心,負責提供 Android.bp 語義解析,并将之轉換成 Ninja 檔案。Soong 還會編譯生成一個 android 指令,用于将 Android.mk 檔案轉換成 Android.bp 檔案,不過這個轉換功能僅限于滅有分支、循環等流程控制的 Android.mk 才有效。

4、Blueprint

Blueprint 是生成、解析 Android.bp 的工具,是 Soong 的一部分。Soong 負責 Android 編譯而設計的工具,而 Blueprint 隻是解析檔案格式,Soong 解析檔案的内容含義。Blueprint 和 Soong 都是由 Golang 寫的項目,從 Android 7.0,prebuilts/go/ 目錄下新增 Golang 所需的運作環境,在編譯時使用。

5、Kati

kati 是專為 Android 開發的一個基于 Golang 和 C++ 的工具,主要功能是把 Android 中的 Android.mk 檔案轉換為 Ninja 檔案。代碼路徑是 build/kati/,編譯後的産物是 ckati。

二、Android.bp 文法

Android.bp 是一種純粹的配置檔案,設計簡單,沒有條件判斷或控制流語句,采用的 Go 語言編寫控制邏輯。

Android.bp 檔案記錄着子產品資訊,每一個子產品以子產品類型開始,後面跟着一組子產品的屬性,以名值對(name:value)表示,每個子產品都必須有一個 name 屬性。基本格式,以 frameworks/base/services/Android.bp 檔案為例:

java_library {
    name: "services",

    dex_preopt: {
        app_image: true,
        profile: "art-profile",
    },

    srcs: [
        "java/**/*.java",
    ],

    static_libs: [
        "services.core",
        "services.accessibility",
        "services.appwidget",
        "services.autofill",
        "services.backup",
        "services.companion",
        "services.coverage",
        "services.devicepolicy",
        "services.midi",
        "services.net",
        "services.print",
        "services.restrictions",
        "services.usage",
        "services.usb",
        "services.voiceinteraction",
        "android.hidl.base-V1.0-java",
    ],

    libs: [
        "android.hidl.manager-V1.0-java",
        "miuisdk",
        "miuisystemsdk"
    ],

}

cc_library_shared {
    name: "libandroid_servers",
    defaults: ["libservices.core-libs"],
    whole_static_libs: ["libservices.core"],
}