Ikuti semua informasi yang diumumkan di Firebase Summit, dan pelajari bagaimana Firebase dapat membantu Anda mempercepat pengembangan aplikasi dan menjalankan aplikasi dengan percaya diri. Pelajari Lebih Lanjut

Mulailah dengan tes Game Loop

Tetap teratur dengan koleksi Simpan dan kategorikan konten berdasarkan preferensi Anda.

Mungkin sulit untuk mengotomatiskan pengujian game saat aplikasi game dibangun di kerangka kerja UI yang berbeda. Pengujian Game Loop memungkinkan Anda mengintegrasikan pengujian native dengan Test Lab dan menjalankannya dengan mudah di perangkat yang Anda pilih. Pengujian Game Loop menjalankan pengujian Anda melalui aplikasi game sambil menyimulasikan tindakan pemain sungguhan. Panduan ini menunjukkan cara menjalankan pengujian Game Loop, lalu melihat dan mengelola hasil pengujian Anda di Firebase console.

Bergantung pada mesin game Anda, Anda dapat menerapkan pengujian dengan loop tunggal atau ganda . Loop adalah pengujian penuh atau sebagian dari pengujian Anda pada aplikasi game Anda. Game loop dapat digunakan untuk:

  • Jalankan level game Anda dengan cara yang sama seperti yang dimainkan pengguna akhir. Anda dapat membuat skrip input pengguna, membiarkan pengguna menganggur, atau mengganti pengguna dengan AI jika masuk akal dalam game Anda (misalnya, Anda memiliki aplikasi game mobil balap dan sudah mengimplementasikan AI. Anda bisa dengan mudah menempatkan driver AI yang bertanggung jawab atas input pengguna).
  • Jalankan game Anda pada pengaturan kualitas tertinggi untuk melihat apakah perangkat mendukungnya.
  • Jalankan tes teknis (kompilasi beberapa shader, jalankan, periksa apakah hasilnya seperti yang diharapkan, dll).

Anda dapat menjalankan pengujian Game Loop di satu perangkat pengujian, sekumpulan perangkat pengujian, atau di Test Lab. Namun, kami tidak menyarankan menjalankan pengujian Game Loop pada perangkat virtual karena perangkat tersebut memiliki frekuensi gambar grafis yang lebih rendah daripada perangkat fisik.

Sebelum kamu memulai

Untuk menerapkan pengujian, Anda harus terlebih dahulu mengonfigurasi aplikasi untuk pengujian Game Loop.

  1. Di manifes aplikasi Anda, tambahkan filter maksud baru ke aktivitas Anda :

    <activity android:name=".MyActivity">
       <intent-filter>
           <action android:name="com.google.intent.action.TEST_LOOP"/>
           <category android:name="android.intent.category.DEFAULT"/>
           <data android:mimeType="application/javascript"/>
       </intent-filter>
       <intent-filter>
          ... (other intent filters here)
       </intent-filter>
    </activity>
    

    Hal ini memungkinkan Test Lab meluncurkan game Anda dengan memicunya dengan maksud tertentu.

  2. Dalam kode Anda (kami sarankan di dalam deklarasi metode onCreate ), tambahkan berikut ini:

    Kotlin+KTX

    val launchIntent = intent
    if (launchIntent.action == "com.google.intent.action.TEST_LOOP") {
        val scenario = launchIntent.getIntExtra("scenario", 0)
        // Code to handle your game loop here
    }

    Java

    Intent launchIntent = getIntent();
    if(launchIntent.getAction().equals("com.google.intent.action.TEST_LOOP")) {
        int scenario = launchIntent.getIntExtra("scenario", 0);
        // Code to handle your game loop here
    }

    Ini memungkinkan aktivitas Anda untuk memeriksa maksud yang meluncurkannya. Anda juga dapat menambahkan kode ini nanti jika Anda mau (mis., setelah pertama kali memuat mesin game Anda).

  3. Direkomendasikan: Di akhir pengujian, tambahkan:

    Kotlin+KTX

    yourActivity.finish()

    Java

    yourActivity.finish();

    Tindakan ini akan menutup aplikasi Anda saat pengujian Game Loop selesai. Pengujian bergantung pada kerangka kerja UI aplikasi Anda untuk memulai loop berikutnya, dan menutup aplikasi Anda menunjukkan bahwa pengujian telah selesai.

Buat dan jalankan pengujian Game Loop

Setelah mengonfigurasi aplikasi untuk pengujian Game Loop, Anda dapat langsung membuat pengujian dan menjalankannya di aplikasi game. Anda dapat memilih untuk menjalankan pengujian di Test Lab menggunakan Firebase console atau antarmuka baris perintah (CLI) gcloud , atau di perangkat lokal menggunakan Test Loop Manager .

