Cihaz kabuğu komutları

VTS testi sırasında, hedef taraflı bir test ikilisini yürütmek, özellikleri, ortam değişkenlerini ve sistem bilgilerini almak/ayarlamak ve Android çerçevesini başlatmak/durdurmak için kabuk komutları kullanılır. adb shell komutunu veya cihazda çalışan VTS kabuk sürücüsünü (önerilen) kullanarak VTS cihaz kabuğu komutlarını yürütebilirsiniz.

ADB kabuğunu kullanma

VTS kabuk sürücüsü kalıcı bir USB bağlantısı olmadan kullanılamadığından, test sırasında USB bağlantı noktasının kapatılmasını veya cihazın yeniden başlatılmasını gerektiren testlerde ADB kabuğu kullanılmalıdır. Python test komut dosyasında AndroidDevice nesnesinden ADB kabuğunu çağırabilirsiniz. Örnekler:

  • Android cihaz nesnesi alın:
    self.device = self.android_devices[0]
    
  • Tek bir kabuk komutu gönderin:
    result = self.device.adb.shell(‘ls')
    

VTS kabuk sürücüsünü kullanma

VTS kabuk sürücüsü, cihazda çalışan ve kabuk komutlarını yürüten bir aracı ikili dosyasıdır. VTS, varsayılan olarak adb shell komutunu kullanmaktan daha az gecikmeye sahip olduğu için sürücü cihazda çalışıyorsa kabuk sürücüsünü kullanır.

Şekil 1. VTS kabuk sürücüsü.

VTS çerçevesi, her Android cihazın temel çalıştırıcıda AndroidDevice nesnesi olarak temsil edildiği çok cihazlı testleri destekler. VTS çerçevesi varsayılan olarak VTS aracısı ve VTS kabuk sürücüsü ikililerini her Android cihaza gönderir ve bu cihazlardaki VTS aracılarıyla TCP bağlantıları kurar.

Ana makine tarafındaki Python komut dosyası, bir kabuk komutunu yürütmek için AndroidDevice nesnesi içindeki ShellMirror nesnesine işlev çağrısı yapar. ShellMirror nesnesi, kabuk komut metinlerini bir protobuf mesajına paketleyip Android cihazdaki VTS aracısına (TCP kanalı üzerinden) gönderir. Ardından cihazda çalışan aracı, kabuk komutunu Unix soketi üzerinden VTS kabuk sürücüsüne yönlendirir.

VTS kabuk sürücüsü bir kabuk komutu aldığında, kilitlenmeyi önlemek için komutu cihaz kabuğunda nohup aracılığıyla yürütür. Ardından stdout, stderr ve dönüş kodu nohup'ten alınır ve VTS aracısına geri gönderilir. Son olarak, aracı, komut sonuçlarını bir protobuf mesajına sarmalayarak ana makineye yanıt verir.

Avantajları

adb shell yerine VTS kabuk sürücüsünü kullanmanın avantajları şunlardır:

  • Güvenilirlik. VTS kabuk sürücüsü, varsayılan ayarda komutları yürütmek için nohup kullanır. VTS testleri çoğunlukla alt düzey HAL ve çekirdek testleri olduğundan nohup, kabuk komutlarının yürütülme sırasında takılmamasını sağlar.
  • Performans. adb shell komutu bazı sonuçları önbelleğe alır (ör. bir dizindeki dosyaları listeleme), ancak test ikilisini yürütme gibi görevleri gerçekleştirirken bağlantı yükü oluşturur. VTS kabuk sürücüsü test boyunca etkin bir bağlantıyı korur. Bu nedenle, tek yükü USB iletişimi oluşturur. Testlerimizde, boş bir gtest ikilisine 100 çağrı içeren bir komutu yürütmek için VTS kabuk sürücüsünü kullanmak, adb shell kullanmaktan yaklaşık yüzde 20 daha hızlıdır. VTS kabuk iletişiminde kapsamlı günlük kaydı olduğundan gerçek fark daha büyüktür.
  • Durum bilgisi tutma. VTS kabuk sürücüsü, her terminal adı için bir terminal oturumu (varsayılan terminal adı default) tutar. Bir terminal oturumunda ayarlanan ortam değişkenleri yalnızca aynı oturumdaki sonraki komutlar tarafından kullanılabilir.
  • Genişletilebilir. VTS çerçevesi ile cihaz sürücüsü arasındaki kabuk komutu iletişimleri, gelecekte olası sıkıştırma, uzaktan erişim, şifreleme vb. işlemlerin yapılmasını sağlamak için protobuf içine alınır. İletişim yükü sonuç dizesi ayrıştırmasından daha büyük hale geldiğinde cihaz tarafında sonuç ayrıştırma da dahil olmak üzere performansı artırmanın başka yolları da vardır.

Dezavantajları

adb shell yerine VTS kabuk sürücüsünü kullanmanın dezavantajları şunlardır:

  • Ek ikili dosyalar. VTS temsilcisi dosyaları cihaza gönderilmeli ve test çalıştırıldıktan sonra temizlenmelidir.
  • Etkin bağlantı gerektirir. Test sırasında ana makine ile aracı arasındaki TCP bağlantısı kasıtlı veya kasıtsız olarak kesilirse (USB bağlantısının kesilmesi, bağlantı noktasının kapatılması, cihazın kilitlenmesi vb. nedeniyle) VTS aracısına kabuk komutu iletilemez. adb shell durumuna otomatik geçiş yapılsa bile bağlantı kesilmeden önceki komutun sonucu ve durumu bilinmez.

Örnekler

VTS ana makine tarafında Python test komut dosyasında kabuk komutlarının kullanılmasına dair örnekler:

  • Android cihaz nesnesi alın:
    self.device = self.android_devices[0]
    
  • Seçilen cihaz için bir kabuk nesnesi alın:
    self.shell = self.device.shell
    
  • Tek bir kabuk komutu gönderin:
    results = self.shell.Execute(‘ls')
    
  • Kabuk komutlarının listesini gösterin:
    results = self.shell.Execute([‘cd /data/local/tmp', ‘ls'])
    

Komut sonucu nesnesi

Kabuk komutu yürütme işleminden döndürülen nesne, stdouts, stderrs ve return_codes anahtarlarını içeren bir sözlüktür. Kabuk komutunun tek bir dize veya komut dizesi listesi olarak sağlanıp sağlanmadığına bakılmaksızın, sonuç sözlüğünün her değeri her zaman bir listetir.

Test komut dosyasının, komut listesinin döndürdüğü kodu doğrulamak için dizinleri kontrol etmesi gerekir. Örnek:

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

Alternatif olarak komut dosyası, her komut dizini için ayrı ayrı kontrol gerçekleştirebilir. Örnek:

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