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 considerevole. 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 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 in fase di 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 di ABI basato su simboli

Lo strumento di controllo degli utilizzi ABI basato sui simboli emula il linker dinamico di 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, controlla l'architettura di destinazione del file binario predefinito. Se il codice binario precompilato non ha come target l'architettura ARM, AArch64, x86 o x86-64, il controllore salta il codice binario precompilato.

Secondo, le dipendenze del programma binario predefinito devono essere elencate 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 programma di controllo estrae la voce DT_SONAME da ogni libreria condivisa e la confronta con le voci DT_NEEDED registrate nel file binario precompilato. 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. 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à del modulo Prebuilts

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 avere 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 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 ELF predefiniti durante il processo di compilazione di Android.

Per eseguire il controllo da solo e ottenere tempi di risposta più rapidi:

m check-elf-files

Strumento di correzione degli 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>