Ottenere informazioni sull'integrità del sistema

Quando un dispositivo Android 16 (o versioni successive) viene avviato, viene messo in modalità permuta, che ti consente di connetterti al dispositivo utilizzando adb e di utilizzare un comando per ottenere informazioni sul dispositivo. Perché il dispositivo entri in modalità permuta, devono esistere le seguenti precondizioni:

  • Devono essere ripristinati i dati di fabbrica del dispositivo.
  • Il dispositivo non deve avere un servizio cellulare.
  • Il dispositivo non deve avere connettività o un account stabilito.
  • Sul dispositivo deve essere in esecuzione una build non eseguibile in modalità di debug.

La modalità permuta ti consente di eseguire query sulle informazioni diagnostiche di base o di attivare la modalità di valutazione, che ti consente di eseguire una gamma completa di comandi adb ed eseguire diagnostiche aggiuntive sul dispositivo.

Raccogliere informazioni sanitarie generali

Per raccogliere informazioni generali sullo stato del tuo dispositivo, ad esempio informazioni su batteria, stato di archiviazione e numeri IMEI (International Mobile Equipment Identity), segui questi passaggi:

  1. Assicurati che il dispositivo soddisfi i prerequisiti per la modalità permuta.

  2. Collega il dispositivo a una workstation.

  3. Dalla workstation, esegui questo comando:

    adb shell tradeinmode getstatus

    Questo comando restituisce un oggetto JSON con informazioni sul dispositivo. Di seguito è riportato un output di esempio di Pixel 7:

    {
      "battery": {
        "cycle_count": 16,
        "health": 100,
        "state": 2,
        "manufacturing_date": 1653004800,
        "first_usage_date": 0
      },
      "storage": {
        "useful_lifetime_remaining": 99,
        "capacity_bytes": "128000000000"
      },
      "launch_level": 33,
      "locks": {
        "factory_reset_protection": false
      },
      "product": {
        "brand": "google",
        "device": "panther",
        "manufacturer": "Google",
        "model": "Pixel 7",
        "name": "panther"
      },
      "imeis": [
        "353644930127905",
        "353644930127913"
      ],
      "serial": "26061FDH2000AP",
      "cameras": [
        {
          "num_physical": 3,
          "lens_facing": "back"
        },
        {
          "num_physical": 2,
          "lens_facing": "front"
        }
      ],
      "uiccs": [
        {
          "eid": "89033023427100000000007982221521",
          "removable": false,
          "physical_slot_index": 0
        },
        {
          "removable": true,
          "physical_slot_index": 1
        }
      ]
    }
    

    Se factory_reset_protection è impostato su true, il dispositivo è protetto e non può essere resettato. Se non è possibile resettare il dispositivo, non è possibile valutarlo.

    I campi cameras e uiccs sono presenti in Android 17 o versioni successive.

Identificare lo stato del sistema operativo Android

