Bibliotheksmodule

Es gibt zwei Arten von Rust-Bibliotheksmodulen: eine, die Rust-Bibliotheken und eine, die C-kompatible Bibliotheken generiert. Außerdem können Sie Rust-prozedurale Makros (proc-macros) für Build-Systeme als eine spezielle Art von Bibliothek betrachten.

rust_library

Mit dem Modul rust_library werden Rust-Bibliotheken zur Verwendung durch andere Rust-Module erstellt.

Neben den _host-Varianten haben Rust-Bibliotheken Modultypen, die die verfügbare Verknüpfung steuern.

Rust-Bibliotheksmodultyp Definition
rust_library Bietet beide Bibliotheksvarianten, rlib und dylib. AOSP empfiehlt diesen Modultyp für Rust-Bibliotheken, da Module ordnungsgemäß funktionieren, wenn sie unter der Eigenschaft rustlibs als Abhängigkeit aufgeführt sind.
rust_library_rlib Stellt nur die rlib-Variante einer Rust-Bibliothek bereit. Module, die nur rlib-Varianten bereitstellen, funktionieren nicht zwangsläufig mit der rustlibs-Property.
rust_library_dylib (in englischer Sprache) Bietet nur die dylib-Variante einer Rust-Bibliothek. Für Module, die nur dylib-Varianten bereitstellen, kann nicht garantiert werden, dass sie mit der rustlibs-Property funktionieren.

rust_ffi

Das rust_ffi-Modul generiert C-kompatible Bibliotheken für die Interkonnektivität mit CC-Modulen.

Zusätzlich zu den _host-Varianten haben Rust-FFI-Bibliotheken Modultypen, die die verfügbare Verknüpfung steuern (siehe folgende Tabelle).

Rust FFI Library Module Type Definition
rust_ffi Stellt beide Varianten der C-Bibliothek bereit: statisch und freigegeben.
rust_ffi_shared Bietet nur die C-Variante der freigegebenen Bibliothek.
rust_ffi_statisch Stellt nur die Variante der statischen C-Bibliothek bereit.

Ein einfaches Beispiel für die Verwendung von rust_ffi zum Aufrufen von Rust aus C finden Sie auf der Seite Android Rust Patterns.

Informationen zur erweiterten Verwendung finden Sie in der offiziellen Rust-Dokumentation.

rust_proc_macro

Rust-prozedurale Makros (Proc-Makros) können nützlich sein, um den Compiler zu erweitern, um Quellcodetransformationen durchzuführen oder neue Attribute bereitzustellen. Weitere Informationen dazu finden Sie in der offiziellen Rust-Dokumentation auf der Seite Procedural Macros (Prozedurale Makros).

Für das Build-System funktioniert das rust_proc_macro-Modul ähnlich wie die rust_library-Module. Fügen Sie für Module, die von rust_proc_macros abhängen, den Modulnamen der Property proc_macros hinzu.

Da es sich bei proc_macros um Compiler-Plug-ins handelt, zielen sie zwangsläufig auf den Host ab und generieren keinen Code, der auf einem Gerät ausgeführt werden würde.

Wichtige Eigenschaften von Rust-Bibliotheken

Die in der folgenden Tabelle definierten Attribute gelten zusätzlich zu den wichtigen allgemeinen Attributen, die für alle Module gelten. Diese sind entweder besonders wichtig für Rust-Bibliotheksmodule oder verhalten sich speziell für den Modultyp rust_library.

Rust-Bibliothek-Eigenschaften Definition
Stamm / Name Das Attribut stem steuert den Dateinamen der Ausgabebibliothek. Andernfalls wird standardmäßig name verwendet.

Der Rust-Compiler stellt bestimmte Anforderungen an die Dateinamen von Bibliotheken. Daher erzwingt das Build-System diese Anforderungen, um Kompilierungsprobleme zu vermeiden. Der Dateiname der Ausgabe muss das Format lib<crate_name><suffix> haben. (Hier gibt es eine Abhängigkeit von der Property crate_name.)

crate_name Diese Eigenschaft ist für Module erforderlich, die Bibliotheken erstellen. Außerdem hat sie eine Beziehung zum Ausgabedateinamen. (Siehe Definition für stem.)
export_include_dirs Für rust_ffi-Module definiert dieses Attribut eine Liste von Strings, die relative Include-Pfade darstellen: Pfade, die Header enthalten, die von abhängigen cc-Modulen verwendet werden können.

Verknüpfung von rust_library oder rust_ffi

Standardmäßig werden Rust-Bibliotheksmodule, die auf Geräte ausgerichtet sind, immer dynamisch mit libstd verknüpft. Hostmodule sind jedoch immer statisch mit libstd verknüpft.

Die Verknüpfung, die für rustlibs-Abhängigkeiten verwendet wird, hängt von den Verknüpfungseinstellungen des Stammmoduls ab. Beispiel: Bei rust_binary mit prefer_rlib: true werden Rust-Bibliotheksvarianten verwendet, die rustlibs als rlibs verknüpfen.

Um die Produktion von Root-Abhängigkeitsmodulen zu ermöglichen, die nicht auf dynamischen Rust-Bibliotheken basieren (z. B. statische ausführbare Dateien), bietet rlibs sowohl dynamische als auch statische libstd-Verknüpfungsvarianten. Die richtige Variante wird automatisch von Soong verknüpft.