Le librerie condivise di Android si evolvono di tanto in tanto. Mantenere i programmi binari predefiniti gli aggiornamenti richiedono un notevole impegno. 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 tracciare i log per trovare quelli obsoleti binari predefiniti. In Android 10, un'ABI basata su simboli viene introdotto il controllo degli utilizzi. Il controllo è in grado di rilevare file binari predefiniti obsoleti al momento della creazione, in modo che gli sviluppatori delle librerie condivise possano sapere quali i file binari potrebbero essere interrotti a causa della loro modifica e quali file binari predefiniti devono essere ricostruito.
Controllo degli utilizzi di ABI basato su simboli
Il controllo dell'utilizzo di ABI basato su simboli emula il Linker dinamico Android sull'host. Il controllo collega il file binario predefinito alle dipendenze del sistema binario 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 l'architettura ARM, AArch64, x86 o x86-64, che ignora il programma binario predefinito.
Secondo, le dipendenze del programma binario predefinito devono essere elencate
LOCAL_SHARED_LIBRARIES
o shared_libs
. Il sistema di compilazione risolve il modulo
i nomi della variante corrispondente (ad es. core
rispetto a vendor
) della
librerie.
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 libreria condivisa e confronta questi DT_SONAME
con i DT_NEEDED
registrate nel file binario predefinito. In caso di mancata corrispondenza, viene visualizzato un errore
viene emesso un messaggio di errore.
In quarto luogo, il controllo risolve i simboli non definiti nel file binario predefinito. 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à dei moduli predefiniti
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 presentare 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 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
Il controllo copre tutti i moduli predefiniti ELF durante il processo di compilazione di Android.
Per eseguire il controllo da solo e ottenere tempi di risposta più rapidi:
m check-elf-files
Correzione 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>