Vordefinierte ABI-Nutzungsprüfung

Die gemeinsam genutzten Mediatheken von Android werden von Zeit zu Zeit weiterentwickelt. Vordefinierte Binärdateien beibehalten und sie aktuell zu halten, erfordert erheblichen Aufwand. In Android 9 oder älter werden die vordefinierten Binärdateien, die von Entfernte Bibliotheken oder ABIs können nur während der Laufzeit nicht verknüpft werden. Entwickler müssen verfolgen Sie die Logs, um die veralteten vordefinierten Binärdateien zu finden. In Android 10 wird ein symbolbasiertes ABI-Anwendungsprüfungsprogramm eingeführt. Die Prüfung kann bei der Erstellung veraltete vorgefertigte Binärdateien erkennen, sodass freigegebene Bibliotheksentwickler können erkennen, welche vordefinierten Binärprogramme aufgrund ihrer und welche vorgefertigten Binärdateien neu erstellt werden müssen.

Symbolbasierte ABI-Nutzungsprüfung

Die symbolbasierte ABI-Nutzungsprüfung emuliert den dynamischen Link von Android auf Host. Die Prüfung verknüpft die vordefinierte Binärdatei mit den Abhängigkeiten der und prüft, ob alle nicht definierten Symbole aufgelöst wurden.

Zuerst prüft die Prüfung die Zielarchitektur der vordefinierten Binärdatei. Wenn die vordefinierte Binärdatei nicht auf ARM, AArch64, x86 oder x86-64 ausgerichtet ist Architektur enthält, überspringt die Prüfung die vordefinierte Binärdatei.

Zweitens müssen die Abhängigkeiten der vordefinierten Binärdatei im LOCAL_SHARED_LIBRARIES oder shared_libs. Der Build das System die Modulnamen in die entsprechende Variante (d.h. core im Vergleich zu vendor) der gemeinsam genutzten Bibliotheken.

Drittens vergleicht die Prüfung die DT_NEEDED-Einträge mit LOCAL_SHARED_LIBRARIES oder shared_libs. Insbesondere Die Prüfung extrahiert den Eintrag DT_SONAME aus jedem freigegebenen und vergleicht diese DT_SONAME mit den DT_NEEDED-Einträge, die in der vordefinierten Binärdatei aufgezeichnet wurden. Wenn es eine nicht übereinstimmen, wird eine Fehlermeldung ausgegeben.

Viertens löst die Prüfung die nicht definierten Symbole in der vordefinierten Binärdatei auf. Diese undefinierten Symbole müssen in einer der Abhängigkeiten und im Symbolbindung muss entweder GLOBAL oder WEAK sein. Wenn ein Undefiniertes Symbol kann nicht aufgelöst werden und es wird eine Fehlermeldung ausgegeben.

Vordefinierte Modulattribute

Abhängigkeiten der vordefinierten Binärdatei müssen in einer der Folgendes:

  • Android.bp: shared_libs: ["libc", "libdl", "libm"],
  • Android.mk: LOCAL_SHARED_LIBRARIES := libc libdl libm

Wenn die vorgefertigte Binärdatei so konzipiert ist, nicht auflösbare nicht definierte Symbole – geben Sie eines der folgenden an:

  • 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

Um die Prüfung auszuführen, legen Sie die Umgebungsvariable fest CHECK_ELF_FILES bis true und ausgeführt make check-elf-files:

CHECK_ELF_FILES=true make check-elf-files

Fügen Sie PRODUCT_CHECK_ELF_FILES hinzu, um die Prüfung standardmäßig zu aktivieren. an BoardConfig.mk:

PRODUCT_CHECK_ELF_FILES := true

Vordefinierte werden während des Android-Build-Prozesses automatisch geprüft:

make