Le librerie condivise di Android si evolvono di tanto in tanto. Mantenere i programmi binari predefiniti la modifica richiede un notevole impegno. Su Android 9 o precedenti, i file binari predefiniti le librerie o le ABI rimosse non riescono a collegarsi solo in fase di runtime. Gli sviluppatori devono monitorare i log per trovare file binari predefiniti obsoleti. Su Android 10, viene introdotto un controllo degli utilizzi di ABI basato su simboli. Il controllo è in grado di rilevare file binari predefiniti obsoleti al momento della creazione, in modo che gli sviluppatori di librerie possono sapere quali file binari predefiniti potrebbero essere interrotti dai loro modificare e quali file binari predefiniti devono essere ricreati.
Controllo degli utilizzi di ABI basato su simboli
Il controllo dell'utilizzo di ABI basato su simboli emula il Linker dinamico Android su . Il controllo collega il programma binario predefinito alle dipendenze binario predefinito e verifica se tutti i simboli non definiti sono stati risolti.
Innanzitutto, controlla l'architettura di destinazione del file binario predefinito. Se il file binario predefinito non ha come target ARM, AArch64, x86 o x86-64 Transformer, il controllo ignora il file binario predefinito.
Secondo, le dipendenze del programma binario predefinito devono essere elencate
LOCAL_SHARED_LIBRARIES
o shared_libs
. La build
di sistema risolve i nomi dei moduli nella variante corrispondente (ad es.
core
contro vendor
) delle raccolte condivise.
In terzo luogo, il controllo confronta le voci DT_NEEDED
con
LOCAL_SHARED_LIBRARIES
o shared_libs
. In particolare,
il controllo estrae la voce DT_SONAME
da ogni
librerie e confronta questi DT_SONAME
con
DT_NEEDED
voci registrate nel file binario predefinito. Se esiste un
mancata corrispondenza, viene emesso un messaggio di errore.
In quarto luogo, il controllo risolve i simboli non definiti nel file binario predefinito.
Questi simboli non definiti devono essere definiti in una delle dipendenze
L'associazione di simboli deve essere GLOBAL
o WEAK
. Se
Impossibile risolvere il simbolo non definito. È stato emesso un messaggio di errore.
Proprietà dei moduli predefiniti
Le dipendenze del programma binario predefinito devono essere specificate in uno dei seguenti:
- Android.bp:
shared_libs: ["libc", "libdl", "libm"],
- Android.mk:
LOCAL_SHARED_LIBRARIES := libc libdl libm
Se il file binario predefinito è progettato per avere simboli non definiti non risolvibili, specifica uno dei seguenti elementi:
- Android.bp:
allow_undefined_symbols: true,
- Android.mk:
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
Per fare in modo che il programma binario predefinito ignori il controllo del file ELF, specifica uno dei seguenti:
- 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
Da CHECK_ELF_FILES
a true
ed esegui
make check-elf-files
:
CHECK_ELF_FILES=true make check-elf-files
Per attivare la verifica per impostazione predefinita, aggiungi PRODUCT_CHECK_ELF_FILES
a BoardConfig.mk
:
PRODUCT_CHECK_ELF_FILES := true
Gli elementi predefiniti vengono controllati automaticamente durante il processo di compilazione di Android:
make