Le librerie condivise di Android si evolvono di volta in volta. Mantenere aggiornati i binari precompilati richiede un impegno considerevole. In Android 9 o versioni precedenti, i programmi binari predefiniti che dipendono da librerie o ABI rimosse non si collegano soltanto 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 al momento della 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 ABI basato sui simboli
Il controllo dell'utilizzo di ABI basato su simboli emula il Linker dinamico 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, il programma di controllo verifica l'architettura di destinazione del file binario precompilato. Se il codice binario precompilato non ha come target l'architettura ARM, AArch64, x86 o x86-64, il controllore salta il codice binario precompilato.
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 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 controllo estrae la voce DT_SONAME
da
ogni libreria condivisa e confronta questi DT_SONAME
con le voci DT_NEEDED
registrate nel programma binario predefinito. 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 non è possibile risolvere un simbolo non definito, viene emesso un messaggio di errore.
Proprietà del modulo Prebuilts
Le dipendenze del file binario precompilato devono essere specificate in uno dei seguenti elementi:
- Android.bp:
shared_libs: ["libc", "libdl", "libm"],
- Android.mk:
LOCAL_SHARED_LIBRARIES := libc libdl libm
Se il file binario precompilato è progettato per avere alcuni symboli 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
Il controllo copre tutti i moduli predefiniti ELF durante il processo di compilazione di Android.
Per eseguire il controllo da solo e ridurre i tempi di risposta:
m check-elf-files
Strumento di correzione degli errori ABI
Il correttore automatico può aiutarti a risolvere gli errori di controllo dell'ABI. Basta eseguire lo strumento di correzione con Android.bp / Android.mk come input e lo strumento di correzione stamperà la correzione suggerita su stdout. Se vuoi, esegui lo strumento 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>