Vordefinierte Prüfung der ABI-Nutzung

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>