Vordefinierte Prüfung der ABI-Nutzung

Gemeinsam genutzte Android-Bibliotheken werden von Zeit zu Zeit weiterentwickelt. Das Aktualisieren vorgefertigter Binärdateien erfordert einen erheblichen Aufwand. In Android 9 oder niedriger schlägt die Verknüpfung von vorgefertigten Binärdateien, die von entfernten Bibliotheken oder ABIs abhängen, erst zur Laufzeit fehl. Entwickler müssen die Logs durchsuchen, um die veralteten vorkompilierten Binärdateien zu finden. In Android 10 wird eine symbolbasierte ABI-Nutzungsprüfung eingeführt. Der Checker kann veraltete vorkompilierte Binärdateien zur Build-Zeit erkennen, sodass Entwickler von gemeinsam genutzten Bibliotheken wissen, welche vorkompilierten Binärdateien durch ihre Änderung möglicherweise beschädigt werden und welche vorkompilierten Binärdateien neu erstellt werden müssen.

Symbolbasierte ABI-Nutzungsprüfung

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

Zuerst wird die Zielarchitektur der vorkompilierten Binärdatei geprüft. Wenn die vorgefertigte Binärdatei nicht für die ARM-, AArch64-, x86- oder x86-64-Architektur vorgesehen ist, wird sie von der Prüfung übersprungen.

Zweitens müssen die Abhängigkeiten der vorkompilierten Binärdatei in LOCAL_SHARED_LIBRARIES oder shared_libs aufgeführt sein. Das Build-System löst die Modulnamen in die entsprechende Variante (d. h. core im Vergleich zu vendor) der gemeinsam genutzten Bibliotheken auf.

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

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

Attribute von Prebuilts-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 vorkompilierte Binärprogramm so konzipiert ist, dass es einige nicht auflösbare undefinierte Symbole enthält, geben Sie eines der folgenden an:

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

Wenn die Prüfung der ELF-Datei 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üftool ausführen

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

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

m check-elf-files

ABI-Fehlerbehebung

Mit dem automatischen Fixer können Sie ABI-Prüfungsfehler beheben. Führen Sie das Tool einfach mit der Android.bp- oder Android.mk-Datei als Eingabe aus. Das Tool gibt dann den vorgeschlagenen Fix in stdout aus. Optional können Sie den Fixer mit der Option --in-place ausführen, um die Datei „Android.bp“ / „Android.mk“ direkt mit dem vorgeschlagenen Fix 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>