Android-freigegebene Bibliotheken werden von Zeit zu Zeit weiterentwickelt. Das Aktualisieren vorgefertigter Binärdateien ist mit erheblichem Aufwand verbunden. Unter Android 9 oder niedriger werden die vorkompilierten Binärdateien, die von entfernten Bibliotheken oder ABIs abhängen, erst zur Laufzeit nicht verknüpft. Entwickler müssen die Protokolle analysieren, um die veralteten vorkompilierten Binärdateien zu finden. In Android 10 wurde eine symbolbasierte Prüfung der ABI-Nutzung eingeführt. Der Checker kann veraltete vorkompilierte Binärdateien zur Buildzeit erkennen, damit Entwickler von freigegebenen Bibliotheken wissen, welche vorkompilierten 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 vorkompilierte Binärdatei mit den Abhängigkeiten der vorkompilierten Binärdatei und prüft, ob alle nicht definierten Symbole aufgelöst werden.
Zuerst prüft der Checker die Zielarchitektur der vorgefertigten Binärdatei. Wenn die vorkompilierte Binärdatei nicht auf die ARM-, AArch64-, x86- oder x86-64-Architektur ausgerichtet ist, wird sie vom Checker übersprungen.
Zweitens müssen die Abhängigkeiten des vorkompilierten Binärprogramms in LOCAL_SHARED_LIBRARIES
oder shared_libs
aufgeführt sein. Das Buildsystem löst die Modulnamen in die übereinstimmende Variante (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 extrahiert der Checker den DT_SONAME
-Eintrag aus jeder freigegebenen Bibliothek und vergleicht diesen DT_SONAME
mit den DT_NEEDED
-Einträgen, die in der vorgefertigten Binärdatei aufgezeichnet wurden. 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.
Eigenschaften von Prebuilt-Modulen
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üftool ausführen
Um den Checker auszuführen, legen Sie die Umgebungsvariable CHECK_ELF_FILES
auf true
fest und führen Sie make check-elf-files
aus:
CHECK_ELF_FILES=true make check-elf-files
Wenn Sie die Prüfung standardmäßig aktivieren möchten, fügen Sie PRODUCT_CHECK_ELF_FILES
zu BoardConfig.mk
hinzu:
PRODUCT_CHECK_ELF_FILES := true
Prebuilts werden während des Build-Prozesses von Android automatisch geprüft:
make