Comandi shell del dispositivo

Durante il test VTS, i comandi della shell vengono utilizzati per eseguire un test lato destinazione binario, per ottenere/impostare proprietà, variabili di ambiente e informazioni di sistema, e avviare/interrompere il framework Android. Puoi eseguire la shell del dispositivo VTS utilizzando il comando adb shell o il driver della shell VTS in esecuzione sul dispositivo (consigliato).

Usa shell ADB

Test che richiedono l'arresto della porta USB o il riavvio del dispositivo durante i test devono utilizzare la shell ADB poiché il driver shell VTS non è disponibile senza connessione USB permanente. Puoi richiamare la shell ADB dalla Oggetto AndroidDevice nello script di test Python. Esempi:

  • Recupera un oggetto dispositivo Android:
    self.device = self.android_devices[0]
    
  • Esegui un singolo comando shell:
    result = self.device.adb.shell(‘ls')
    

Utilizzare il driver shell VTS

Il driver shell VTS è un programma binario dell'agente che viene eseguito sul dispositivo shell. Per impostazione predefinita, VTS utilizza il driver shell se questo è in esecuzione sul dispositivo perché questo metodo ha meno latenza rispetto all'uso del comando adb shell.

Figura 1. driver shell VTS.

Il framework VTS supporta i test multi-dispositivo in cui ogni dispositivo Android è rappresentato come un oggetto AndroidDevice in Base Runner. Per impostazione predefinita, il framework esegue il push dei file binari del driver della shell VTS e dell'agente VTS su ogni dispositivo Android e stabilisce le connessioni TCP con gli agenti VTS su questi dispositivi.

Per eseguire un comando shell, lo script Python lato host crea una funzione all'oggetto ShellMirror all'interno dell'oggetto AndroidDevice. Lo ShellMirror pacchettizza i testi dei comandi shell in un protobuf un messaggio e lo invia (tramite il canale TCP) all'agente VTS su Android dispositivo. L'agente in esecuzione sul dispositivo inoltra quindi il comando della shell alla shell VTS tramite il socket Unix.

Quando il driver della shell VTS riceve un comando, lo esegue tramite nohup su il rivestimento esterno del dispositivo per evitare che si blocchi. I codici Stdout, stderr e Return recuperato da nohup e rispedito all'agente VTS. Infine, l'agente risponde all'host aggregando i risultati del comando in una protobuf messaggio.

Vantaggi

I vantaggi dell'utilizzo del driver shell VTS anziché adb shell includono:

  • Affidabilità. Il driver shell VTS utilizza nohup per eseguire comandi in base all'impostazione predefinita. Poiché i test VTS principalmente test HAL e del kernel di livello inferiore, nohup garantisce che non si bloccano durante l'esecuzione.
  • Prestazioni. Mentre il comando adb shell memorizza nella cache alcuni risultati (ad esempio elenca i file di una directory) ha una connessione overhead quando si eseguono attività come l'esecuzione di un programma binario di test. Driver shell VTS mantiene una connessione attiva per tutta la durata del test in modo che l'unico overhead sia costituito da USB comunicazione. Nei nostri test, abbiamo usato il driver shell VTS per eseguire un comando 100 chiamate a un file binario gtest vuoto sono circa il 20% più veloci rispetto all'utilizzo adb shell; la differenza effettiva è maggiore poiché la shell VTS la comunicazione ha una registrazione estesa.
  • Conservazione dello stato. Il driver shell VTS mantiene un terminale sessione per ciascun nome terminale (il nome predefinito è predefinita). Le variabili di ambiente impostate in una sessione del terminale sono disponibili solo per i comandi successivi nella stessa sessione.
  • Allungabile. Comunicazioni del comando shell tra VTS e il driver del dispositivo sono aggregati in protobuf per consentire compressione, comunicazione remota, crittografia e così via. Altre possibilità per sono disponibili anche funzionalità per migliorare il rendimento, tra cui l'analisi dei risultati lato dispositivo quando l'overhead di comunicazione diventa superiore all'analisi della stringa di risultati.

Svantaggi

Gli svantaggi dell'utilizzo del driver shell VTS invece di adb shell includono:

  • File binari aggiuntivi. I file dell'agente VTS devono essere inviati dispositivo e i dati sono ripuliti dopo l'esecuzione del test.
  • Richiede una connessione attiva. Se la connessione TCP tra l'host e l'agente vengono persi durante il test (a causa della disconnessione USB, dell'arresto della porta arresto anomalo del dispositivo e così via), intenzionalmente o meno, un comando shell non possono essere trasmessi all'agente VTS. Anche con il passaggio automatico adb shell, il risultato e lo stato del comando prima della disconnessione sarebbero sconosciuti.

Esempi

Esempi di utilizzo dei comandi shell in uno script di test Python lato host VTS:

  • Recupera un oggetto dispositivo Android:
    self.device = self.android_devices[0]
    
  • Recupera un oggetto shell per il dispositivo selezionato:
    self.shell = self.device.shell
    
  • Esegui un singolo comando shell:
    results = self.shell.Execute(‘ls')
    
  • Esegui un elenco di comandi shell:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

Oggetto risultato del comando

L'oggetto restituito dall'esecuzione del comando shell è un dizionario contenente chiavi stdouts, stderrs e return_codes. A prescindere dal fatto che il comando shell sia fornito come singola stringa o come elenco di stringhe di comando, ogni valore del dizionario dei risultati è sempre un elenco.

Per verificare il codice restituito di un elenco di comandi, lo script di test deve controllare gli indici. Esempio:

asserts.assertFalse(any(results[‘return_codes']), ‘some command failed.')

In alternativa, lo script può controllare singolarmente ogni indice dei comandi. Esempio:

asserts.assertEqual(results[‘return_codes'][0], 0, ‘first command failed')
asserts.assertEqual(results[‘return_codes'][1], 0, ‘second command failed')