Per raccogliere informazioni sullo stato del sistema operativo Android, ad esempio se si tratta di una build approvata, segui questi passaggi:

  1. Collega il dispositivo a una workstation.
  2. Assicurati che il dispositivo sia connesso a internet.
  3. Dalla workstation, esegui questo comando:

    adb shell tradeinmode getstatus --challenge CHALLENGE

    CHALLENGE è una stringa alfanumerica generata in modo casuale, ad esempio p4tRsuHjWB. Questo comando restituisce JSON, incluso un campo di attestazione contenente un record di attestazione base64.

    Questo comando aggiunge un'attestazione alle informazioni restituite dal comando getstatus. Le informazioni sull'attestazione hanno il seguente aspetto:

    "attestation": {
      "certificates": "AAAC\/DCCAvgwggKeoAMCAQICAQEwCgYIKoZIzj0EAwIwOTEMMAoGA1UEDAwDVEVFMSkwJwYDVQQF\n
        EyBmOTIyZTZhOWFkZmRjNjU0NmZiOWU1YmNlNzhiMDUzMzAeFw03MDAxMDEwMDAwMDBaFw00ODAx\n
        MDEwMDAwMDBaMB8xHTAbBgNVBAMTFEFuZHJvaWQgS2V5c3RvcmUgS2V5MFkwEwYHKoZIzj0CAQYI\n
        KoZIzj0DAQcDQgAEz9un3HpDJQy\/j7l0bWzw6WnRRMjFjvu6rg7+dCzFW93u+otCPK4VjmSjyYw
        ...
    }
    

    I dispositivi lanciati con Android 16 o versioni successive richiedono la connettività a internet per creare un record di attestazione. L'attestazione deve essere eseguita in modalità di valutazione, dopo aver configurato una connessione, in quanto non riesce se eseguita nella procedura guidata di configurazione.

  4. Analizza le informazioni di attestazione utilizzando uno dei seguenti metodi:

    Ad esempio, per utilizzare lo strumento parse_tim_attestation, esegui:

    parse_tim_attestation --challenge CHALLENGE output_file

    Il CHALLENGE deve essere la stessa sfida che hai utilizzato per ottenere le informazioni di attestazione.

    Se hai salvato l'output del passaggio 2 in un output_file, puoi fornire il nome del file. In caso contrario, le informazioni di attestazione vengono lette da stdin.

    Viene restituito un oggetto JSON con le informazioni sul sistema operativo Android:

    "record": {
      "keymaster_version": "400",
      "keymaster_security_level": "TRUSTED_ENVIRONMENT",
      "attributes": {
        "imeis": [
          "353644930125669",
          "353644930125677"
        ],
        "vendor_patch_level": 20250305,
        "serial": "26161FDH2000NV",
        "os_version": 160000,
        "source": "hardware",
        "boot_patch_level": 20250305
      },
      "bootloader_locked": false,
      "verified_boot": false,
      "security_level": "TRUSTED_ENVIRONMENT"
    },
    "certificate": "verified",
    "trustworthy": "verified boot disabled"
    

    Se trustworthy è uguale a yes, il sistema operativo è considerato attendibile, la build è firmata e l'IMEI non è falsificato.

    Tieni presente che per eseguire l'attestazione è necessaria la connettività a internet sia sul dispositivo che sull'host.

Testare la modalità permuta

Durante lo sviluppo, devi testare il tuo dispositivo per assicurarti che entri ed esca correttamente dalla modalità permuta. Segui questi passaggi per testare la capacità del dispositivo di entrare e uscire dalla modalità permuta:

  1. Collega il dispositivo a una workstation.

  2. Dalla workstation, riavvia il dispositivo in modalità permuta:

    adb shell tradeinmode testing start

    Il dispositivo viene riavviato e passa alla modalità permuta. Dopo aver attivato la modalità permuta, puoi utilizzare qualsiasi comando adb shell tradein.

  3. Assicurati che la modalità permuta sia attiva:

    adb shell tradeinmode testing status

    Il dispositivo rileva che il test della modalità permuta è attivo.

  4. Esci dalla modalità permuta e ripristina l'accesso adb completo:

    adb shell tradeinmode testing stop

Integrazione della configurazione guidata personalizzata

Il comando evaluate non funziona sui dispositivi con procedure guidate di configurazione personalizzate a meno che non venga aggiunto un broadcast receiver. Per aggiungere un broadcast receiver all'app della procedura guidata di configurazione personalizzata:

  1. Dichiara un ricevitore nel manifest delle app:

    <receiver android:name=".EnterEvaluationModeReceiver"
              android:exported="true"
              android:permission="android.permission.ENTER_TRADE_IN_MODE">
      <intent-filter>
        <action android:name="com.google.android.setupwizard.ENTER_TRADE_IN_MODE" />
        <category android:name="android.intent.category.DEFAULT" />
      </intent-filter>
    </receiver>
    
  2. Crea un broadcast receiver simile a:

    public class EnterEvaluationModeReceiver extends BroadcastReceiver {
      private static final String TRADE_IN_MODE_PROPERTY = "persist.adb.tradeinmode";
      private static final int TIM_EVALUATION_MODE = 2;
    
      @Override
      public void onReceive(Context context, Intent intent) {
        if (SystemProperties.getInt(TRADE_IN_MODE_PROPERTY, 0) != TIM_EVALUATION_MODE) {
          return;
        }
    
        // Check if any factory reset protection is enabled.
        // Provision the device.
        // End the setup wizard activity.
     }
    }
    

