Vorgefertigter ABI-Nutzungsprüfer

Gemeinsam genutzte Android-Bibliotheken entwickeln sich von Zeit zu Zeit weiter. Es erfordert erheblichen Aufwand, vorgefertigte Binärdateien auf dem neuesten Stand zu halten. In Android 9 oder früher können die vorgefertigten Binärdateien, die von entfernten Bibliotheken oder ABIs abhängen, nur zur Laufzeit keine Verknüpfung herstellen. Entwickler müssen die Protokolle nachverfolgen, um die veralteten vorgefertigten Binärdateien zu finden. In Android 10 wird ein symbolbasierter ABI-Nutzungsprüfer eingeführt. Der Prüfer kann veraltete vorgefertigte Binärdateien zur Erstellungszeit erkennen, sodass Entwickler von gemeinsam genutzten Bibliotheken wissen können, welche vorgefertigten Binärdateien durch ihre Änderung beschädigt werden könnten und welche vorgefertigten Binärdateien neu erstellt werden müssen.

Symbolbasierter ABI-Verwendungsprüfer

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

Zunächst überprüft der Prüfer die Zielarchitektur der vorgefertigten Binärdatei. Wenn die vorgefertigte Binärdatei nicht auf die ARM-, AArch64-, x86- oder x86-64-Architektur abzielt, überspringt der Prüfer die vorgefertigte Binärdatei.

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

Drittens vergleicht der Prüfer die DT_NEEDED Einträge mit LOCAL_SHARED_LIBRARIES oder shared_libs . Insbesondere extrahiert der Prüfer den DT_SONAME Eintrag aus jeder gemeinsam genutzten Bibliothek und vergleicht diesen DT_SONAME mit den DT_NEEDED Einträgen, die in der vorgefertigten Binärdatei aufgezeichnet sind. Bei einer Nichtübereinstimmung wird eine Fehlermeldung ausgegeben.

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

Vorgefertigte Moduleigenschaften

Abhängigkeiten der vorgefertigten Binärdatei müssen in einem der folgenden Elemente angegeben werden:

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

Wenn die vorgefertigte Binärdatei so konzipiert ist, dass sie 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

Damit die vorgefertigte Binärdatei die ELF-Dateiprüfung überspringt, geben Sie eine der folgenden Optionen an:

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

Führen Sie den Checker aus

Der Checker deckt alle vorgefertigten ELF-Module während des Android-Build-Prozesses ab.

So führen Sie den Checker alleine aus, um schnellere Durchlaufzeiten zu erzielen:

m check-elf-files

ABI-Fehlerbehebung

Der automatische Fixierer kann dabei helfen, Fehler bei der ABI-Prüfung zu beheben. Führen Sie einfach den Fixer mit Android.bp/Android.mk als Eingabe aus, und der Fixer gibt den vorgeschlagenen Fix auf stdout aus. Führen Sie optional den Fixer mit der Option --in-place aus, um 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>