Google si impegna a promuovere l'equità razziale per le comunità nere. Vedi come.
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Controllo degli ABI precompilati

Le librerie condivise Android si evolvono di volta in volta. Mantenere aggiornati i binari precompilati richiede uno sforzo considerevole. In Android 9 o versioni precedenti, i binari predefiniti che dipendono dalle librerie rimosse o dagli ABI non riescono a collegarsi solo in fase di esecuzione. Gli sviluppatori devono tracciare i log per trovare i binari precompilati obsoleti. In Android 10, viene introdotto un correttore di utilizzi ABI basato su simboli. Il checker 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 rotti dalla loro modifica e quali binari precompilati devono essere ricostruiti.

Controllo degli utilizzi ABI basato su simboli

Il correttore di utilizzi ABI basato su simboli emula il linker dinamico Android sull'host. Il checker collega il binario precostruito con le dipendenze del binario precostruito e controlla se tutti i simboli indefiniti sono stati risolti.

Innanzitutto, il checker controlla l'architettura di destinazione del binario precompilato. Se il binario precompilato non ha come target l'architettura ARM, AArch64, x86 o x86-64, il checker salta il binario precompilato.

In secondo luogo, le dipendenze del binario predefinito devono essere elencate in LOCAL_SHARED_LIBRARIES o shared_libs . Il sistema di compilazione risolve i nomi dei moduli nella variante corrispondente (ovvero core vs. vendor ) delle librerie condivise.

In terzo luogo, il controllo a confronto le DT_NEEDED entrate alla LOCAL_SHARED_LIBRARIES o shared_libs . In particolare, il checker estrae la voce DT_SONAME da ciascuna libreria condivisa e confronta questi DT_SONAME con le voci DT_NEEDED registrate nel binario predefinito. In caso di mancata corrispondenza, viene emesso un messaggio di errore.

In quarto luogo, il checker risolve i simboli indefiniti nel binario predefinito. Quei simboli indefiniti devono essere definiti in una delle dipendenze e l'associazione dei simboli deve essere GLOBAL o WEAK . Se non è possibile risolvere un simbolo indefinito, viene emesso un messaggio di errore.

Proprietà del modulo precompilate

Le dipendenze del 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 binario predefinito è progettato per avere alcuni simboli indefinibili non risolti , specificare una delle seguenti opzioni:

  • Android.bp: allow_undefined_symbols: true,
  • Android.mk: LOCAL_ALLOW_UNDEFINED_SYMBOLS := true

Per fare in modo che il binario predefinito non salti il ​​controllo del file ELF, specificare una delle seguenti opzioni:

  • Android.bp: check_elf_files: false,
  • Android.mk: LOCAL_CHECK_ELF_FILES := false

Esegui il controllo

Per eseguire il checker, impostare la variabile di ambiente CHECK_ELF_FILES su true ed eseguire make check-elf-files :

 CHECK_ELF_FILES=true make check-elf-files
 

Per abilitare il checker per impostazione predefinita, aggiungere PRODUCT_CHECK_ELF_FILES a BoardConfig.mk :

 PRODUCT_CHECK_ELF_FILES := true
 

I prebuilt vengono controllati automaticamente durante il processo di creazione di Android:

 make