Vordefinierte Prüfung der ABI-Nutzung

Android-freigegebene Bibliotheken werden von Zeit zu Zeit weiterentwickelt. Das Aktualisieren vorgefertigter Binärdateien ist mit einem erheblichen Aufwand verbunden. Unter Android 9 oder niedriger wird die Verknüpfung der vorkompilierten Binärdateien, die von entfernten Bibliotheken oder ABIs abhängen, nur zur Laufzeit fehlschlagen. Entwickler müssen die Protokolle prüfen, um die veralteten vorkompilierten Binärdateien zu finden. In Android 10 wird eine symbolbasierte Prüfung der ABI-Nutzung eingeführt. Der Checker kann veraltete vorkonfigurierte Binärdateien zur Buildzeit erkennen, damit Entwickler von freigegebenen Bibliotheken wissen, welche vorkonfigurierten Binärdateien durch ihre Änderung möglicherweise beschädigt werden und welche neu erstellt werden müssen.

Symbolbasierter ABI-Nutzungsprüfer

Der symbolbasierte ABI-Gebrauchszähler emuliert den dynamischen Android-Linker auf dem Host. Der Checker verknüpft das vorkompilierte Binary mit den Abhängigkeiten des vorkompilierten Binary und prüft, ob alle nicht definierten Symbole aufgelöst werden.

Zuerst prüft der Checker die Zielarchitektur der vorgefertigten 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 des vorkompilierten Binärprogramms in LOCAL_SHARED_LIBRARIES oder shared_libs aufgeführt sein. Das Build-System löst die Modulnamen in die übereinstimmende Variante (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.DT_SONAME Bei einer Abweichung wird eine Fehlermeldung ausgegeben.

Viertens löst der Checker die nicht definierten Symbole im vorkompilierten Binärcode 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 nicht definiertes Symbol nicht aufgelöst werden kann, wird eine Fehlermeldung ausgegeben.

Eigenschaften von Prebuilt-Modulen

Abhängigkeiten der vorkompilierten Binärdatei müssen in einer der folgenden Dateien angegeben werden:

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

Wenn das vorkonfigurierte Binärprogramm einige nicht auflösbare, nicht definierte Symbole enthält, geben Sie einen der folgenden Werte an:

  • Android.bp: allow_undefined_symbols: true,
  • Android.mk: LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

Wenn die vorkonfigurierte Binärdatei die ELF-Dateiprüfung überspringen soll, geben Sie einen der folgenden Befehle an:

  • Android.bp: check_elf_files: false,
  • Android.mk: LOCAL_CHECK_ELF_FILES := false

Prüftool 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 den Fixer einfach mit Android.bp / Android.mk als Eingabe aus. Der Fixer gibt dann die vorgeschlagene Korrektur auf stdout aus. Optional können Sie den Fixer mit der Option --in-place ausführen, um Android.bp / Android.mk direkt mit der vorgeschlagenen Fehlerbehebung zu 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>