Le librerie condivise di Android si evolvono di tanto in tanto. Mantenere aggiornati i binari precompilati richiede un impegno considerevole. In Android 9 o precedenti, i file binari predefiniti che dipendono solo da librerie o ABI rimosse non riescono a collegarsi in fase di runtime. Gli sviluppatori devono analizzare i log per trovare i file binari precompilati obsoleti. In Android 10 è stato introdotto un controllo degli utilizzi di ABI basato su simboli. Il programma di controllo può rilevare i binari precompilati obsoleti in fase di compilazione, in modo che gli sviluppatori delle librerie condivise possano sapere quali binari precompilati potrebbero essere danneggiati dalla modifica e quali devono essere ricompilati.
Controllo degli utilizzi di ABI basato su simboli
Lo strumento di controllo degli utilizzi ABI basato sui simboli emula il linker dinamico di Android sull'host. Il programma di controllo collega il file binario precompilato alle dipendenze del file precompilato e verifica se tutti i simboli non definiti sono risolti.
Innanzitutto, controlla l'architettura di destinazione del file binario predefinito. Se il codice binario precompilato non ha come target l'architettura ARM, AArch64, x86 o x86-64, il controllore salta il codice binario precompilato.
Secondo, le dipendenze del programma binario predefinito devono essere elencate
LOCAL_SHARED_LIBRARIES
o shared_libs
. Il sistema di compilazione risolve i nomi dei moduli in base alla variante corrispondente (ad es. core
e vendor
) delle librerie condivise.
In terzo luogo, il controllore confronta le voci DT_NEEDED
con LOCAL_SHARED_LIBRARIES
o shared_libs
. In particolare, il programma di controllo estrae la voce DT_SONAME
da ogni libreria condivisa e la confronta con le voci DT_NEEDED
registrate nel file binario precompilato. In caso di mancata corrispondenza, viene emesso un messaggio di errore.
In quarto luogo, lo strumento di controllo risolve i simboli non definiti nel file binario precompilato. Quelli
i simboli non definiti devono essere definiti in una delle dipendenze e il simbolo
l'associazione deve essere GLOBAL
o WEAK
. Se un simbolo non definito non può essere
viene risolto il problema, viene emesso un messaggio di errore.
Proprietà del modulo Prebuilts
Le dipendenze del programma binario predefinito devono essere specificate in uno dei seguenti valori:
- Android.bp:
shared_libs: ["libc", "libdl", "libm"],
- Android.mk:
LOCAL_SHARED_LIBRARIES := libc libdl libm
Se il file binario predefinito è progettato per avere elementi non risolvibili , specifica una delle seguenti opzioni:
- Android.bp:
allow_undefined_symbols: true,
- Android.mk:
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
Per fare in modo che il file binario precompilato ignori il controllo del file ELF, specifica uno dei seguenti valori:
- Android.bp:
check_elf_files: false,
- Android.mk:
LOCAL_CHECK_ELF_FILES := false
Esegui il controllo
Il controllo copre tutti i moduli ELF predefiniti durante il processo di compilazione di Android.
Per eseguire il controllo da solo e ottenere tempi di risposta più rapidi:
m check-elf-files
Strumento di correzione degli errori ABI
Il correttore automatico può aiutarti a risolvere gli errori di controllo dell'ABI. Esegui il fissatore con
Android.bp / Android.mk come input e il sistema di correzione visualizzava i suggerimenti
da correggere a stdout. Se vuoi, esegui il sistema di correzione con l'opzione --in-place
per
aggiornare direttamente Android.bp / Android.mk con la correzione suggerita.
Per 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>
Per 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>