Make から Soong への変換

Android 7.0 リリースより前、ビルドルールの記述と実行には GNU Make のみが使用されていました。Make ビルドシステムは広くサポートされ、使用されていますが、Android の基準では低速で、エラーが発生しやすく、スケーラブルでなく、テストが困難です。Soong ビルドシステムは、Android ビルドに必要な柔軟性を備えています。

このため、プラットフォームのデベロッパーはできるだけ早く Make から Soong に移行することが求められます。サポートを受けるには、android-building の Google グループに質問をお送りください。

Soong とは何か

Soong ビルドシステムは、Android 7.0(Nougat)で Make に代わって導入されました。Kati GNU Make クローンツールと Ninja ビルドシステム コンポーネントを利用して、Android のビルドを高速化します。

一般的な手順については、Android オープンソース プロジェクト(AOSP)の Android Make ビルドシステムの説明をご覧ください。Make から Soong への移行に必要な変更については、Android.mk 作成者のためのビルドシステムの変更点をご覧ください。

主な用語の定義は用語集のビルド関連の項目を、詳細については Soong の参照ファイルをご覧ください。

Make と Soong の比較

Soong 構成(ブループリントまたは .bp)ファイルを使用して、Make の構成と同じ内容を Soong で指定する場合の比較を以下に示します。

Make の例

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)
LOCAL_MODULE := libxmlrpc++
LOCAL_MODULE_HOST_OS := linux

LOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src

LOCAL_SRC_FILES := $(call \
     all-cpp-files-under,src)
include $(BUILD_SHARED_LIBRARY)

Soong の例

cc_library_shared {
     name: "libxmlrpc++",

     rtti: true,
     cppflags: [
           "-Wall",
           "-Werror",
           "-fexceptions",
     ],
     export_include_dirs: ["src"],
     srcs: ["src/**/*.cpp"],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

テスト固有の Soong 構成の例については、シンプルなビルド構成をご覧ください。

Android.bp ファイルのフィールドの説明については、Android.bp ファイル形式を参照してください。

特殊モジュール

特殊モジュール グループには、固有の特徴を持つものがあります。

デフォルト モジュール

デフォルト モジュールを使用すると、複数のモジュールで同じプロパティを繰り返すことができます。 次に例を示します。

cc_defaults {
    name: "gzip_defaults",
    shared_libs: ["libz"],
    stl: "none",
}

cc_binary {
    name: "gzip",
    defaults: ["gzip_defaults"],
    srcs: ["src/test/minigzip.c"],
}

事前ビルド済みモジュール

一部の事前ビルド済みモジュール タイプでは、ソースベースの対応するモジュールと同じ名前を使用できます。たとえば、同じ名前の cc_binary がすでに存在する場合、foo という名前の cc_prebuilt_binary が存在する可能性があります。これにより、デベロッパーは、最終プロダクトに含めるバージョンを柔軟に選択できます。ビルド構成に両方のバージョンが含まれている場合、事前ビルド済みモジュール定義の prefer フラグ値により、優先されるバージョンが決まります。一部の事前ビルド済みモジュールには、名前の先頭が prebuilt ではないものもあります(例: android_app_import)。

名前空間モジュール

Android が完全に Make を Soong に切り替えるまでは、Make プロダクト構成で PRODUCT_SOONG_NAMESPACES 値を指定する必要があります。その値は、Soong から Make にエクスポートされて m コマンドでビルドされる名前空間のスペース区切りリストでなければなりません。Android が Soong への変換を完了すると、名前空間を有効にするための詳細な仕様が変わる可能性があります。

Soong では、各モジュールが別々の名前空間内で宣言されていれば、異なるディレクトリ内のモジュールで同じ名前を指定できます。名前空間は次のようにして宣言できます。

soong_namespace {
    imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}

名前空間には name プロパティがなく、そのパスが自動的に名前として割り当てられます。

各 Soong モジュールには、ツリー内の場所に基づいて名前空間が割り当てられます。 各 Soong モジュールは、現在のディレクトリまたは最も近い祖先ディレクトリの Android.bp ファイルにある soong_namespace で定義された名前空間に存在すると見なされます。そのような soong_namespace モジュールが見つからない場合、モジュールは暗黙的なルート名前空間に存在すると見なされます。

たとえば、名前空間 I1、I2、I3… をインポートする名前空間 N 内のモジュール M によって宣言された依存関係 D を Soong が解決しようとする例を考えてみましょう。

  1. D が //namespace:module の形式の完全修飾名である場合、指定されたモジュール名に対する指定された名前空間のみが検索されます。
  2. そうでない場合、Soong はまず、名前空間 N で宣言された D という名前のモジュールを探します。
  3. そのようなモジュールが存在しない場合、Soong は名前空間 I1、I2、I3… で D という名前のモジュールを探します。
  4. 最後に、Soong はルート名前空間を探します。