Jalankan di perangkat lokal

Test Loop Manager dari Test Lab adalah aplikasi sumber terbuka yang membantu Anda mengintegrasikan pengujian Game Loop dan menjalankannya di perangkat lokal Anda. Ini juga memungkinkan tim Jaminan Kualitas Anda untuk menjalankan putaran permainan yang sama di perangkat mereka.

Untuk menjalankan pengujian pada perangkat lokal menggunakan Test Loop Manager:

  1. Unduh Test Loop Manager di ponsel atau tablet dan instal dengan menjalankan:
    adb install testloopmanager.apk
  2. Di perangkat Anda, buka aplikasi Test Loop Apps di ponsel atau tablet Anda. Aplikasi menampilkan daftar aplikasi di perangkat Anda yang dapat dijalankan dengan loop game. Jika Anda tidak melihat aplikasi game Anda di sini, pastikan filter maksud Anda cocok dengan yang dijelaskan di langkah pertama bagian Sebelum Anda mulai .
  3. Pilih aplikasi game Anda, lalu pilih jumlah putaran yang ingin Anda jalankan. Catatan: Pada langkah ini, Anda dapat memilih untuk menjalankan subset loop, bukan hanya satu loop. Untuk informasi selengkapnya tentang menjalankan banyak loop sekaligus, lihat Fitur opsional.
  4. Klik Jalankan tes . Tes Anda mulai berjalan segera.

Jalankan di Test Lab

Anda dapat menjalankan pengujian Game Loop di Test Lab menggunakan Firebase console atau gcloud CLI. Sebelum memulai, jika Anda belum melakukannya, buka konsol Firebase dan buat proyek.

Gunakan konsol Firebase

  1. Di konsol Firebase, klik Test Lab dari panel kiri.
  2. Klik Jalankan Tes Pertama Anda (atau Jalankan Tes jika proyek Anda sebelumnya telah menjalankan tes).
  3. Pilih Game Loop sebagai jenis pengujian, lalu klik Lanjutkan .
  4. Klik Telusuri , lalu telusuri file .apk aplikasi Anda. Catatan: Pada langkah ini, Anda dapat memilih untuk menjalankan subset loop, bukan hanya satu loop. Untuk informasi selengkapnya tentang menjalankan banyak loop sekaligus, lihat Fitur opsional.
  5. Klik Lanjutkan .
  6. Pilih perangkat fisik yang akan digunakan untuk menguji aplikasi Anda.
  7. Klik Mulai Tes .

Untuk informasi selengkapnya tentang memulai Firebase console, lihat Memulai pengujian dengan Firebase console.

Gunakan baris perintah gcloud (CLI)

  1. Jika Anda belum melakukannya, download dan instal Google Cloud SDK.

  2. Masuk ke gcloud CLI menggunakan akun Google Anda:

    gcloud auth login

  3. Tetapkan project Firebase Anda di gcloud, dengan PROJECT_ID sebagai ID project Firebase Anda:

    gcloud config set project PROJECT_ID
    
  4. Jalankan pengujian pertama Anda:

    gcloud firebase test android run \
     --type=game-loop --app=<var>path-to-apk</var> \
     --device model=herolte,version=23
    

Untuk informasi lebih lanjut tentang cara memulai gcloud CLI, lihat Memulai pengujian dari baris perintah gcloud.

Fitur pilihan

Test Lab menawarkan beberapa fitur opsional yang memungkinkan Anda menyesuaikan pengujian lebih lanjut, termasuk kemampuan untuk menulis data output, dukungan untuk beberapa loop game, dan label untuk loop terkait.

Menulis data keluaran

Pengujian Game Loop Anda dapat menulis output ke file yang ditentukan dalam metode launchIntent.getData() . Setelah menjalankan pengujian, Anda dapat mengakses data output ini di bagian Test Lab di Firebase console (lihat contoh file output pengujian Game Loop ).

Test Lab mengikuti praktik terbaik untuk berbagi file antar aplikasi yang dijelaskan di Berbagi File . Dalam metode onCreate() aktivitas Anda, tempat maksud Anda berada, Anda bisa memeriksa file keluaran data dengan menjalankan kode berikut:

Kotlin+KTX

val launchIntent = intent
val logFile = launchIntent.data
logFile?.let {
    Log.i(TAG, "Log file ${it.encodedPath}")
    // ...
}

Java

Intent launchIntent = getIntent();
Uri logFile = launchIntent.getData();
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    // ...
}

