Es gibt zwei Arten von Rust-Bibliotheksmodulen: eines, das Rust-Bibliotheken erstellt, und eines, das C-kompatible Bibliotheken erstellt. Außerdem können Sie für Build-System-Zwecke Rust-Prozedurmakros (proc-macros) als spezielle Art von Bibliothek betrachten.
rust_library
Das Modul rust_library erstellt Rust-Bibliotheken zur Verwendung durch andere Rust-Module.
Neben den _host-Varianten haben Rust-Bibliotheken Modultypen, die die verfügbare Verknüpfung steuern.
| Modultyp der Rust-Bibliothek | Definition |
|---|---|
| rust_library | Bietet beide Bibliotheksvarianten: rlib und dylib. AOSP empfiehlt diesen
Modultyp für Rust-Bibliotheken, da er dafür sorgt, dass Module
korrekt funktionieren, wenn sie als Abhängigkeit unter der rustlibs
Property aufgeführt sind. |
| rust_library_rlib | Bietet nur die rlib-Variante einer Rust-Bibliothek;
Bei Modulen, die nur rlib-Varianten bereitstellen, kann nicht garantiert werden, dass sie mit der
rustlibs-Property funktionieren. |
| rust_library_dylib | Bietet nur die dylib-Variante einer Rust-Bibliothek. Bei Modulen, die nur dylib-Varianten bereitstellen, kann nicht garantiert werden, dass sie mit der Property rustlibs funktionieren. |
rust_ffi
Das Modul rust_ffi erstellt C-kompatible Bibliotheken für die Interoperabilität mit CC-Modulen.
Neben den _host-Varianten haben Rust-FFI-Bibliotheken Modultypen, die die verfügbare Verknüpfung steuern. Diese sind in der folgenden Tabelle aufgeführt.
| Modultyp der Rust-FFI-Bibliothek | Definition |
|---|---|
| rust_ffi | Bietet beide C-Bibliotheksvarianten: statisch und gemeinsam genutzt. |
| rust_ffi_shared | Bietet nur die gemeinsam genutzte C-Bibliotheksvariante. |
| rust_ffi_static | Bietet nur die statische C-Bibliotheksvariante. |
Ein einfaches Beispiel für die Verwendung von rust_ffi zum Aufrufen von Rust aus C finden Sie auf der
Seite Android Rust Patterns.
Weitere Informationen zur erweiterten Verwendung finden Sie in der offiziellen Rust-Dokumentation.
rust_proc_macro
Rust-Prozedurmakros (proc-macros) können nützlich sein, um den Compiler zu erweitern, damit er Quellcode-Transformationen durchführt oder neue Attribute bereitstellt. Weitere Informationen finden Sie auf der Seite Procedural Macros (Prozedurmakros) in der offiziellen Rust-Dokumentation.
Für das Build-System funktioniert das Modul rust_proc_macro ähnlich wie die Module rust_library. Fügen Sie für Module, die von rust_proc_macros abhängen,
fügen Sie den Modulnamen der Property proc_macros hinzu.
Da proc_macros Compiler-Plug-ins sind, sind sie notwendigerweise auf den Host ausgerichtet und erzeugen keinen Code, der auf einem Gerät ausgeführt wird.
Wichtige Eigenschaften von Rust-Bibliotheken
Die in der folgenden Tabelle definierten Eigenschaften gelten zusätzlich zu den wichtigen gemeinsamen Eigenschaften
, die für alle Module gelten. Sie sind entweder besonders wichtig für Rust-Bibliotheksmodule oder weisen ein einzigartiges Verhalten auf, das spezifisch für den Modultyp rust_library ist.
| Eigenschaften von Rust-Bibliotheken | Definition |
|---|---|
| stem / name | Die Property stem steuert den Dateinamen der Ausgabebibliothek,
der andernfalls standardmäßig auf name festgelegt ist.
Der Rust-Compiler stellt bestimmte Anforderungen an Bibliotheksdateinamen. Daher erzwingt das Build-System diese Anforderungen, um Kompilierungsprobleme zu vermeiden.
Der Ausgabedateiname muss dem Format |
| crate_name | Dies ist eine erforderliche Property für Module, die Bibliotheken erstellen;
außerdem besteht eine Beziehung zum Ausgabedateinamen. Siehe die stem Definition. |
| export_include_dirs | Für rust_ffi-Module definiert diese Property eine Liste von
Strings, die relative Include-Pfade darstellen. Diese Pfade enthalten Header,
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 werden jedoch immer statisch mit libstd verknüpft.
Die für rustlibs-Abhängigkeiten verwendete Verknüpfung hängt von den Verknüpfungseinstellungen des Root-Moduls ab. Beispielsweise verwendet ein rust_binary mit prefer_rlib: true Rust-Bibliotheksvarianten, die rustlibs als rlibs verknüpfen.
Damit Root-Abhängigkeitsmodule erstellt werden können, die nicht auf dynamische Rust-Bibliotheken angewiesen sind (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.