Sigue los pasos que se indican en esta guía para acceder a los paquetes de elementos de tu app desde código de C y C++.
El código de integración de ejemplo está disponible en GitHub.
Crea contenido nativo
Usa los siguientes pasos para compilar Play Asset Delivery en el Android App Bundle de tu proyecto. No es necesario que uses Android Studio para seguir estos pasos.
Actualiza la versión del complemento de Android para Gradle en el archivo
build.gradle
de tu proyecto a4.0.0
o a una versión posterior.En el directorio de nivel superior de tu proyecto, crea un directorio para el paquete de elementos. Se usa el nombre de ese directorio como el nombre del paquete de elementos. Los nombres de los paquetes de elementos deben comenzar con una letra y solo pueden contener letras, números y guiones bajos.
En el directorio del paquete de recursos, crea un archivo
build.gradle
y agrega el siguiente código. Asegúrate de especificar el nombre del paquete de elementos y solo un tipo de entrega:// In the asset pack’s build.gradle file: plugins { id 'com.android.asset-pack' } assetPack { packName = "asset-pack-name" // Directory name for the asset pack dynamicDelivery { deliveryType = "[ install-time | fast-follow | on-demand ]" } }
En el archivo
build.gradle
de la app del proyecto, agrega el nombre de cada paquete de elementos de tu proyecto, como se muestra a continuación:// In the app build.gradle file: android { ... assetPacks = [":asset-pack-name", ":asset-pack2-name"] }
En el archivo
settings.gradle
del proyecto, incluye todos los paquetes de elementos de tu proyecto, como se muestra a continuación:// In the settings.gradle file: include ':app' include ':asset-pack-name' include ':asset-pack2-name'
En el directorio del paquete de elementos, crea el siguiente subdirectorio:
src/main/assets
.Coloca los recursos en el directorio
src/main/assets
. Aquí también puedes crear subdirectorios. Ahora la estructura del directorio de tu app debería verse de la siguiente manera:build.gradle
settings.gradle
app/
asset-pack-name/build.gradle
asset-pack-name/src/main/assets/your-asset-directories
Compila el Android App Bundle con Gradle. En el paquete de aplicación que se generó, el directorio raíz ahora incluye lo siguiente:
asset-pack-name/manifest/AndroidManifest.xml
: configura el identificador y el modo de entrega del paquete de elementos.asset-pack-name/assets/your-asset-directories
: es el directorio que contiene todos los elementos entregados como parte del paquete de elementos.
Gradle genera el manifiesto para cada paquete de recursos y da como resultado el directorio
assets/
por ti.Opcional: Configura el paquete de aplicación para que sea compatible con diferentes formatos de compresión de texturas.
Cómo realizar la integración con la biblioteca de Play Asset Delivery
Debes implementar esta API según el tipo de entrega del paquete de recursos al que deseas acceder. Estos pasos se muestran en el siguiente diagrama de flujo.
Figura 1: Diagrama de flujo para acceder a paquetes de recursos
El SDK nativo de Play Core proporciona el archivo de encabezado de C de play/asset_pack.h
para solicitar paquetes de recursos, administrar descargas y acceder a los recursos.
Cómo configurar tu entorno de desarrollo para el SDK nativo de Play Core
Descargar Play Core Native SDK
Antes de iniciar la descarga, debes aceptar los siguientes términos y condiciones.
Términos y Condiciones
Última modificación: 24 de septiembre de 2020- Si usas el kit de desarrollo de software de Play Core, aceptas estas condiciones, además de las Condiciones del Servicio de las API de Google ("Condiciones del Servicio de las API"). Si se encuentran en conflicto, estas tendrán prioridad sobre las Condiciones del Servicio de la API. Lee estas condiciones y las Condiciones del Servicio de la API minuciosamente.
- Para los propósitos de estas condiciones, "API" se refiere a las API de Google, otros servicios para desarrolladores y el software asociado, inclusive cualquier Código Redistribuible.
- Se llama "Código Redistribuible" a lo que provee Google como código de objeto o los archivos de encabezado que llaman a las API.
- Sujeto a estas condiciones y las de las Condiciones del Servicio de la API, puedes copiar y distribuir únicamente el Código Redistribuible a modo de inclusión como parte del Cliente de API. Google y sus proveedores de licencias son propietarios de todos los derechos, intereses y títulos; asimismo, de toda propiedad intelectual, otros derechos de propiedad y el Código Redistribuible. No modificarás, trasladarás ni crearás obras derivadas del Código Redistribuible.
- Google puede publicar un aviso sobre cambios en las condiciones en cualquier momento y brindará la opción de rechazar el uso del kit de desarrollo de software de Play Core. Google avisará sobre las modificaciones a las condiciones en https://developer.android.com/guide/playcore/license. Los cambios no se aplicarán de forma retroactiva.
Elige una de las siguientes opciones:
- Instala la versión 4.0 o una posterior de Android Studio. Usa la IU del SDK Manager para instalar la versión 10.0 de la plataforma del SDK de Android (nivel de API 29).
- Instala las herramientas de línea de comandos del SDK de Android y usa
sdkmanager
para instalar la versión 10.0 de la plataforma del SDK de Android (nivel de API 29).
Prepara Android Studio para el desarrollo nativo con SDK Manager a fin de instalar la versión más reciente del kit de desarrollo nativo (NDK) de CMake y Android. Obtén más información para crear o importar proyectos nativos en la sección Cómo comenzar a usar el NDK.
Descarga el archivo ZIP y extráelo junto con tu proyecto.
Vínculo de descarga Tamaño Suma de comprobación SHA-256 55,6 MB 058b4069f09714da938656d43b6dc28d3bc6f821c9d406e9c96a1c3af014dc45 Actualiza el archivo
build.gradle
de tu app como se muestra a continuación:Groovy
// App build.gradle plugins { id 'com.android.application' } // Define a path to the extracted Play Core SDK files. // If using a relative path, wrap it with file() since CMake requires absolute paths. def playcoreDir = file('../path/to/playcore-native-sdk') android { defaultConfig { ... externalNativeBuild { cmake { // Define the PLAYCORE_LOCATION directive. arguments "-DANDROID_STL=c++_static", "-DPLAYCORE_LOCATION=$playcoreDir" } } ndk { // Skip deprecated ABIs. Only required when using NDK 16 or earlier. abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } buildTypes { release { // Include Play Core Library proguard config files to strip unused code while retaining the Java symbols needed for JNI. proguardFile "$playcoreDir/proguard/common.pgcfg" proguardFile "$playcoreDir/proguard/per-feature-proguard-files" ... } debug { ... } } externalNativeBuild { cmake { path 'src/main/CMakeLists.txt' } } } dependencies { // Use the Play Core AAR included with the SDK. implementation files("$playcoreDir/playcore.aar") // Use the following dependency for the Play Integrity API. implementation("com.google.android.play:integrity:1.0.0") ... }
Kotlin
// App build.gradle plugins { id("com.android.application") } // Define a path to the extracted Play Core SDK files. // If using a relative path, wrap it with file() since CMake requires absolute paths. val playcoreDir = file("../path/to/playcore-native-sdk") android { defaultConfig { ... externalNativeBuild { cmake { // Define the PLAYCORE_LOCATION directive. arguments += listOf("-DANDROID_STL=c++_static", "-DPLAYCORE_LOCATION=$playcoreDir") } } ndk { // Skip deprecated ABIs. Only required when using NDK 16 or earlier. abiFilters.clear() abiFilters += listOf("armeabi-v7a", "arm64-v8a", "x86", "x86_64") } } buildTypes { release { // Include Play Core Library proguard config files to strip unused code while retaining the Java symbols needed for JNI. proguardFile("$playcoreDir/proguard/common.pgcfg") proguardFile("$playcoreDir/proguard/per-feature-proguard-files") ... } debug { ... } } externalNativeBuild { cmake { path = "src/main/CMakeLists.txt" } } } dependencies { // Use the Play Core AAR included with the SDK. implementation(files("$playcoreDir/playcore.aar")) ... }
Actualiza los archivos
CMakeLists.txt
de tu app como se muestra a continuación:cmake_minimum_required(VERSION 3.6) ... # Add a static library called “playcore” built with the c++_static STL. include(${PLAYCORE_LOCATION}/playcore.cmake) add_playcore_static_library() // In this example “main” is your native code library, i.e. libmain.so. add_library(main SHARED ...) target_include_directories(main PRIVATE ${PLAYCORE_LOCATION}/include ...) target_link_libraries(main android playcore ...)
Entrega durante la instalación
Los paquetes de elementos configurados como install-time
están disponibles apenas se inicia la app. Usa la API de NDK de AAssetManager a fin de acceder a los elementos que se entregan en este modo:
#include <android/asset_manager.h> #include <android_native_app_glue.h> ... AAssetManager* assetManager = app->activity->assetManager; AAsset* asset = AAssetManager_open(assetManager, "asset-name", AASSET_MODE_BUFFER); size_t assetLength = AAsset_getLength(asset); char* buffer = (char*) malloc(assetLength + 1); AAsset_read(asset, buffer, assetLength);
Entrega rápida y a pedido
En las siguientes secciones, se muestra cómo inicializar la API, obtener información sobre los paquetes de elementos antes de descargarlos, llamar a la API para iniciar la descarga y acceder a los paquetes descargados. Estas secciones se aplican a los paquetes de elementos fast-follow
y on-demand
.
Inicio de la app
Siempre llama a AssetPackManager_init()
para inicializar la API del paquete de elementos antes de llamar a cualquier otra función. Comprueba si hay códigos de error del paquete de elementos.
#include "play/asset_pack.h" ... AssetPackErrorCode AssetPackManager_init(JavaVM* jvm, jobject android_context);
Además, asegúrate de llamar a las siguientes funciones en onPause()
y onResume()
de ANativeActivityCallbacks
:
Obtén información de descarga sobre paquetes de elementos
Las apps deben divulgar el tamaño de la descarga antes de recuperar el paquete de elementos. Usa la función AssetPackManager_requestInfo()
a fin de iniciar una solicitud asíncrona para el tamaño de la descarga y aunque el paquete ya se esté descargando. Luego, usa AssetPackManager_getDownloadState()
para sondear el estado de descarga (por ejemplo, llama a esta función una vez por fotograma en el bucle de juego). Si falla una solicitud, consulta los códigos de error del paquete de recursos.
AssetPackErrorCode AssetPackManager_requestInfo(); // Call once AssetPackErrorCode AssetPackManager_getDownloadState(); // Call once per frame in your game loop
La función AssetPackManager_getDownloadState()
muestra el tipo opaco AssetPackDownloadState
como un puntero de salida. Usa ese puntero a fin de llamar a las siguientes funciones:
AssetPackDownloadState* state; AssetPackErrorCode error_code = AssetPackManager_getDownloadState(asset-pack-name, &state); AssetPackDownloadStatus status = AssetPackDownloadState_getStatus(state); uint64_t downloadedBytes = AssetPackDownloadState_getBytesDownloaded(state); uint64_t totalBytes = AssetPackDownloadState_getTotalBytesToDownload(state)); AssetPackDownloadState_destroy(state);
Instalar
Usa AssetPackManager_requestDownload()
para comenzar a descargar un paquete de elementos por primera vez o solicitar que se complete la actualización de un paquete:
AssetPackErrorCode AssetPackManager_requestDownload(); // Call once AssetPackErrorCode AssetPackManager_getDownloadState(); // Call once per frame in your game loop
La función AssetPackManager_getDownloadState()
muestra el tipo opaco AssetPackDownloadState
.
A fin de obtener información para usar este tipo, consulta Obtén información de descarga.
Descargas grandes
Si la descarga supera los 150 MB y el usuario no está conectado a una red Wi-Fi, no se iniciará la descarga hasta que el usuario otorgue explícitamente su consentimiento para proceder con la descarga mediante una conexión de datos móviles. Del mismo modo, si la descarga es grande y el usuario pierde la conexión Wi-Fi, se detendrá el proceso y se necesitará el consentimiento explícito a fin de continuar usando una conexión de datos móviles. Un paquete detenido tiene el estado WAITING_FOR_WIFI
. Para activar el flujo de la IU y solicitar el consentimiento del usuario, usa lo siguiente:
AssetPackManager_showCellularDataConfirmation()
AssetPackManager_getShowCellularDataConfirmationStatus()
Accede a los paquetes de elementos
Puedes acceder a un paquete de elementos mediante llamadas al sistema de archivos después de que la solicitud de descarga alcance el estado COMPLETED
. Cada paquete de elementos se almacena en un directorio independiente, en el almacenamiento interno de la app. Usa AssetPackManager_getAssetPackLocation()
a los efectos de obtener un AssetPackLocation
para el paquete de elementos especificado. Usa AssetPackLocation_getStorageMethod()
en esa ubicación para determinar el método de almacenamiento:
ASSET_PACK_STORAGE_APK
: el paquete de elementos se instala como un APK. Consulta Entrega durante la instalación a fin de acceder a estos elementos.ASSET_PACK_STORAGE_FILES
: usaAssetPackLocation_getAssetsPath()
para obtener una ruta de acceso del archivo al directorio que contiene los elementos, o valores nulos si estos no se descargaron. No modifiques los archivos descargados en esta ruta de acceso del archivo.
AssetPackLocation* location; AssetPackErrorCode error_code = AssetPackManager_getAssetPackLocation(asset-pack-name, &location); if (error_code == ASSET_PACK_NO_ERROR) { AssetPackStorageMethod storage_method = AssetPackLocation_getStorageMethod(location); const char* assets_path = AssetPackLocation_getAssetsPath(location); AssetPackLocation_destroy(location); }
Una vez que encuentres los elementos, usa funciones como fopen
o ifstream
para acceder a los archivos.
Otros métodos de la API de Play Core
Estos son algunos métodos de API adicionales que recomendamos que uses en tu app.
Cancelar solicitud
Usa AssetPackManager_cancelDownload()
para cancelar una solicitud activa de paquete de elementos. Ten en cuenta que esta solicitud es una operación de mejor esfuerzo.
Solicitar eliminación
Usa AssetPackManager_requestRemoval()
para programar la eliminación de un paquete de elementos.
Siguiente paso
Prueba Play Asset Delivery de forma local y desde Google Play.