Die gemeinsam genutzten Mediatheken von Android werden von Zeit zu Zeit weiterentwickelt. Vorgefertigte Binärdateien beibehalten auf dem neuesten Stand zu halten. Android 9 oder früher, die vorgefertigten Binärdateien, die nur von entfernten Bibliotheken oder ABIs abhängig sind, während der Laufzeit eine Verknüpfung erstellt wird. Entwickler müssen die Protokolle nachverfolgen, um veraltete vordefinierte Binärdateien zu erstellen. In Android 10 eine symbolbasierte ABI Nutzungsprüfung eingeführt. Die Prüfung kann veraltete vordefinierte Binärdateien erkennen bei der Erstellung, damit Entwickler der gemeinsam genutzten Bibliothek wissen, welche vordefinierten welche vorgefertigten Binärdateien aufgrund ihrer Änderung nicht korrekt sind komplett neu entwickelt.
Symbolbasierte ABI-Nutzungsprüfung
Die symbolbasierte ABI-Nutzungsprüfung emuliert die dynamische Android-Verknüpfung auf dem Host. Die Prüfung verknüpft die vorkonfigurierte Binärdatei mit den Abhängigkeiten der vordefinierten Binärdatei und überprüft, ob alle nicht definierten Symbole aufgelöst wurden.
Zuerst prüft die Prüfung die Zielarchitektur der vordefinierten Binärdatei. Wenn die nicht auf die ARM-, AArch64-, x86- oder x86-64-Architektur ausgerichtet ist, überspringt Checker die vordefinierte Binärdatei.
Zweitens müssen die Abhängigkeiten der vordefinierten Binärdatei im
LOCAL_SHARED_LIBRARIES
oder shared_libs
. Das Build-System löst das Modul
mit der übereinstimmenden Variante (z.B. core
vs. vendor
) der gemeinsam genutzten
Bibliotheken.
Drittens vergleicht die Prüfung die DT_NEEDED
-Einträge mit LOCAL_SHARED_LIBRARIES
oder shared_libs
. Insbesondere extrahiert die Prüfung den Eintrag DT_SONAME
aus
jeder geteilten Mediathek und vergleicht diese DT_SONAME
mit den DT_NEEDED
die in der vordefinierten Binärdatei aufgezeichnet wurden. Bei einer Abweichung wird ein Fehler
ausgegeben wird.
Viertens löst die Prüfung die nicht definierten Symbole in der vordefinierten Binärdatei auf. Diese
Nicht definierte Symbole müssen in einer der Abhängigkeiten definiert werden und das Symbol
Bindung muss entweder GLOBAL
oder WEAK
sein. Wenn ein undefiniertes Symbol nicht
wird eine Fehlermeldung ausgegeben.
Vordefinierte Modulattribute
Abhängigkeiten der vordefinierten Binärdatei müssen in einer der folgenden Optionen angegeben werden:
- Android.bp:
shared_libs: ["libc", "libdl", "libm"],
- Android.mk:
LOCAL_SHARED_LIBRARIES := libc libdl libm
Wenn die vordefinierte Binärdatei so konzipiert ist, dass sie nicht auflösbare, nicht definierte einen der folgenden Werte angeben:
- Android.bp:
allow_undefined_symbols: true,
- Android.mk:
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
Damit die vordefinierte Binärdatei die Prüfung der ELF-Datei überspringt, geben Sie eine der Folgendes:
- Android.bp:
check_elf_files: false,
- Android.mk:
LOCAL_CHECK_ELF_FILES := false
Prüfung ausführen
Die Prüfung deckt alle vordefinierten ELF-Module während des Android-Build-Prozesses ab.
So führen Sie die Prüfung allein aus, um schnellere Bearbeitungszeiten zu erreichen:
m check-elf-files
ABI-Fehlerbehebung
Mit dem automatischen Reparieren können Sie Fehler bei der ABI-Prüfung beheben. Führen Sie einfach den Fixer mit
die Android.bp- oder Android.mk-Datei als Eingabe
und der Fixer gibt die vorgeschlagene
auf „stdout“ zu setzen. Führen Sie optional den Fixer mit der Option --in-place
aus,
Android.bp / Android.mk mit der vorgeschlagenen Korrektur direkt aktualisieren.
Für Android.bp
m fix_android_bp_prebuilt
# Print the fixed Android.bp to stdout.
fix_android_bp_prebuilt <path-to-Android.bp>
# Update the Android.bp in place.
fix_android_bp_prebuilt --in-place <path-to-Android.bp>
Für Android.mk
m fix_android_mk_prebuilt
# Print the fixed Android.mk to stdout.
fix_android_mk_prebuilt <path-to-Android.mk>
# Update the Android.mk in place.
fix_android_mk_prebuilt --in-place <path-to-Android.mk>