Die gemeinsam genutzten Mediatheken von Android werden von Zeit zu Zeit weiterentwickelt. Vordefinierte Binärdateien beibehalten auf dem neuesten Stand zu halten. Unter Android 9 oder niedriger werden die vorkompilierten Binärdateien, die von entfernten Bibliotheken oder ABIs abhängen, nur zur Laufzeit nicht verknüpft. 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
Der symbolbasierte ABI-Gebrauchsprüfer emuliert den dynamischen Android-Linker 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 vorkompilierte Binärdatei nicht auf die ARM-, AArch64-, x86- oder x86-64-Architektur ausgerichtet ist, wird sie vom Prüftool übersprungen.
Zweitens müssen die Abhängigkeiten der vordefinierten Binärdatei im
LOCAL_SHARED_LIBRARIES
oder shared_libs
. Das Build-System löst die Modulnamen in die übereinstimmende Variante (d. h. core
oder vendor
) der freigegebenen Bibliotheken auf.
Drittens vergleicht der Prüfer die DT_NEEDED
-Einträge mit LOCAL_SHARED_LIBRARIES
oder shared_libs
. Insbesondere wird der DT_SONAME
-Eintrag aus jeder freigegebenen Bibliothek extrahiert und mit den DT_NEEDED
-Einträgen verglichen, die in der vorgefertigten Binärdatei gespeichert sind. 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 definierten Symbole müssen in einer der Abhängigkeiten definiert sein und die Symbolbindung 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
Der Checker deckt alle vorgefertigten ELF-Module während des Android-Build-Prozesses ab.
So führen Sie den Checker allein aus, um schnellere Ergebnisse zu erhalten:
m check-elf-files
ABI-Fehlerkorrektur
Mit dem automatischen Fixer können Sie ABI-Prüffehler beheben. Führen Sie einfach den Fixer mit
die Android.bp- oder Android.mk-Datei als Eingabe
und der Fixer gab 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>