Jika Anda ingin menulis ke file dari sisi C++ aplikasi game, Anda dapat meneruskan deskriptor file alih-alih jalur file:

Kotlin+KTX

val launchIntent = intent
val logFile = launchIntent.data
var fd = -1
logFile?.let {
    Log.i(TAG, "Log file ${it.encodedPath}")
    fd = try {
        contentResolver
                .openAssetFileDescriptor(logFile, "w")!!
                .parcelFileDescriptor
                .fd
    } catch (e: FileNotFoundException) {
        e.printStackTrace()
        -1
    } catch (e: NullPointerException) {
        e.printStackTrace()
        -1
    }
}

// C++ code invoked here.
// native_function(fd);

Java

Intent launchIntent = getIntent();
Uri logFile = launchIntent.getData();
int fd = -1;
if (logFile != null) {
    Log.i(TAG, "Log file " + logFile.getEncodedPath());
    try {
        fd = getContentResolver()
                .openAssetFileDescriptor(logFile, "w")
                .getParcelFileDescriptor()
                .getFd();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
        fd = -1;
    } catch (NullPointerException e) {
        e.printStackTrace();
        fd = -1;
    }
}

// C++ code invoked here.
// native_function(fd);

C++

#include <unistd.h>
JNIEXPORT void JNICALL
Java_my_package_name_MyActivity_native_function(JNIEnv *env, jclass type, jint log_file_descriptor) {
// The file descriptor needs to be duplicated.
int my_file_descriptor = dup(log_file_descriptor);
}

Contoh file keluaran

Anda dapat menggunakan file data keluaran (diformat seperti contoh di bawah) untuk menampilkan hasil pengujian game loop di bagian Test Lab di Firebase console. Area yang ditampilkan sebagai /.../ dapat berisi bidang khusus apa pun yang Anda perlukan, selama tidak bertentangan dengan nama bidang lain yang digunakan dalam file ini:

{
  "name": "test name",
  "start_timestamp": 0, // Timestamp of the test start (in us).
                           Can be absolute or relative
  "driver_info": "...",
  "frame_stats": [
    {
      "timestamp": 1200000, // Timestamp at which this section was written
                               It contains value regarding the period
                               start_timestamp(0) -> this timestamp (1200000 us)
      "avg_frame_time": 15320, // Average time to render a frame in ns
      "nb_swap": 52, // Number of frame rendered
      "threads": [
        {
          "name": "physics",
          "Avg_time": 8030 // Average time spent in this thread per frame in us
        },
        {
          "name": "AI",
          "Avg_time": 2030 // Average time spent in this thread per frame in us
        }
      ],
      /.../ // Any custom field you want (vertices display on the screen, nb units …)
    },
    {
      // Next frame data here, same format as above
    }
  ],
  "loading_stats": [
    {
      "name": "assets_level_1",
      "total_time": 7850, // in us
      /.../
    },
    {
      "name": "victory_screen",
      "total_time": 554, // in us
      /.../
    }

  ],
  /.../, // You can add custom fields here
}

Beberapa putaran permainan

Anda mungkin merasa berguna untuk menjalankan beberapa loop game di aplikasi Anda. Sebuah loop adalah run-through lengkap dari aplikasi game Anda dari awal hingga akhir. Misalnya, jika Anda memiliki banyak level dalam game, Anda mungkin ingin memiliki satu loop game untuk meluncurkan setiap level daripada memiliki satu loop yang mengulangi semuanya. Dengan begitu, jika aplikasi Anda mogok pada level 32, Anda dapat langsung meluncurkan game loop tersebut untuk mereproduksi kerusakan dan menguji perbaikan bug.

Untuk memungkinkan aplikasi Anda menjalankan beberapa loop sekaligus:

  • Jika Anda menjalankan pengujian dengan Test Loop Manager:

    1. Tambahkan baris berikut ke manifes aplikasi Anda, di dalam elemen <application> :

      <meta-data
        android:name="com.google.test.loops"
        android:value="5" />
      

      Maksud peluncuran ini berisi loop target sebagai parameter bilangan bulat. Di bidang android:value , Anda dapat menentukan bilangan bulat dari 1 hingga 1024 (jumlah maksimum pengulangan yang diperbolehkan untuk satu pengujian). Perhatikan bahwa loop diindeks mulai dari 1, bukan 0.

    2. Di aplikasi Test Loop Manager, layar pemilihan muncul yang memungkinkan Anda memilih loop mana yang ingin Anda jalankan. Jika Anda memilih beberapa loop, setiap loop diluncurkan secara berurutan setelah loop sebelumnya selesai.

  • Jika Anda menjalankan pengujian dengan konsol Firebase, masukkan daftar atau rentang nomor loop di kolom Skenario .

  • Jika Anda menjalankan pengujian dengan gcloud CLI, tentukan daftar nomor loop menggunakan tanda --scenario-numbers . Misalnya, --scenario-numbers=1,3,5 menjalankan loop 1, 3, dan 5.

  • Jika Anda menulis C++ dan ingin mengubah perilaku loop Anda, berikan tambahan berikut ke kode C++ asli Anda:

    Kotlin+KTX

    val launchIntent = intent
    val scenario = launchIntent.getIntExtra("scenario", 0)

    Java

    Intent launchIntent = getIntent();
    int scenario = launchIntent.getIntExtra("scenario", 0);

    Anda sekarang dapat mengubah perilaku loop Anda berdasarkan nilai int yang dihasilkan.

