Publicación administrada en Play

En este documento, se muestra cómo publicar tu juego en Google Play Juegos para PC con la instalación administrada por Play.

Con la instalación administrada por Play, Google Play administra la instalación, la actualización y la desinstalación del juego con los archivos y los metadatos del juego que proporcionas en un archivo de paquete de aplicación para Windows (WAB).

Antes de comenzar

Integra el SDK de Google Play Juegos en tu juego.

Empaqueta tu juego como un archivo WAB

Para crear un archivo WAB de instalación administrada por Play, sigue estos pasos:

  1. Descarga la herramienta de publicación de Play. Puedes ejecutar esta herramienta en la línea de comandos de Windows o en PowerShell.

  2. Crea el archivo de configuración de publicación de Play con cualquier nombre. Por ejemplo, play_publishing_config.xml con el siguiente formato:

    <?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>

    Reemplaza lo siguiente:

    • PACKAGE_NAME: Es el nombre del paquete de tu juego. Es el identificador único que se asociará con tu juego en Google Play. Por ejemplo, com.yourcompany.yourgame. El nombre del paquete debe cumplir con las siguientes reglas:
      • Debe tener al menos dos segmentos (uno o más puntos).
      • Cada segmento debe comenzar con una letra.
      • Todos los caracteres deben ser alfanuméricos o un guion bajo ([a-zA-Z0-9_]).
    • VERSION_NAME: Es la cadena de versión del juego. Puede ser cualquier cadena arbitraria, pero debe ser única en todos los archivos WAB subidos para tu juego. Por ejemplo: 1.0, 1.0.1-beta, 2025.11.24 y v1.rc1.
    • PATH_TO_ROOT_FOLDER: Es la ruta de acceso a la carpeta raíz que contiene los archivos del juego. Todos los archivos de esta carpeta, excepto los que se mencionan en las exclusiones, se agregan al paquete. Esta ruta de acceso puede ser absoluta o relativa al directorio que contiene el archivo play_publishing_config.xml.

    • exclusions: (Opcional) Especifica rutas de acceso o patrones de archivos dentro de PATH_TO_ROOT_FOLDER para excluir del paquete. Puedes incluir varios elementos file-path dentro del elemento exclusions. Una ruta se puede representar de dos maneras:

      • Como ruta de acceso a un archivo: Es la ruta de acceso al archivo que se excluirá.
      • Como una cadena de regex: Todos los archivos que coincidan con la cadena de expresión regular se excluyen del paquete. Usa la sintaxis RE2.
    • file-attribute: (Opcional) Define atributos para archivos específicos o archivos que coinciden con un patrón de expresión regular.

      • FILE_ATTRIBUTE_VALUE: Puede ser uno de los siguientes:
        • SKIP_UPDATE: Durante una actualización, este atributo le indica al sistema que copie el archivo solo si aún no está presente, y que conserve los cambios en un archivo existente.
        • MODIFIED_ON_DEVICE: Usa este valor para los archivos que se deben actualizar, pero que se podrían modificar en el dispositivo después de la instalación. Durante una actualización, el sistema descarga el archivo nuevo completo y reemplaza la versión instalada. Si este archivo es diferente de la versión instalada durante las verificaciones de integridad de la instalación, no se considera que la instalación esté dañada.
      • file-path: Identifica los archivos de este atributo. Puedes incluir varios elementos file-path dentro de cada elemento file-attribute. Cada ruta se puede representar de dos maneras:
        • Como ruta de acceso al archivo: Es la ruta de acceso al archivo con el que se asociará este atributo.
        • Como una cadena de regex: Todos los archivos que coincidan con la cadena de expresión regular se asocian con el valor del atributo. Usa la sintaxis RE2.
    • PATH_TO_LAUNCH_FILE: Es la ruta de acceso al archivo ejecutable que se usa para iniciar el juego.

    • ARGUMENTS: (Opcional) Argumentos de la línea de comandos. El elemento <arguments> se usa para pasar argumentos a un archivo ejecutable especificado en <launch-command>, <install-operation> o <uninstall-operation>. Cada uso del elemento <arguments> se aplica solo al ejecutable junto al que se define, lo que te permite especificar diferentes argumentos para diferentes ejecutables.

      • Si un archivo ejecutable tiene varios argumentos, sepáralos con un espacio.
      • Antepón los argumentos con -- o - si el ejecutable lo requiere. Ejemplo:
        <arguments>--package_name --version_name</arguments>
    • lifecycle-operations: (Opcional) Son acciones personalizadas que se realizan durante la instalación o desinstalación del juego.

      • install-operation: Es una acción que se ejecuta cuando se instala el juego. Puedes especificar dos tipos de operaciones de instalación: execute-file y update-registry.
      • uninstall-operation: Es una acción que se ejecutará antes de que se desinstale el juego. Las operaciones de update-registry se revierten automáticamente durante la desinstalación.
      • INSTALL_OPERATION_REQUIRES_ELEVATION: Indica si la operación de instalación debe ejecutarse con privilegios de administrador.

        • "true": Ejecutar como administrador.
        • "false": Se ejecuta como el usuario actual. Este es el valor predeterminado si no se especifica.
      • UNINSTALL_OPERATION_REQUIRES_ELEVATION: Indica si la operación de desinstalación debe ejecutarse con privilegios de administrador.

        • "true": Ejecutar como administrador.
        • "false": Se ejecuta como el usuario actual. Este es el valor predeterminado si no se especifica.
      • operation-identifier: Es una cadena única para identificar un install-operation.

      • execute-file: Ejecuta un archivo ejecutable.

        • PATH_TO_INSTALL_EXECUTE_FILE: Es la ruta de acceso a un ejecutable que se ejecutará durante la instalación.
        • PATH_TO_UNINSTALL_EXECUTE_FILE: Es la ruta de acceso a un ejecutable que se ejecutará antes de la desinstalación.
      • update-registry: Crea o actualiza una entrada del registro de Windows.

        • BASE_KEY: Define la clave raíz que se usará en el registro de Windows. Valores aceptados: HKEY_CLASSES_ROOT, HKEY_CURRENT_CONFIG, HKEY_CURRENT_USER, HKEY_LOCAL_MACHINE, HKEY_PERFORMANCE_DATA y HKEY_USERS. Cuando realices una operación update-registry, establece requiresElevation="true" en el elemento principal install-operation según el baseKey que se use:
          • HKEY_LOCAL_MACHINE o HKEY_CURRENT_CONFIG: Establece requiresElevation="true".
          • HKEY_CURRENT_USER: No se necesita requiresElevation="true".
          • HKEY_CLASSES_ROOT: Establece requiresElevation="true" solo si escribes en secciones de toda la máquina; no es necesario para las secciones específicas del usuario.
          • HKEY_USERS: Contiene perfiles para todos los usuarios. Establece requiresElevation="true" cuando modifiques perfiles que no sean el del usuario actual (p.ej., otros usuarios o .DEFAULT).
        • SUB_KEY_PATH: Representa la ruta de acceso a una clave específica dentro del Registro de Windows, anidada en la clave principal baseKey.
        • VALUE_NAME: Especifica el nombre de la entrada de datos que deseas modificar dentro de la subclave designada.
        • REGISTRY_VALUE_TYPE: Este atributo especifica el tipo de datos del valor que se escribe en el registro. Los valores admitidos son STRING para una cadena o DWORD para un número de 32 bits.
        • VALUE_TEXT: Son los datos que se almacenarán en la clave del registro.

    Cómo usar expresiones regulares

    Puedes usar expresiones regulares de sintaxis RE2 en etiquetas file-path para aplicar exclusiones o atributos de archivo a un grupo de archivos. Recuerda usar barras diagonales / para los separadores de directorios y caracteres especiales de expresiones regulares con una barra inversa \. Por ejemplo, usa \. para que coincida con un punto literal . o \d para que coincida con un dígito.

    Estos son algunos ejemplos comunes:

    • Coincide con todos los archivos que tienen una extensión específica (por ejemplo, .log) en cualquier directorio

      Usa .*\.log para que coincida con cualquier ruta que termine con .log, como game.log o logs/errors.log.

      <file-path>.*\.log</file-path>
    • Coincide con todos los archivos y subdirectorios dentro de una carpeta específica (por ejemplo, "temp")

      Usa temp/.* para que coincidan todas las rutas que comienzan con temp/, como temp/data.txt o temp/saves/file.sav.

      <file-path>temp/.*</file-path>
    • Cómo hacer coincidir archivos que coinciden con un patrón en una carpeta específica

      Usa assets/level\d\.dat para que coincida con assets/level1.dat y assets/level2.dat, pero no con assets/other.dat.

      <file-path>assets/level\d\.dat</file-path>
    • Coincide con el nombre de una carpeta cuando aparece en cualquier parte de la ruta de acceso

      Usa .*/cache/.* para hacer coincidir archivos en cualquier directorio llamado cache, como game/cache/file.txt o temp/cache/other.log.

      <file-path>.*/cache/.*</file-path>
    • Coincidir con archivos con una de varias extensiones (por ejemplo, .ini, .cfg, .sav)

      Usa .*\.(ini|cfg|sav) para que coincida con cualquier archivo que termine en .ini, .cfg o .sav, como settings.ini, config.cfg o saves/slot1.sav.

      <file-path>.*\.(ini|cfg|sav)</file-path>
    • Coincide con archivos con una extensión específica en directorios específicos (por ejemplo, .ogg en music/ o sfx/)

      Usa (music|sfx)/.*\.ogg para que coincida con cualquier archivo .ogg que se encuentre en los directorios music/ o sfx/, pero no en otros lugares. Coincide con music/level1.ogg o sfx/explosion.ogg, pero no con voice/intro.ogg.

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

    Ejemplo de archivo de configuración de publicación de Play

    Este es un ejemplo de play_publishing_config.xml para un juego llamado 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. Ejecuta la herramienta de publicación de Play en la línea de comandos de Windows o en PowerShell con el comando build-bundle:

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

    Para reemplazar un archivo .wab existente con el mismo nombre, usa el argumento --force.

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

    Reemplaza lo siguiente:

    • PLAY_PUBLISHING_CONFIG_PATH: Es la ruta de acceso a la configuración de publicación de Play. Por ejemplo, path\to\play_publishing_config.xml.
    • WAB_OUTPUT_PATH: Es la ruta de acceso al archivo WAB. Por ejemplo, path\to\output_bundle.wab.

    Cómo usar la herramienta de publicación de Play

    Si tienes playpublishingtool.exe, play_publishing_config.xml y los archivos de tu juego en game_files/ en el directorio de trabajo actual, haz lo siguiente:

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

    Para crear pmi_bundle.wab en el mismo directorio, ejecuta lo siguiente:

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

    Mientras la herramienta compila el paquete, verás una barra de progreso en la terminal:

    Building bundle: [====       ] 40%
    

    Si se ejecuta de forma correcta, deberías ver un resultado similar al siguiente:

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

    Busca el archivo WAB en la carpeta:

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