Le librerie condivise Android si evolvono di volta in volta. Mantenere aggiornati i file binari precompilati richiede uno sforzo considerevole. In Android 9 o versioni precedenti, i file binari precompilati che dipendono da librerie o ABI rimossi non riescono a collegarsi solo in fase di runtime. Gli sviluppatori devono tracciare i log per trovare i file binari precompilati obsoleti. In Android 10 è stato introdotto un controllo degli utilizzi dell'ABI basato sui simboli. Il controllo può rilevare i file binari precompilati obsoleti in fase di compilazione, in modo che gli sviluppatori di librerie condivise possano sapere quali file binari precompilati potrebbero essere danneggiati dalla loro modifica e quali file binari precompilati devono essere ricompilati.
Controllo degli utilizzi dell'ABI basato sui simboli
Il controllo degli utilizzi dell'ABI basato sui simboli emula il linker dinamico di Android sull'host. Il controllo collega il file binario precompilato con le dipendenze del file binario precompilato e verifica se tutti i simboli non definiti sono risolti.
Innanzitutto, il controllo verifica l'architettura di destinazione del file binario precompilato. Se il file binario precompilato non è destinato all'architettura ARM, AArch64, x86 o x86-64, il controllo lo salta.
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 vs. vendor) delle librerie 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 libreria condivisa e confronta questi DT_SONAME con le voci DT_NEEDED registrate nel file binario precompilato. Se si verifica una mancata corrispondenza, viene emesso un messaggio di errore.
In quarto luogo, il 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 precompilato
Le dipendenze del file binario precompilato 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 precompilato è progettato per avere alcuni simboli non definiti non risolvibili, specifica uno dei seguenti:
- Android.bp:
allow_undefined_symbols: true, - Android.mk:
LOCAL_ALLOW_UNDEFINED_SYMBOLS := true
Per fare in modo che il file binario precompilato salti il controllo del file ELF, specifica uno dei seguenti:
- Android.bp:
check_elf_files: false, - Android.mk:
LOCAL_CHECK_ELF_FILES := false
Eseguire il controllo
Il controllo copre tutti i moduli precompilati ELF durante il processo di compilazione di Android.
Per eseguire il controllo da solo per tempi di risposta più rapidi:
m check-elf-filesCorrezione degli errori ABI
La correzione automatica può aiutarti a risolvere gli errori di controllo ABI. Ti basta eseguire la correzione con Android.bp / Android.mk come input e la correzione stamperà la correzione suggerita su stdout. Facoltativamente, esegui la 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>