Google は、黒人コミュニティに対する人種平等の促進に取り組んでいます。取り組みを見る

Java SDK ライブラリの実装

Android プラットフォームには多数の共有 Java ライブラリが含まれており、必要であればアプリ マニフェストの <uses-library> タグを使用してアプリのクラスパスにそれらをインクルードできます。これらのライブラリはアプリによってリンクされているので、互換性、API レビュー、ツールのサポートの点で、他の Android API と同様に扱う必要があります。ただし、ほとんどのライブラリにはこれらの機能がありません。

Android 10 では、共有 Java ライブラリの互換性の問題を解決するための新しいビルドルールとして、java_sdk_library が導入されています。デバイス メーカーは、独自の共有 Java ライブラリにこのメカニズムを使用して、API の下位互換性を維持できます。デバイス メーカーがブート クラスパスの代わりに <uses-library> タグを使用して独自の共有 Java ライブラリを使用している場合、java_sdk_library はそれらの Java ライブラリが API 安定性を持つことを確認できます。

java_sdk_library は、オプションの SDK API をアプリに実装する Java ライブラリです。Make ファイル(Android.bp)内の java_sdk_library を介して実装されたライブラリは、次の操作を実行します。

  • stubsstubs.systemstubs.test を含むスタブ ライブラリを生成します。これらのスタブ ライブラリは、@hide@SystemApi、および @TestApi アノテーションを認識することにより作成されます。それらは、SDK バージョンがそれぞれ currentsystem_currenttest_current の場合、ビルド時に自動的に参照されます。
  • Android はスタブファイルから API リストを取得し、マスターの現行 API リストと最新の公開済み Android バージョンの API リストを比較して、API が下位互換性を維持しているかどうかを確認します。
  • ランタイム用の実装ライブラリがインストールされている場合は、XML ファイルが生成されてインストールされます。
Java SDK ライブラリを使用したビルドフロー
図 1. Java SDK ライブラリを使用したビルドフロー

例とソース

スタブ ライブラリの最小限の構成要素は、必須の srcsapi_packages のプロパティです。

java_sdk_library {
        name: "com.android.future.usb.accessory",
        srcs: ["src/**/*.java"],
        api_packages: ["com.android.future.usb"],
    }

ランタイムに使用する実装ライブラリをビルドするには、hostdexcompile_dexerrorprone など、すべての java_library プロパティに値を設定します。

java_sdk_library {
        name: "android.test.base",

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

        errorprone: {
          javacflags: ["-Xep:DepAnn:ERROR"],
        },

        hostdex: true,

        api_packages: [
            "android.test",
            "android.test.suitebuilder.annotation",
            "com.android.internal.util",
            "junit.framework",
        ],

        compile_dex: true,
    }

スタブ ライブラリを作成するには、srcs_libsrcs_lib_whitelist_dirssrcs_lib_whitelist_pkgsmerge_annotations_dirsmerge_inclusion_annotations_dirs などの droidstubs プロパティに値を設定します。スタブ ライブラリには次のプロパティを使用することもできます。

  • api_srcs: API には含まれるが、ランタイム ライブラリには含まれないオプションのソースファイルのリスト。
  • stubs_only_libs: スタブをビルドする際のクラスパスに存在する Java ライブラリのリスト。
  • hidden_api_packages: API から隠蔽する必要があるパッケージ名のリスト。
  • droiddoc_options: metalava 用の追加の引数。
    java_sdk_library {
              name: "android.test.mock",
    
              srcs: ["src/**/*.java"],
    
              api_packages: [
                  "android.test.mock",
              ],
    
              srcs_lib: "framework",
              srcs_lib_whitelist_dirs: ["core/java"],
              srcs_lib_whitelist_pkgs: ["android"],
              compile_dex: true,
          }

下位互換性の維持

ビルドシステムは、ビルド時に生成された API ファイルと最新の API ファイルを比較して、API が下位互換性を維持しているかどうかをチェックします。このチェックは、prebuilt_apis という新しいビルドルールを使用して行われます。このルールにより、事前ビルド済みのスタブ ライブラリ モジュールと API リスト モジュールが作成されます。java_sdk_library でビルドされたすべてのライブラリでは、prebuilt_apis の最新バージョンの api_dirs に API ファイルが存在する必要があります。このバージョンをリリースすると、PRODUCT-sdk_phone_armv7-sdk を備えた配布ビルドで、API リストファイルとスタブ ライブラリを取得できます。

api_dirs プロパティは、prebuilt_apis に含まれる API バージョン ディレクトリのリストです。API バージョン ディレクトリは、Android.bp と同じディレクトリ レベルに配置する必要があります。

prebuilt_apis {
        name: "sdk",
        api_dirs: [
            "1",
            "2",
              ....
            "28",
            "current",
        ],
    }

prebuilts ディレクトリの下の version/scope/api/ 構造を使用してディレクトリを構成します。version は API レベルに対応し、scope はディレクトリが public、system、test のいずれであるかを示します。

  • version/scope には Java ライブラリを格納します。
  • version/scope/api には API の .txt ファイルを格納します。module_name.txtmodule_name-removed.txt という名前の空のテキスト ファイルをここに作成します。
    ├── 28
          │   ├── public
          │   │   ├── api
          │   │   │   ├── android.test.base-removed.txt
          │   │   │   └── android.test.base.txt
          │   │   └── android.test.base.jar
          │   ├── system
          │   │   ├── api
          │   │   │   ├── android.test.base-removed.txt
          │   │   │   └── android.test.base.txt
          │   │   └── android.test.base.jar
          │   └── test
          │       ├── api
          │       │   ├── android.test.base-removed.txt
          │       │   └── android.test.base.txt
          │       └── android.test.base.jar
          └── Android.bp