Implementacja biblioteki Java SDK

Platforma Android zawiera dużą ilość współdzielonych bibliotek Java, które mogą być ewentualnie zawarte w ścieżce klasy aplikacji, używając <uses-library> tag w aplikacji manifeście. Ponieważ aplikacje łączą się z tymi bibliotekami, należy je traktować jak resztę interfejsu API systemu Android pod względem zgodności, przeglądu interfejsu API i obsługi narzędzi. Jednak większość bibliotek nie ma tych funkcji.

Android 10 wprowadza java_sdk_library , nowy build reguła do problemów z kompatybilnością fix dla współdzielonych bibliotek Java. Producenci urządzeń mogą używać tego mechanizmu we własnych współdzielonych bibliotekach Java, aby zachować wsteczną kompatybilność swoich interfejsów API. Jeśli producenci urządzeń używają własnych współużytkowanych bibliotek Java poprzez <uses-library> tagu zamiast ścieżki bootclass, java_sdk_library może sprawdzić, że te biblioteki Java API są stabilne.

java_sdk_library jest biblioteką Java, który implementuje opcjonalny SDK API do aplikacji. Biblioteki realizowane poprzez java_sdk_library w pliku make ( Android.bp ) należy wykonać następujące operacje:

  • Biblioteki stubs są generowane obejmować stubs , stubs.system i stubs.test . Te biblioteki stubs są tworzone poprzez uznanie @hide , @SystemApi i @TestApi adnotacje. W czasie kompilacji, są one automatycznie odwoływać gdy wersja SDK jest current , system_current i test_current odpowiednio.
  • System Android pobiera listy interfejsów API za pośrednictwem plików pośredniczących i weryfikuje, czy interfejsy API są obsługiwane w sposób zgodny z poprzednimi wersjami, porównując bieżące listy interfejsów API w systemie głównym z listami interfejsów API w najnowszej opublikowanej wersji systemu Android.
  • Jeśli zainstalowana jest biblioteka implementacji środowiska wykonawczego, generowany i instalowany jest plik XML.
Buduj przepływ za pomocą biblioteki Java SDK
Rysunek 1. Przepływ budować z biblioteki Java SDK

Przykłady i źródła

Minimalna komponent dla bibliotek stubs są obowiązkowe srcs i api_packages właściwości.

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

Aby zbudować bibliotekę IMPL wykorzystywane do wykonywania, wypełnić wszystkie java_library właściwości, takie jak hostdex , compile_dex i errorprone .

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

Aby utworzyć biblioteki stubs, zapełniania droidstubs właściwości, takie jak srcs_lib , srcs_lib_whitelist_dirs , srcs_lib_whitelist_pkgs , merge_annotations_dirs i merge_inclusion_annotations_dirs . Możesz również użyć tych właściwości dla biblioteki stubs:

  • api_srcs : Lista opcjonalnych plików źródłowych, które są częścią API, ale nie jest częścią biblioteki wykonywania.
  • stubs_only_libs : Lista bibliotek Java, które są w ścieżce klasy podczas budowania odcinki.
  • hidden_api_packages : lista nazw pakietów, które muszą być ukryte przed API.
  • droiddoc_options : Dodatkowy argument za 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,
          }

Zachowanie kompatybilności wstecznej

System kompilacji sprawdza, czy interfejsy API zachowały kompatybilność wsteczną, porównując najnowsze pliki API z wygenerowanymi plikami API w czasie kompilacji. Cel ten realizowany jest z reguły budowy nowej nazwie prebuilt_apis , która tworzy Montowane Stubs modułów i list API biblioteki modułów. Wszystkie biblioteki zbudowane z java_sdk_library musi mieć pliki API w najnowszej wersji api_dirs w prebuilt_apis . Po zwolnieniu wersję, pliki wymienia API i biblioteki stubs można uzyskać dist kompilacji z PRODUCT-sdk_phone_armv7-sdk .

api_dirs nieruchomość jest lista katalogów wersji API w prebuilt_apis . Katalogi wersja API powinny znajdować się na tym samym poziomie katalogu z Android.bp .

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

Skonfigurować katalogi z version / scope /api/ struktury w katalogu prebuilts. version odpowiada poziomie API i scope określa, czy katalog jest publiczna, system, lub test.

  • version / scope zawiera biblioteki Java.
  • version / scope /api zawiera API .txt plików. Tworzenie pustych plików tekstowych o nazwach module_name .txt i module_name -removed.txt tutaj.
    ├── 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