1. Android.bp ファイルとは何ですか?
Android.bp ファイルは、最初は Android システムのコンパイル構成ファイルであり、元の Android.mk
ファイルを置き換えるために使用されます。Android 7.0 より前の Android では、make を使用して各モジュールのコンパイルを整理しており、対応するコンパイル
構成ファイルは Android.mk でした。
Android7.0から、Googleはコンパイルにninjaとkatiを導入しましたが、なぜninjaを導入したのでしょうか? Android が大きくなるにつれ、モジュールが増え、コンパイル時間がますます長くなるため、ninja を使用すると、make と比較してコンパイルの並行処理が大幅に改善されます。Ninja の構成ファイルは Android.bp であり、Android システムは Blueprint および Soong ツールを使用して Android.bp を分析し、ninja ファイルに変換します。古い mk 構成ファイルと互換性を持たせるために、Android は mk ファイルを変換して ninja を生成する Kati ツールも開発しました.現在、Android Q はまだ Android.mk メソッドをサポートしています. 将来のバージョンでは、mk ファイルは完全に破棄され、同時に Kati は削除され、bp の構成方法のみが保持されると思われるため、事前に bp を学習する必要があります
。
これには、Ninja、kati、Soong、および bp の概念が含まれており、次に簡単に紹介します。
1.1 忍者
Ninja はコンパイル フレームワークであり、ninja 形式の対応する構成ファイルに従ってコンパイルされますが、ninja ファイルは通常、手動で変更するのではなく、Android.bp ファイルを ninja 形式のファイルに変換することによってコンパイルされます。
1.2 Android.bp
Android.bp の出現は、Android.mk ファイルを置き換えることです。mk ファイルとは異なり、bp は純粋な構成であり、分岐やループなどのフロー制御がなく、算術演算や論理演算を実行できません。制御ロジックが必要な場合は、Go 言語でしか記述できません。
1.3 スン
Soong は以前の Makefile コンパイル システムのコアに似ており、Android.bp セマンティック分析を提供し、それを Ninja ファイルに変換します。また、Soong は androidmk コマンドをコンパイルして生成し、Android.mk ファイルを Android.bp ファイルに変換しますが、この変換関数は、分岐、ループ、およびその他のフロー制御のない Android.mk に対してのみ有効です。
1.4 青写真
Blueprint は、Soong の一部である Android.bp を生成および解析するためのツールです。Soong は Android のコンパイル用に設計されたツールを担当していますが、Blueprint はファイル形式のみを解析し、Soong はコンテンツの特定の意味を解析します。Blueprint も Soong も Golang で書かれたプロジェクトですが、Android 7.0 からコンパイル時に使用される prebuilts/go/ ディレクトリ配下に Golang が必要とする実行環境が追加されます。
1.5 ミディアム
kati は Android 用に特別に開発された Golang および C++ ベースのツールで、主な機能は Android の Android.mk ファイルを Ninja ファイルに変換することです。コード パスは build/kati/ で、コンパイルされた製品は ckati です。
2. 文法上の対応規則
Android.mk の文法に慣れてきたので、今度は Android.bp に変更する必要があります. 簡単に理解できるように、ソース コードを見つけて、Android.mk と Android.bp の間の文法の対応規則を確認してください。
ソース コードの場所: /build/soong/androidmk/cmd/androidmk/android.go、ここでは一部のみを貼り付けます。完全なコードについてはソース ファイルを確認してください。
var moduleTypes = map[string]string{
"BUILD_SHARED_LIBRARY": "cc_library_shared",
"BUILD_STATIC_LIBRARY": "cc_library_static",
"BUILD_HOST_SHARED_LIBRARY": "cc_library_host_shared",
"BUILD_HOST_STATIC_LIBRARY": "cc_library_host_static",
"BUILD_HEADER_LIBRARY": "cc_library_headers",
"BUILD_EXECUTABLE": "cc_binary",
"BUILD_HOST_EXECUTABLE": "cc_binary_host",
"BUILD_NATIVE_TEST": "cc_test",
"BUILD_HOST_NATIVE_TEST": "cc_test_host",
"BUILD_NATIVE_BENCHMARK": "cc_benchmark",
"BUILD_HOST_NATIVE_BENCHMARK": "cc_benchmark_host",
"BUILD_JAVA_LIBRARY": "java_library_installable", // will be rewritten to java_library by bpfix
"BUILD_STATIC_JAVA_LIBRARY": "java_library",
"BUILD_HOST_JAVA_LIBRARY": "java_library_host",
"BUILD_HOST_DALVIK_JAVA_LIBRARY": "java_library_host_dalvik",
"BUILD_PACKAGE": "android_app",
"BUILD_CTS_EXECUTABLE": "cc_binary", // will be further massaged by bpfix depending on the output path
"BUILD_CTS_SUPPORT_PACKAGE": "cts_support_package", // will be rewritten to android_test by bpfix
"BUILD_CTS_PACKAGE": "cts_package", // will be rewritten to android_test by bpfix
"BUILD_CTS_TARGET_JAVA_LIBRARY": "cts_target_java_library", // will be rewritten to java_library by bpfix
"BUILD_CTS_HOST_JAVA_LIBRARY": "cts_host_java_library", // will be rewritten to java_library_host by bpfix
}
var prebuiltTypes = map[string]string{
"SHARED_LIBRARIES": "cc_prebuilt_library_shared",
"STATIC_LIBRARIES": "cc_prebuilt_library_static",
"EXECUTABLES": "cc_prebuilt_binary",
"JAVA_LIBRARIES": "java_import",
"ETC": "prebuilt_etc",
}
3. Android.mk ファイルを Android.bp に変換する方法
1. プロジェクト ソース コード内:
1.ソースビルド/envsetup.sh
2. ランチ xxx
3.androidmkを作る
androidmk 変換ツールを生成します。パスは次のとおりです: /out/soong/host/linux-x86/bin/androidmk
2. 変換する Android.mk ファイルをこのディレクトリに直接配置し、次のコマンドを実行します。
androidmk Android.mk > Android.bp
4. 文法解説
理解を容易にするために、Android.mk と Android.bp の構文を一緒に理解する方が簡単です。
4.1 さまざまなタイプのモジュールのコンパイル
4.1.1 Java ライブラリにコンパイルする
Android.mk
include $(BUILD_JAVA_LIBRARY)
Android.bp
java_library {
......
}
4.1.2 Java スタティック ライブラリにコンパイルする
Android.mk
include $(BUILD_STATIC_JAVA_LIBRARY)
Android.bp
java_library_static {
......
}
4.1.3 App アプリケーションへのコンパイル
Android.mk
include $(BUILD_PACKAGE)
Android.bp
android_app {
......
}
4.1.4ネイティブ 動的ライブラリ へのコンパイル
Android.mk
include $(BUILD_SHARED_LIBRARY)
Android.bp
cc_library_shared {
......
}
4.1.5 ネイティブ スタティック ライブラリへのコンパイル
Android.mk
include $(BUILD_STATIC_LIBRARY)
Android.bp
cc_library_static {
......
}
4.1.6 ネイティブ実行プログラムへのコンパイル
Android.mk
include $(BUILD_EXECUTABLE)
Android.bp
cc_binary {
......
}
4.1.7 ヘッダファイルライブラリへのコンパイル
Android.mk
include $(BUILD_HEADER_LIBRARY)
Android.bp
cc_library_headers {
......
}
4.2 ファイルパス
4.2.1 ローカルヘッダーファイルのパス
Android.mk
LOCAL_C_INCLUDES :=
Android.bp
local_include_dirs: ["xxx", ...]
4.2.2 エクスポートされたヘッダー ファイルのパス
Android.mk
LOCAL_EXPORT_C_INCLUDE_DIRS :=
Android.bp
export_include_dirs: ["xxx", ...]
4.2.3 リソースファイルのパス
Android.mk
LOCAL_RESOURCE_DIR :=
Android.bp
resource_dirs: ["xxx", ...]
4.3 ライブラリの依存関係
4.3.1 依存静的ライブラリ
Android.mk
LOCAL_STATIC_LIBRARIES :=
Android.bp
static_libs: ["xxx", "xxx", ...]
4.3.2 依存動的ライブラリ
Android.mk
LOCAL_SHARED_LIBRARIES :=
Android.bp
shared_libs: ["xxx", "xxx", ...]
4.3.3 依存ヘッダー ファイル ライブラリ
Android.mk
LOCAL_JAVA_LIBRARIES :=
Android.bp
header_libs: ["xxx", "xxx", ...]
4.3.4 依存 Java ライブラリ
Android.mk
LOCAL_STATIC_JAVA_LIBRARIES :=
Android.bp
static_libs: ["xxx", "xxx", ...]
4.4 異なるパーティションへのインストール
4.4.1 ベンダーへのインストール
Android.mk
LOCAL_VENDOR_MODULE := true
or
LOCAL_PROPRIETARY_MODULE := true
Android.bp
proprietary: true
or
vendor: true
4.4.2 製品へのインストール
Android.mk
LOCAL_PRODUCT_MODULE := true
Android.bp
product_specific: true
4.4.3 odm へのインストール
Android.mk
LOCAL_ODM_MODULE := true
Android.bp
device_specific: true
4.5 コンパイルパラメータ
4.5.1 C フラグ
Android.mk
LOCAL_CFLAGS :=
Android.bp
cflags: ["xxx", "xxx", ...]
4.5.2 Cpp フラグ
Android.mk
LOCAL_CPPFLAGS :=
Android.bp
cppflags: ["xxx", "xxx", ...]
4.5.3 Java フラグ
Android.mk
LOCAL_JAVACFLAGS :=
Android.bp
javacflags: ["xxx", "xxx", ...]