Google is committed to advancing racial equity for Black communities. See how.
本頁面由 Cloud Translation API 翻譯而成。
Switch to English

實施Java SDK庫

Android平台包含大量共享Java庫,可以選擇<uses-library>應用清單中的<uses-library>標籤將其包含在應用的類路徑中。由於應用程序鏈接到這些庫,因此在兼容性,API審查和工具支持方面,應像對待其他Android API一樣對待它們。但是,大多數庫沒有這些功能。

Android 10引入了java_sdk_library ,這是一個新的構建規則, java_sdk_library共享Java庫的兼容性問題。設備製造商可以將這種機制用於自己的共享Java庫,以保持其API的向後兼容性。如果設備製造商通過<uses-library>標記而不是java_sdk_library路徑使用自己的共享Java庫,則java_sdk_library可以驗證這些Java庫是否對API穩定。

java_sdk_library是一個Java庫,為應用程序實現了可選的SDK API。通過make文件( Android.bp )中的java_sdk_library實現的庫執行以下操作:

  • 生成存根庫以包括stubsstubs.systemstubs.test 。這些存根庫是通過識別@hide@SystemApi@TestApi註釋創建的。在構建時,當SDK版本分別為currentsystem_currenttest_current時,將自動引用它們。
  • Android通過存根文件獲取API列表,並通過將master中的當前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"],
    }

要構建用於運行時的impl庫,請填充所有java_library屬性,例如hostdexcompile_dexerrorprone

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,
    }

要創建存根庫,請填充droidstubs屬性,例如srcs_libsrcs_lib_whitelist_dirssrcs_lib_whitelist_pkgsmerge_annotations_dirsmerge_inclusion_annotations_dirs 。您還可以將這些屬性用於存根庫:

  • api_srcs :可選源文件的列表,它們是API的一部分,但不是運行時庫的一部分。
  • stubs_only_libs :構建存根時,類路徑中的Java庫的列表。
  • hidden_api_packages :必須從API中隱藏的軟件包名稱列表。
  • droiddoc_optionsdroiddoc_options附加參數。
    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構建的所有庫java_sdk_library必須在prebuilt_apis中的最新版本api_dirs中具有API文件。發布版本時,可以使用PRODUCT-sdk_phone_armv7-sdk dist build獲得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決定目錄是公共目錄,系統目錄還是測試目錄。

  • 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