Controllo degli utilizzi delle ABI predefinite

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>