Le librerie condivise di Android si evolvono di tanto in tanto. Mantenere aggiornati i binari precompilati richiede un impegno notevole. In Android 9 o versioni precedenti, i binari precompilati che dipendono da librerie o ABI rimossi non riescono a essere collegati in fase di runtime. Gli sviluppatori devono tracciare i log per trovare i binari precompilati obsoleti. In Android 10 viene introdotto un controllo dell'utilizzo dell'ABI basato su simboli. Il controllo può rilevare i binari precompilati obsoleti in fase di compilazione, in modo che gli sviluppatori di librerie condivise possano sapere quali binari precompilati potrebbero essere danneggiati dalla loro modifica e quali binari precompilati devono essere ricompilati.
Controllo dell'utilizzo dell'ABI basato sui simboli
Il controllo dell'utilizzo dell'ABI basato sui simboli emula il linker dinamico Android sull'host. Il controllo collega il binario precompilato alle dipendenze del binario precompilato e verifica se tutti i simboli non definiti sono risolti.
Innanzitutto, il controllo verifica l'architettura di destinazione del binario precompilato. Se il binario precompilato non ha come target l'architettura ARM, AArch64, x86 o x86-64, il controllo lo ignora.
In secondo luogo, le dipendenze del 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.
Terzo, 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 queste DT_SONAME
con le voci DT_NEEDED
registrate nel binario precompilato. Se non c'è corrispondenza, viene visualizzato un messaggio di errore.
Quarto, il controllo risolve i simboli non definiti nel binario precompilato. Questi
simboli non definiti devono essere definiti in una delle dipendenze e l'associazione
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 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 binario precompilato è progettato per avere alcuni simboli indefiniti 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 binario precompilato salti 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 precompilati ELF durante il processo di build di Android.
Per eseguire il controllo da solo per tempi di risposta più rapidi:
m check-elf-files
Correttore di errori ABI
Lo strumento di correzione automatica può aiutarti a risolvere gli errori di controllo ABI. Basta eseguire il correttore con
Android.bp / Android.mk come input e il correttore stamperà la correzione
suggerita su stdout. (Facoltativo) 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>