Publikasi Terkelola Play

Dokumen ini menunjukkan cara memublikasikan game Anda di Google Play Game di PC menggunakan Penginstalan yang Dikelola Play.

Dengan Penginstalan Terkelola Play, Google Play mengelola penginstalan, update, dan peng-uninstalan game menggunakan file dan metadata game yang Anda berikan dalam file Windows app bundle (WAB).

Sebelum memulai

Integrasikan Google Play Game SDK ke dalam game Anda.

Mengemas game Anda sebagai file WAB

Untuk membuat file WAB Penginstalan yang Dikelola Play, ikuti langkah-langkah berikut:

  1. Download alat publikasi Play. Anda dapat menjalankan alat ini di command line Windows atau Powershell.

  2. Buat file konfigurasi penerbitan Play, dengan nama apa pun. Misalnya, play_publishing_config.xml dengan format berikut:

    <?xml version="1.0" encoding="UTF-8"?>
    <play-publishing-config version="1.0">
      <!-- Application metadata: This section contains basic information about your game. -->
      <application>
        <package-name>PACKAGE_NAME</package-name>
        <version-name>VERSION_NAME</version-name>
      </application>
    
      <!-- Game files: This section specifies which game files to include in the bundle and how to treat them. -->
      <game-files>
        <file-set>
          <root-folder-path>PATH_TO_ROOT_FOLDER</root-folder-path>
          <!-- absolute or relative to the parent directory of the config xml -->
          <!-- Exclusions: A list of files or folders to exclude from the bundle.
               This is useful for removing development files, temporary data, or redundant assets. -->
          <exclusions>
            <file-path>REGEX_PATTERN_OF_EXCLUDED_FILES</file-path>
            <file-path>PATH_TO_BE_EXCLUDED</file-path>
          </exclusions>
    
          <!-- File attributes: Define special handling for certain files during installation and updates. -->
          <file-attribute value=FILE_ATTRIBUTE_VALUE>
            <file-path>PATH_TO_FILE</file-path>
            <file-path>REGEX_PATTERN_OF_FILE_ATTRIBUTE_FILES</file-path>
          </file-attribute>
        </file-set>
      </game-files>
    
      <!-- This file represents the startup process for this game. Google Play Games for PC should start
          this process when user clicks on "Play" on this game. -->
      <launch-command>
        <path>PATH_TO_LAUNCH_FILE</path>
        <arguments>ARGUMENTS</arguments>
      </launch-command>
    
      <!-- Lifecycle operations: Custom actions to be performed during the game's installation and uninstallation. -->
      <lifecycle-operations>
        <!-- Install operations: These actions run when the game is installed. 'requiresElevation="true"'
            will trigger a UAC prompt for administrator rights. There are three types of install
            operations that can be specified. An instance of each is listed below. -->
        <install-operation requiresElevation=INSTALL_OPERATION_REQUIRES_ELEVATION>
          <operation-identifier>OPERATION_IDENTIFIER_STRING</operation-identifier>
          <execute-file>
            <path>PATH_TO_INSTALL_EXECUTE_FILE</path>
            <arguments>ARGUMENTS</arguments>
          </execute-file>
        </install-operation>
    
        <install-operation requiresElevation=INSTALL_OPERATION_REQUIRES_ELEVATION>
          <operation-identifier>OPERATION_IDENTIFIER_STRING</operation-identifier>
          <update-registry baseKey=BASE_KEY>
            <sub-key>SUB_KEY_PATH</sub-key>
            <value-name>VALUE_NAME</value-name>
            <value type=REGISTRY_VALUE_TYPE>VALUE_TEXT</value>
          </update-registry>
        </install-operation>
    
        <!-- Uninstall operations: These actions run before the game is uninstalled. -->
        <uninstall-operation requiresElevation=UNINSTALL_OPERATION_REQUIRES_ELEVATION>
          <execute-file>
            <path>PATH_TO_UNINSTALL_EXECUTE_FILE</path>
            <arguments>ARGUMENTS</arguments>
          </execute-file>
        </uninstall-operation>
      </lifecycle-operations>
    </play-publishing-config>

    Ganti kode berikut:

    • PACKAGE_NAME: Nama paket untuk game Anda. Ini adalah ID unik yang akan dikaitkan dengan game Anda di Google Play. Misalnya, com.yourcompany.yourgame. Nama paket harus mematuhi aturan berikut:
      • Nama harus memiliki setidaknya dua bagian (satu atau beberapa titik).
      • Setiap bagian harus diawali dengan huruf.
      • Semua karakter harus berupa alfanumerik atau garis bawah ([a-zA-Z0-9_]).
    • VERSION_NAME: String versi game. Ini dapat berupa string arbitrer, tetapi harus unik di semua WAB yang diupload untuk game Anda. Misalnya: 1.0, 1.0.1-beta, 2025.11.24, v1.rc1.
    • PATH_TO_ROOT_FOLDER: Jalur ke folder root yang berisi file game Anda. Semua file dalam folder ini, kecuali yang disebutkan dalam pengecualian, ditambahkan ke paket. Jalur ini dapat berupa absolut atau relatif ke direktori yang berisi file play_publishing_config.xml.

    • exclusions: (Opsional) Menentukan jalur atau pola file untuk file dalam PATH_TO_ROOT_FOLDER yang akan dikecualikan dari paket. Anda dapat menyertakan beberapa elemen file-path dalam elemen exclusions. Jalur dapat direpresentasikan dengan salah satu dari dua cara berikut:

      • Sebagai jalur file: Jalur ke file yang akan dikecualikan.
      • Sebagai string regex: Semua file yang cocok dengan string ekspresi reguler akan dikecualikan dari paket. Gunakan sintaksis RE2.
    • file-attribute: (Opsional) Menentukan atribut untuk file tertentu atau file yang cocok dengan pola ekspresi reguler.

      • FILE_ATTRIBUTE_VALUE: Dapat berupa salah satu dari berikut:
        • SKIP_UPDATE: Selama update, atribut ini memberi tahu sistem untuk menyalin file hanya jika file belum ada, sehingga perubahan pada file yang ada akan dipertahankan.
        • MODIFIED_ON_DEVICE: Gunakan ini untuk file yang harus diupdate, tetapi dapat diubah di perangkat setelah penginstalan. Sistem akan mendownload file baru lengkap dan mengganti versi yang diinstal selama update. Jika file ini berbeda dari versi yang diinstal selama pemeriksaan integritas penginstalan, penginstalan tidak dianggap rusak.
      • file-path: Mengidentifikasi file untuk atribut ini. Anda dapat menyertakan beberapa elemen file-path dalam setiap elemen file-attribute. Setiap jalur dapat ditampilkan dengan salah satu dari dua cara berikut:
        • Sebagai jalur file: Jalur ke file yang akan dikaitkan dengan atribut ini.
        • Sebagai string regex: Semua file yang cocok dengan string ekspresi reguler dikaitkan dengan nilai atribut. Gunakan sintaksis RE2.
    • PATH_TO_LAUNCH_FILE: Jalur ke file yang dapat dieksekusi yang digunakan untuk meluncurkan game.

    • ARGUMENTS: (Opsional) Argumen command line. Elemen <arguments> digunakan untuk meneruskan argumen ke file yang dapat dieksekusi yang ditentukan dalam <launch-command>, <install-operation>, atau <uninstall-operation>. Setiap penggunaan elemen <arguments> hanya berlaku untuk file yang dapat dieksekusi yang ditentukan bersama elemen tersebut, sehingga Anda dapat menentukan argumen yang berbeda untuk file yang dapat dieksekusi yang berbeda.

      • Jika file yang dapat dieksekusi memiliki beberapa argumen, pisahkan dengan spasi.
      • Tambahkan awalan argumen dengan -- atau - jika file yang dapat dieksekusi memerlukannya. Contoh:
        <arguments>--package_name --version_name</arguments>
    • lifecycle-operations: (Opsional) Tindakan kustom yang akan dilakukan selama penginstalan atau penghapusan penginstalan game.

      • install-operation: Tindakan yang akan dijalankan saat game diinstal. Anda dapat menentukan dua jenis operasi penginstalan: execute-file dan update-registry.
      • uninstall-operation: Tindakan yang akan dijalankan sebelum game diuninstal. Operasi update-registry akan otomatis dikembalikan selama proses penghapusan instalasi.
      • INSTALL_OPERATION_REQUIRES_ELEVATION: Menunjukkan apakah operasi penginstalan perlu dijalankan dengan hak istimewa administrator.

        • "true": Jalankan sebagai Administrator.
        • "false": Jalankan sebagai pengguna saat ini. Nilai ini adalah default jika tidak ditentukan.
      • UNINSTALL_OPERATION_REQUIRES_ELEVATION: Menunjukkan apakah operasi uninstal perlu dijalankan dengan hak istimewa administrator.

        • "true": Jalankan sebagai Administrator.
        • "false": Jalankan sebagai pengguna saat ini. Nilai ini adalah default jika tidak ditentukan.
      • operation-identifier: String unik untuk mengidentifikasi install-operation.

      • execute-file: Menjalankan file yang dapat dieksekusi.

        • PATH_TO_INSTALL_EXECUTE_FILE: Jalur ke file yang dapat dieksekusi untuk dijalankan selama penginstalan.
        • PATH_TO_UNINSTALL_EXECUTE_FILE: Jalur ke file yang dapat dieksekusi untuk dijalankan sebelum proses uninstal.
      • update-registry: Membuat atau memperbarui entri registri Windows.

        • BASE_KEY: Menentukan kunci root yang akan digunakan di registri Windows. Nilai yang diterima: HKEY_CLASSES_ROOT, HKEY_CURRENT_CONFIG, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_PERFORMANCE_DATA, dan HKEY_USERS. Saat melakukan operasi update-registry, tetapkan requiresElevation="true" pada install-operation induk berdasarkan baseKey yang digunakan:
          • HKEY_LOCAL_MACHINE atau HKEY_CURRENT_CONFIG: Tetapkan requiresElevation="true".
          • HKEY_CURRENT_USER: requiresElevation="true" tidak diperlukan.
          • HKEY_CLASSES_ROOT: Tetapkan requiresElevation="true" hanya jika menulis ke bagian di seluruh perangkat; tidak diperlukan untuk bagian khusus pengguna.
          • HKEY_USERS: Berisi profil untuk semua pengguna. Tetapkan requiresElevation="true" saat mengubah profil selain profil pengguna saat ini (misalnya, pengguna lain atau .DEFAULT).
        • SUB_KEY_PATH: Ini merepresentasikan jalur ke kunci tertentu dalam Registry Windows, yang berada di bawah baseKey utama.
        • VALUE_NAME: Menentukan nama entri data yang ingin Anda ubah dalam sub-kunci yang ditentukan.
        • REGISTRY_VALUE_TYPE: Atribut ini menentukan jenis data nilai yang ditulis ke registri. Nilai yang didukung adalah STRING untuk string atau DWORD untuk angka 32-bit.
        • VALUE_TEXT: Data yang akan disimpan di kunci registri.

    Cara menggunakan ekspresi reguler

    Anda dapat menggunakan ekspresi reguler sintaksis RE2 dalam tag file-path untuk menerapkan pengecualian atau atribut file ke sekelompok file. Jangan lupa untuk menggunakan garis miring / untuk pemisah direktori, dan untuk memisahkan karakter ekspresi reguler khusus dengan garis miring terbalik \. Misalnya, gunakan \. untuk mencocokkan titik literal ., atau \d untuk mencocokkan digit.

    Berikut beberapa contoh umumnya:

    • Mencocokkan semua file dengan ekstensi tertentu (Misalnya, .log) di direktori mana pun

      Gunakan .*\.log untuk mencocokkan jalur apa pun yang diakhiri dengan .log, seperti game.log atau logs/errors.log.

      <file-path>.*\.log</file-path>
    • Mencocokkan semua file dan subdirektori dalam folder tertentu (Misalnya, 'temp')

      Gunakan temp/.* untuk mencocokkan semua jalur yang diawali dengan temp/, seperti temp/data.txt atau temp/saves/file.sav.

      <file-path>temp/.*</file-path>
    • Mencocokkan file yang cocok dengan pola di folder tertentu

      Gunakan assets/level\d\.dat untuk mencocokkan assets/level1.dat, assets/level2.dat, tetapi tidak assets/other.dat.

      <file-path>assets/level\d\.dat</file-path>
    • Mencocokkan nama folder saat muncul di mana saja dalam jalur

      Gunakan .*/cache/.* untuk mencocokkan file di direktori apa pun yang bernama cache, seperti game/cache/file.txt atau temp/cache/other.log.

      <file-path>.*/cache/.*</file-path>
    • Mencocokkan file dengan salah satu dari beberapa ekstensi (Misalnya, .ini, .cfg, .sav)

      Gunakan .*\.(ini|cfg|sav) untuk mencocokkan file apa pun yang diakhiri dengan .ini, .cfg, atau .sav, seperti settings.ini, config.cfg, atau saves/slot1.sav.

      <file-path>.*\.(ini|cfg|sav)</file-path>
    • Mencocokkan file dengan ekstensi tertentu di direktori tertentu (Misalnya, .ogg di music/ atau sfx/)

      Gunakan (music|sfx)/.*\.ogg untuk mencocokkan file .ogg yang berada di direktori music/ atau sfx/, tetapi tidak di tempat lain. Cocok dengan music/level1.ogg atau sfx/explosion.ogg, tetapi tidak dengan voice/intro.ogg.

      <file-path>(music|sfx)/.*\.ogg</file-path>

    Contoh file konfigurasi publikasi Play

    Berikut contoh play_publishing_config.xml untuk game bernama TestGame:

    <?xml version="1.0" encoding="UTF-8"?>
    <play-publishing-config version="1.0">
      <application>
        <package-name>com.test.package</package-name>
        <version-name>1.0</version-name>
      </application>
    
      <game-files>
        <file-set>
          <root-folder-path>C:\Users\Username\game-files</root-folder-path>
          <exclusions>
            <file-path>mock_game\d\.exe</file-path> <!-- exclude files using a regex -->
            <file-path>deprecated_graphics</file-path> <!-- exclude a folder -->
            <file-path>.*\.log</file-path> <!-- recursively exclude all files with .log extension -->
          </exclusions>
    
          <file-attribute value="SKIP_UPDATE">
            <file-path>settings.ini</file-path>
          </file-attribute>
    
          <file-attribute value="MODIFIED_ON_DEVICE">
            <file-path>game_assets\d\.zip</file-path> <!-- define the path using regex -->
          </file-attribute>
        </file-set>
      </game-files>
    
      <launch-command>
        <path>launcher_test_game.exe</path>
        <arguments>--launch-arg</arguments> <!-- optional -->
      </launch-command>
    
      <lifecycle-operations>
        <install-operation requiresElevation="true">
          <operation-identifier>elevated-execute-file</operation-identifier>
          <execute-file>
            <path>install_file.exe</path>
            <arguments>--arg</arguments> <!-- optional -->
          </execute-file>
        </install-operation>
    
        <install-operation requiresElevation="true">
          <operation-identifier>elevated-update-registry</operation-identifier>
          <update-registry baseKey="HKEY_LOCAL_MACHINE">
            <sub-key>SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\TestGame</sub-key>
            <value-name>InstallLocation</value-name>
            <value type="STRING">C:\Program Files\TestGame</value>
          </update-registry>
        </install-operation>
    
        <uninstall-operation requiresElevation="true">
          <execute-file>
            <path>uninstall.exe</path>
            <arguments>--test-arg</arguments> <!-- optional -->
          </execute-file>
        </uninstall-operation>
      </lifecycle-operations>
    </play-publishing-config>
  3. Jalankan alat publikasi Play di command line atau Powershell Windows, menggunakan perintah build-bundle:

    playpublishingtool.exe build-bundle --input=PLAY_PUBLISHING_CONFIG_PATH --output=WAB_OUTPUT_PATH
    

    Untuk menimpa file WAB yang ada dengan nama yang sama, gunakan argumen --force.

    playpublishingtool.exe build-bundle --input=PLAY_PUBLISHING_CONFIG_PATH --output=WAB_OUTPUT_PATH --force
    

    Ganti kode berikut:

    • PLAY_PUBLISHING_CONFIG_PATH: Jalur ke konfigurasi publikasi Play. Misalnya, path\to\play_publishing_config.xml.
    • WAB_OUTPUT_PATH: Jalur ke file WAB. Misalnya, path\to\output_bundle.wab.

    Cara menggunakan alat publikasi Play

    Jika Anda memiliki playpublishingtool.exe, play_publishing_config.xml, dan file game Anda di game_files/ di direktori kerja saat ini:

    .\
    ├── game_files/
    ├── play_publishing_config.xml
    ├── playpublishingtool.exe
    

    Untuk membuat pmi_bundle.wab di direktori yang sama, jalankan:

    playpublishingtool.exe build-bundle --input=play_publishing_config.xml --output=pmi_bundle.wab
    

    Saat alat membuat paket, Anda akan melihat status progres di terminal:

    Building bundle: [====       ] 40%
    

    Jika berhasil, Anda akan melihat output yang mirip dengan berikut ini:

    Building bundle: [===========] 100%
    Successfully built the managed install bundle at pmi_bundle.wab
    

    Temukan file WAB di folder:

      .\
      ├── game_files/
      ├── pmi_bundle.wab
      ├── play_publishing_config.xml
      ├── playpublishingtool.exe