Vordefinierte ABI-Nutzungsprüfung

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 werden die vorkompilierten Binärdateien, die von entfernten Bibliotheken oder ABIs abhängen, nur zur Laufzeit nicht verknüpft. 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 die vorkonfigurierte Binärdatei mit den Abhängigkeiten der vorkonfigurierten Binärdatei und prüft, ob alle nicht definierten Symbole aufgelöst werden.

Zuerst prüft der Checker die Zielarchitektur des vorgefertigten Binärprogramms. Wenn die vordefinierte Binärdatei nicht auf die ARM-, AArch64-, x86- oder x86-64-Architektur ausgerichtet ist, überspringt die Prüffunktion die vordefinierte Binärdatei.

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 (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.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.

Vordefinierte Modulattribute

Abhängigkeiten des vorkompilierten Binärprogramms 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ü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-Fehlerbehebung

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 druckt 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>