Beri label loop permainan

Saat Anda melabeli loop game Anda dengan satu atau beberapa label skenario, Anda dan tim QA Anda dapat dengan mudah meluncurkan serangkaian game loop terkait (misalnya, "semua loop game kompatibilitas") dan mengujinya dalam matriks tunggal. Anda dapat membuat label sendiri atau menggunakan label standar yang ditawarkan oleh Test Lab:

  • com.google.test.loops.player_experience : Untuk loop yang digunakan untuk mereproduksi pengalaman pengguna nyata saat bermain game. Tujuan pengujian dengan loop ini adalah untuk menemukan masalah yang akan dihadapi pengguna nyata saat bermain game.
  • com.google.test.loops.gpu_compatibility : Untuk loop yang digunakan untuk menguji masalah terkait GPU. Tujuan pengujian dengan loop ini adalah untuk mengeksekusi kode GPU yang mungkin tidak berjalan dengan baik dalam produksi, untuk mengungkap masalah dengan perangkat keras dan driver.
  • com.google.test.loops.compatibility : Untuk loop yang digunakan untuk menguji berbagai masalah kompatibilitas, termasuk masalah I/O dan masalah OpenSSL.
  • com.google.test.loops.performance : Untuk loop yang digunakan untuk menguji kinerja perangkat. Misalnya, game mungkin berjalan pada pengaturan grafis paling kompleks untuk melihat perilaku perangkat baru.

Untuk memungkinkan aplikasi Anda menjalankan loop dengan label yang sama:

  • Jika Anda menjalankan pengujian dengan Test Loop Manager:

    1. Dalam manifes aplikasi Anda, tambahkan baris meta-data berikut dan ganti LABEL_NAME dengan label pilihan Anda:

      <meta-data
       android:name="com.google.test.loops.LABEL_NAME"
       android:value="1,3-5" />
      

      Di kolom android:value , Anda dapat menentukan rentang atau kumpulan bilangan bulat dari 1 hingga 1024 (jumlah maksimum loop yang diperbolehkan untuk satu pengujian) yang mewakili loop yang ingin Anda beri label. Perhatikan bahwa loop diindeks mulai dari 1, bukan 0. Misalnya, android:value="1,3-5" menerapkan LABEL_NAME ke loop 1, 3, 4, dan 5.

    2. Di aplikasi Test Loop Manager, masukkan satu atau beberapa label di bidang Label .

  • Jika Anda menjalankan pengujian dengan konsol Firebase, masukkan satu atau beberapa label di bidang Label .

  • Jika Anda menjalankan pengujian dengan gcloud CLI, tentukan satu atau beberapa label skenario dengan menggunakan --scenario-labels (misalnya, --scenario-labels=performance,gpu ).

Dukungan lisensi aplikasi

Test Lab mendukung aplikasi yang menggunakan layanan Pemberian Lisensi Aplikasi yang ditawarkan oleh Google Play. Agar berhasil memeriksa pemberian lisensi saat menguji aplikasi dengan Test Lab, Anda harus memublikasikan aplikasi ke saluran produksi di Play Store. Untuk menguji aplikasi Anda di saluran alfa atau beta menggunakan Test Lab, hapus pemeriksaan pemberian lisensi sebelum mengupload aplikasi Anda ke Test Lab.

Masalah Dikenal

Pengujian Game Loop di Test Lab memiliki masalah umum berikut:

  • Beberapa crash tidak mendukung backtrace. Misalnya, beberapa build rilis mungkin menekan output dari proses debuggerd menggunakan prctl(PR_SET_DUMPABLE, 0) . Untuk mempelajari lebih lanjut, lihat debuggerd .
  • API Level 19 saat ini tidak didukung karena kesalahan izin file.