Die Android-Plattform enthält eine große Anzahl gemeinsam genutzter Java-Bibliotheken.
der optional in den Klassenpfad von Apps mit der Eigenschaft
<uses-library>
-Tag im App-Manifest ein. App-Link
diese Bibliotheken gegen diese Bibliotheken abzugleichen. Behandeln Sie sie daher wie den Rest der Android API.
hinsichtlich Kompatibilität, API-Überprüfung und Tool-Support. Beachten Sie jedoch,
dass die meisten Bibliotheken
nicht über diese Funktionen verfügen.
Mit dem Modultyp java_sdk_library
können Sie Bibliotheken verwalten
dieser Art. Gerätehersteller können diesen Mechanismus
gemeinsame Java-Bibliotheken, um die Abwärtskompatibilität für ihre APIs aufrechtzuerhalten.
Wenn Gerätehersteller ihre eigenen freigegebenen Java-Bibliotheken über die
<uses-library>
anstelle des Bootclass-Pfads verwenden,
java_sdk_library
kann prüfen, ob diese Java-Bibliotheken
API-stable.
Die java_sdk_library
implementiert optionale SDK APIs zur Verwendung durch
Apps. Bibliotheken, die über java_sdk_library
in Ihrem
Build-Datei (Android.bp
) folgende Vorgänge ausführen:
- Die Stubs-Bibliotheken werden generiert, um
stubs
,stubs.system
undstubs.test
. Diese Stubs-Bibliotheken werden durch die Erkennung von@hide
erstellt,@SystemApi
- und@TestApi
-Annotationen. java_sdk_library
verwaltet API-Spezifikationsdateien (z. B.current.txt
) in einem API-Unterverzeichnis. Diese Dateien mit dem aktuellen Code abgeglichen, um sicherzustellen, aktuellen Versionen Ist dies nicht der Fall, erhalten Sie eine Fehlermeldung, wie Sie sie aktualisieren. Alle Aktualisierungsänderungen an dass sie Ihren Erwartungen entsprechen.
Verwenden Siem update-api
, um alle APIs zu aktualisieren. Um zu prüfen, ob eine API aktuell ist,m checkapi
verwenden.- Die API-Spezifikationsdateien werden mit den zuletzt verwendeten Dateien abgeglichen.
veröffentlichten Android-Versionen überprüfen, um sicherzustellen, dass die API abwärtskompatibel ist
mit früheren Versionen. Bereitgestellte
java_sdk_library
-Module im Rahmen von AOSP ihre zuvor veröffentlichten Versionenprebuilts/sdk/<latest number>
. - In Bezug auf die Überprüfung der API-Spezifikationsdateien haben Sie folgende Möglichkeiten: eines der folgenden drei Dinge:
- Warten Sie, bis die Überprüfung fortgesetzt wird. Sie müssen nichts unternehmen.
- Um die Überprüfung zu deaktivieren, fügen Sie Folgendes zu
java_sdk_library
hinzu:
unsafe_ignore_missing_latest_api: true,
- Leere APIs für neue
java_sdk_library
-Module angeben indem Sie in folgendem Ordner leere Textdateien mit dem Namenmodule_name.txt
erstellen: dasversion/scope/api
-Verzeichnis. - Wenn die Implementierungsbibliothek für die Laufzeit installiert ist, eine XML-Datei generiert und installiert wird.
Funktionsweise von java_sdk_library
Ein java_sdk_library
mit dem Namen X
erstellt Folgendes:
- Zwei Kopien der Implementierungsbibliothek: eine Bibliothek namens
X
und ein weiteres mit dem NamenX.impl
. Bibliothek „X
“ ist installiert auf dem Gerät. Die BibliothekX.impl
ist nur vorhanden, wenn expliziter Zugriff auf wird die Implementierungsbibliothek von anderen Modulen benötigt, z. B. zur Verwendung in Tests durchführen. Ein expliziter Zugriff ist selten erforderlich. - Bereiche können aktiviert und deaktiviert werden, um den Zugriff anzupassen. (Ähnlich wie Java Modifizierer für den Zugriff auf Keywords bietet der öffentliche Geltungsbereich ein breites Spektrum an Zugriffsrechten. eine Testbereich enthält APIs, die nur für Tests verwendet werden.) Für jeden aktivierten Bereich wird Folgendes erstellt:
- Ein Stub-Quellmodul (vom Modultyp
droidstubs
) – verbraucht der Implementierungsquelle und gibt eine Reihe von Stub-Quellen die API-Spezifikationsdatei. - Eine Stub-Bibliothek (vom Modultyp
java_library
) ist die der kompilierten Version der Stubs. Die zum Kompilieren verwendeten Bibliotheken entsprechen denen injava_sdk_library
. Dadurch wird sichergestellt, dass Implementierungsdetails können nicht in die API-Stubs gelangen. - Wenn Sie zum Kompilieren der Stubs zusätzliche Bibliotheken benötigen, verwenden Sie die Methode
stub_only_libs
undstub_only_static_libs
, um sie bereitzustellen.
Wenn eine java_sdk_library
„X
“ heißt und
als „X
“ kompiliert sind, sich immer so darauf beziehen und keine Änderungen
. Der Build wählt eine geeignete Bibliothek aus. Um sicherzustellen, dass Sie
am besten geeignet ist, überprüfen Sie Ihre Stubs, um zu sehen, ob der Build
Fehler. Nehmen Sie die erforderlichen Korrekturen anhand dieser Anleitung vor:
- Überprüfen Sie, ob Sie über eine geeignete Bibliothek verfügen, indem Sie in der Befehlszeile nachsehen Untersuchen Sie, welche Stubs dort aufgeführt sind, um Ihren Bereich zu ermitteln:
- Bereich ist zu groß: Die abhängige Bibliothek benötigt einen bestimmten API-Bereich. Aber sehen Sie APIs in der Bibliothek, die außerhalb dieses Bereichs liegen, z. B. die in den öffentlichen APIs enthalten sind.
- Bereich zu eng gefasst: Die je nach Bibliothek vorhandene Bibliothek hat keinen Zugriff auf alle erforderlichen Bibliotheken. Die abhängige Bibliothek muss beispielsweise die Methode System-API verwendet, erhält aber stattdessen die öffentliche API. Dies führt in der Regel zu einer Kompilierungsfehler, da erforderliche APIs fehlen.
- Führen Sie nur einen der folgenden Schritte aus, um Probleme mit der Bibliothek zu beheben:
- Ändern Sie den
sdk_version
, um die benötigte Version auszuwählen. ODER - Geben Sie explizit die entsprechende Bibliothek an, z. B.
<X>.stubs
. oder<X>.stubs.system
.
Verwendung von java_sdk_library X
Die Implementierungsbibliothek X
wird verwendet, wenn von
apex.java_libs
. Aufgrund einer Soong-Einschränkung ist es jedoch möglich,
Auf X
wird in einem anderen java_sdk_library
-Modul verwiesen
innerhalb derselben APEX-Bibliothek, X.impl
explizit
verwendet werden, nicht die Bibliothek X
.
Wenn von einer anderen Stelle auf java_sdk_library
verwiesen wird, erstellt ein Stub
verwendet wird. Die Stub-Bibliothek wird anhand der abhängigen
Eigenschaftseinstellung sdk_version
des Moduls. Ein Modul, das
gibt an, dass sdk_version: "current"
die öffentlichen Stubs verwendet, während ein
das sdk_version: "system_current"
angibt,
System-Stubs verwenden. Wenn keine exakte Übereinstimmung gefunden werden kann, wird die nächstgelegene Stub-Bibliothek
verwendet. Eine java_sdk_library
, die nur eine öffentliche API bereitstellt,
die öffentlichen Dienste für alle bereitstellen.
Beispiele und Quellen
Die Properties srcs
und api_packages
müssen
in java_sdk_library
vorhanden sein.
java_sdk_library { name: "com.android.future.usb.accessory", srcs: ["src/**/*.java"], api_packages: ["com.android.future.usb"], }
AOSP empfiehlt (aber nicht erforderlich), dass neue java_sdk_library
-Instanzen explizit die API-Bereiche, die sie verwenden möchten. Sie können auch
Vorhandene java_sdk_library
-Instanzen (optional) migrieren zu
die von ihnen verwendeten API-Bereiche explizit aktiviert werden:
java_sdk_library { name: "lib", public: { enabled: true, }, system: { enabled: true, }, … }
Verwenden Sie zum Konfigurieren der impl
-Bibliothek, die für die Laufzeit verwendet wird, alle
die normalen java_library
-Eigenschaften wie hostdex
,
compile_dex
und 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, }
Verwenden Sie die folgenden Attribute, um Stubs-Bibliotheken zu konfigurieren:
merge_annotations_dirs
undmerge_inclusion_annotations_dirs
.api_srcs
: die Liste der optionalen Quelldateien, die Teil sind der API, aber nicht Teil der Laufzeitbibliothek.stubs_only_libs
: Die Liste der Java-Bibliotheken in der classpath verwenden, wenn Stubs erstellt werden.hidden_api_packages
: Die Liste der Paketnamen, die die von der API ausgeblendet werden.droiddoc_options
: zusätzliches Argument für Metalava verwendet.droiddoc_option_files
: Listet die Dateien auf, auf die verwiesen werden kann. indroiddoc_options
mit$(location <label>)
, Dabei ist<file>
ein Eintrag in der Liste.annotations_enabled
.
java_sdk_library
ist eine java_library
, aber keine
droidstubs
-Modul und unterstützt daher nicht alle droidstubs
Eigenschaften. Das folgende Beispiel stammt aus der
Android.test.mock-Bibliotheks-Build
-Datei.
java_sdk_library { name: "android.test.mock", srcs: [":android-test-mock-sources"], api_srcs: [ // Note: The following aren’t APIs of this library. Only APIs under the // android.test.mock package are taken. These do provide private APIs // to which android.test.mock APIs reference. These classes are present // in source code form to access necessary comments that disappear when // the classes are compiled into a Jar library. ":framework-core-sources-for-test-mock", ":framework_native_aidl", ], libs: [ "framework", "framework-annotations-lib", "app-compat-annotations", "Unsupportedappusage", ], api_packages: [ "android.test.mock", ], permitted_packages: [ "android.test.mock", ], compile_dex: true, default_to_stubs: true, }
Abwärtskompatibilität aufrechterhalten
Das Build-System prüft, ob die APIs abwärtskompatibel
indem Sie die neuesten API-Dateien mit den generierten
API-Dateien zur Build-Zeit. Der java_sdk_library
führt die
Kompatibilitätsprüfung anhand der von prebuilt_apis
bereitgestellten Informationen.
Alle mit java_sdk_library
erstellten Bibliotheken müssen API-Dateien haben
in der neuesten Version von api_dirs
in prebuilt_apis
.
Wenn Sie die Version veröffentlichen, listet die API Dateien und Stubs auf
Bibliotheken können mit dist build mit PRODUCT=sdk_phone_armv7-sdk
abgerufen werden.
Das Attribut api_dirs
ist eine Liste der API-Versionsverzeichnisse
in prebuilt_apis
Die Verzeichnisse für die API-Version müssen
auf der Verzeichnisebene Android.bp
.
prebuilt_apis { name: "foo", api_dirs: [ "1", "2", .... "30", "current", ], }
Verzeichnisse mit dem version/scope/api/
konfigurieren
Struktur unter dem vordefinierten Verzeichnis. version
entspricht der API-Ebene und scope
definiert
ob das Verzeichnis öffentlich, ein System- oder ein Testverzeichnis ist.
version/scope
Java-Bibliotheken enthält.version/scope/api
enthält API.txt
Dateien. Erstellen Sie leere Textdateien mit dem Namenmodule_name.txt
undmodule_name-removed.txt
hier.├── 30 │ ├── public │ │ ├── api │ │ │ ├── android.test.mock-removed.txt │ │ │ └── android.test.mock.txt │ │ └── android.test.mock.jar │ ├── system │ │ ├── api │ │ │ ├── android.test.mock-removed.txt │ │ │ └── android.test.mock.txt │ │ └── android.test.mock.jar │ └── test │ ├── api │ │ ├── android.test.mock-removed.txt │ │ └── android.test.mock.txt │ └── android.test.mock.jar └── Android.bp