Vordefinierte ABI-Nutzungsprüfung

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>