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>