Le librerie condivise di Android si evolvono di volta in volta. Mantenere aggiornati i binari precompilati richiede notevoli sforzi. In Android 9 o versioni precedenti, i file binari precompilati che dipendono da librerie o ABI rimosse non riescono a collegarsi solo in fase di esecuzione. Gli sviluppatori devono esaminare i log per trovare i binari precompilati obsoleti. In Android 10 è stato introdotto un controllo degli utilizzi ABI basato sui 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 ricostruiti.
Controllo degli utilizzi ABI basato sui 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 binario precompilato e verifica se tutti i simboli non definiti sono risolti.
Innanzitutto, lo strumento di controllo verifica l'architettura di destinazione del file binario precompilato. Se il file binario precompilato non ha come target l'architettura ARM, AArch64, x86 o x86-64, il programma di controllo lo ignora.
In secondo luogo, le dipendenze del file binario precompilato devono essere elencate in
LOCAL_SHARED_LIBRARIES
o shared_libs
. Il sistema di compilazione risolve i nomi dei moduli nella variante corrispondente (ad es.core
rispetto a vendor
) delle librerie condivise.
In terzo luogo, il controllore confronta le voci DT_NEEDED
con
LOCAL_SHARED_LIBRARIES
o shared_libs
. In particolare, il controllore estrae la voce DT_SONAME
da ogni libreria condivisa e la confronta con le voci DT_NEEDED
registrate nel file binario precompilato.DT_SONAME
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.
Questi simboli non definiti devono essere definiti in una delle dipendenze e il binding dei simboli deve essere GLOBAL
o WEAK
. Se un simbolo non definito non può essere risolto, viene emesso un messaggio di errore.
Proprietà del modulo Prebuilts
Le dipendenze del file binario precompilato devono essere specificate in uno dei seguenti modi:
- Android.bp:
shared_libs: ["libc", "libdl", "libm"],
- Android.mk:
LOCAL_SHARED_LIBRARIES := libc libdl libm
Se il file binario precompilato è progettato per avere alcuni simboli non risolvibili non definiti, 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
Per eseguire il controllo, imposta la variabile di ambiente
CHECK_ELF_FILES
su true
ed esegui
make check-elf-files
:
CHECK_ELF_FILES=true make check-elf-files
Per attivare il controllo per impostazione predefinita, aggiungi PRODUCT_CHECK_ELF_FILES
a BoardConfig.mk
:
PRODUCT_CHECK_ELF_FILES := true
I precompilati vengono controllati automaticamente durante il processo di compilazione di Android:
make