Vordefinierte Prüfung der ABI-Nutzung

Android-Bibliotheken werden gelegentlich weiterentwickelt. Es ist mit erheblichem Aufwand verbunden, vorgefertigte Binärdateien auf dem neuesten Stand zu halten. In Android 9 oder früher schlägt die Verknüpfung der vorgefertigten Binärdateien, die von entfernten Bibliotheken oder ABIs abhängen, erst zur Laufzeit fehl. Entwickler müssen die Logs durchsuchen, um die veralteten vorgefertigten Binärdateien zu finden. In Android 10 wird eine symbolbasierte ABI-Nutzungsprüfung eingeführt. Mit dieser Prüfung können veraltete vorgefertigte Binärdateien zur Build-Zeit erkannt werden, sodass Entwickler von gemeinsam genutzten Bibliotheken wissen, welche vorgefertigten Binärdateien durch ihre Änderung beschädigt werden könnten und welche vorgefertigten Binärdateien neu erstellt werden müssen.

Symbolbasierte ABI-Nutzungsprüfung

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

Zuerst prüft die Prüfung die Zielarchitektur der vorgefertigten Binärdatei. Wenn die vorgefertigte Binärdatei nicht auf die ARM-, AArch64-, x86- oder x86-64-Architektur ausgerichtet ist, wird sie von der Prüfung übersprungen.

Zweitens müssen die Abhängigkeiten der vorgefertigten Binärdatei in LOCAL_SHARED_LIBRARIES oder shared_libs aufgeführt sein. Das Build-System löst die Modulnamen in die passende Variante (z.B. core vs. vendor) der gemeinsam genutzten Bibliotheken auf.

Drittens vergleicht die Prüfung die DT_NEEDED-Einträge mit LOCAL_SHARED_LIBRARIES oder shared_libs. Insbesondere extrahiert die Prüfung den DT_SONAME-Eintrag aus jeder gemeinsam genutzten Bibliothek und vergleicht diese DT_SONAME-Einträge mit den in der vorgefertigten Binärdatei aufgezeichneten DT_NEEDED-Einträgen. Bei einer Abweichung wird eine Fehlermeldung ausgegeben.

Viertens löst die Prüfung die nicht definierten Symbole in der vorgefertigten 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 nicht definiertes Symbol nicht aufgelöst werden kann, wird eine Fehlermeldung ausgegeben.

Moduleigenschaften für vorgefertigte Binärdateien

Abhängigkeiten der vorgefertigten 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 die vorgefertigte Binärdatei einige nicht auflösbare nicht definierte Symbole enthalten soll, geben Sie eine der folgenden Optionen an:

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

Wenn die ELF-Dateiüberprüfung für die vorgefertigte Binärdatei übersprungen werden soll, geben Sie eine der folgenden Optionen an:

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

Prüfung ausführen

Die Prüfung umfasst alle vorgefertigten ELF-Module während des Android-Build-Prozesses.

So führen Sie die Prüfung allein aus, um schnellere Ergebnisse zu erhalten:

m check-elf-files

ABI-Fehlerbehebung

Die automatische Fehlerbehebung kann helfen, ABI-Prüfungsfehler zu beheben. Führen Sie die Fehlerbehebung einfach mit Android.bp / Android.mk als Eingabe aus. Die vorgeschlagene Korrektur wird dann in der Standardausgabe ausgegeben. Optional können Sie die Fehlerbehebung mit der Option --in-place ausführen, um Android.bp / Android.mk direkt mit der vorgeschlagenen Korrektur 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>