Il destinatario deve eseguire le seguenti azioni nell'ordine indicato.

  1. Verifica che persist.adb.tradeinmode sia 2.
  2. Controlla che non siano presenti blocchi di protezione del ripristino dei dati di fabbrica o antifurto.
  3. Esegui il provisioning del dispositivo, assicurandoti che Settings.Secure.USER_SETUP_COMPLETE e Settings.Global.DEVICE_PROVISIONED siano 1.
  4. Chiudi l'attività della procedura guidata di configurazione in modo che il dispositivo si trovi nella schermata Home.

Riferimento alla modalità permuta

Questa sezione spiega tutti i comandi della modalità permuta.

evaluate

adb shell tradeinmode evaluate

Attiva la modalità di valutazione ignorando la configurazione guidata come se ogni schermata di configurazione fosse stata ignorata manualmente dall'utente.

Dopo aver saltato la procedura guidata di configurazione, puoi eseguire comandi ADB aggiuntivi o test funzionali sul dispositivo.

Dopo aver abbandonato la modalità di valutazione, viene eseguito un ripristino dei dati di fabbrica per garantire che nessun artefatto dei test venga trasferito accidentalmente ai clienti.

getstatus

adb shell tradeinmode getstatus [--challenge CHALLENGE]

Restituisce una stringa JSON con le informazioni di sistema, incluse quelle sullo stato della batteria e dello spazio di archiviazione, per il dispositivo.

Includi il parametro --challenge seguito da una chiave di verifica alfanumerica generata in modo casuale per restituire un campo di attestazione aggiuntivo. Analizza questa risposta per identificare le informazioni chiave del sistema operativo, ad esempio lo stato del bootloader (bloccato o sbloccato) e la validità dei numeri di serie IMEI.

poweroff

adb shell tradeinmode poweroff

Spegne il dispositivo. Utilizza questo comando per evitare il consumo eccessivo della batteria mentre il dispositivo non viene testato o valutato attivamente.

riavvio

adb shell tradeinmode reboot

Riavvia il dispositivo.

testing start

adb shell tradeinmode testing start

Riavvia il dispositivo in modalità permuta. Questo comando funziona solo all'interno della procedura guidata di configurazione. Dopo aver emesso questo comando, l'autorizzazione viene ignorata e funzionano solo i comandi della modalità permuta.

Questo comando funziona solo sui dispositivi con build userdebug, eng o user. La build user deve avere ro=debuggable=1 impostato.

stato del test

adb shell tradeinmode testing status

Indica se il test della modalità permuta è attivo.

Questo comando funziona solo sui dispositivi con build userdebug, eng o user. La build user deve avere ro=debuggable=1 impostato.

testing stop

adb shell tradeinmode testing stop

Riporta il dispositivo alla modalità in cui si trovava prima dell'esecuzione del comando adb shell tradeinmode testing start.

Questo comando funziona solo sui dispositivi con build userdebug, eng o user. La build user deve avere ro=debuggable=1 impostato.

testing wipe

adb shell tradeinmode testing wipe

Ripristina i dati di fabbrica del dispositivo.

Questo comando funziona solo sui dispositivi con build userdebug, eng o user. La build user deve avere ro=debuggable=1 impostato.

wait-until-ready

adb shell tradeinmode wait-until-ready

Attende che i servizi di sistema siano pronti in modo che la modalità permuta possa funzionare correttamente. Utilizza questo comando all'interno dell'automazione per assicurarti che i comandi della modalità permuta vengano eseguiti correttamente.

Puoi aggiungere wait-until-ready prima di altri comandi della modalità di permuta. Ad esempio, ecco wait-until-ready concatenato a getstatus:

adb shell tradeinmode wait-until-ready getstatus