Controllo utilizzi ABI predefinito

Le librerie condivise di Android si evolvono di tanto in tanto. Mantenere i programmi binari predefiniti gli aggiornamenti richiedono un notevole impegno. 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 tracciare i log per trovare quelli obsoleti binari predefiniti. In Android 10, un'ABI basata su simboli viene introdotto il controllo degli utilizzi. Il controllo è in grado di rilevare file binari predefiniti obsoleti al momento della creazione, in modo che gli sviluppatori delle librerie condivise possano sapere quali i file binari potrebbero essere interrotti a causa della loro modifica e quali file binari predefiniti devono essere ricostruito.

Controllo degli utilizzi di ABI basato su simboli

Il controllo dell'utilizzo di ABI basato su simboli emula il Linker dinamico Android sull'host. Il controllo collega il file binario predefinito alle dipendenze del sistema binario e verifica se tutti i simboli non definiti sono stati risolti.

Innanzitutto, controlla l'architettura di destinazione del file binario predefinito. Se il file binario predefinito non ha come target l'architettura ARM, AArch64, x86 o x86-64, che ignora il programma binario predefinito.

Secondo, le dipendenze del programma binario predefinito devono essere elencate LOCAL_SHARED_LIBRARIES o shared_libs. Il sistema di compilazione risolve il modulo i nomi della variante corrispondente (ad es. core rispetto a vendor) della librerie.

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 i DT_NEEDED registrate nel file binario predefinito. In caso di mancata corrispondenza, viene visualizzato un errore viene emesso un messaggio di errore.

In quarto luogo, il controllo risolve i simboli non definiti nel file binario predefinito. 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à dei moduli predefiniti

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 presentare 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 programma binario predefinito ignori il controllo del file ELF, specifica uno dei seguenti:

  • 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 ottenere tempi di risposta più rapidi:

m check-elf-files

Correzione 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>