ผสานรวมการนำส่งเนื้อหา (เนทีฟ)

ใช้ขั้นตอนในคู่มือนี้เพื่อเข้าถึง Asset Pack ของแอปจาก C และ C++ โค้ด

ตัวอย่าง รหัสการผสานรวม มีใน GitHub

สร้างมาเพื่อโฆษณาเนทีฟ

ใช้ขั้นตอนต่อไปนี้เพื่อสร้างการนำส่งเนื้อหา Play ลงใน Android ของโปรเจ็กต์ App Bundle คุณไม่จำเป็นต้องใช้ Android Studio ในการทำตามขั้นตอนเหล่านี้

  1. อัปเดตเวอร์ชันของปลั๊กอิน Android Gradle ในโปรเจ็กต์ build.gradle ไฟล์ไปยัง 4.0.0 ขึ้นไป

  2. ในไดเรกทอรีระดับบนสุดของโปรเจ็กต์ ให้สร้างไดเรกทอรีสำหรับเนื้อหา แพ็ก ชื่อไดเรกทอรีนี้จะใช้เป็นชื่อ Asset Pack ชื่อ Asset Pack ต้องขึ้นต้นด้วยตัวอักษรและประกอบด้วยตัวอักษร ตัวเลข และ ขีดล่าง

  3. ในไดเรกทอรี Asset Pack ให้สร้างไฟล์ build.gradle แล้วเพิ่มเมธอด โค้ดต่อไปนี้ อย่าลืมระบุชื่อ Asset Pack และระบุเพียงชื่อเดียว ประเภทการนำส่ง:

    // 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 ]"
        }
    }
    
  4. เพิ่มชื่อ Asset Pack ทั้งหมดในไฟล์ build.gradle ของแอปของโปรเจ็กต์ ในโปรเจ็กต์ของคุณตามที่แสดงด้านล่าง

    // In the app build.gradle file:
    android {
        ...
        assetPacks = [":asset-pack-name", ":asset-pack2-name"]
    }
    
  5. ในไฟล์ settings.gradle ของโปรเจ็กต์ ให้ใส่ Asset Pack ทั้งหมดไว้ในไฟล์ ตามที่แสดงด้านล่าง

    // In the settings.gradle file:
    include ':app'
    include ':asset-pack-name'
    include ':asset-pack2-name'
    
  6. ในไดเรกทอรี Asset Pack ให้สร้างไดเรกทอรีย่อยต่อไปนี้ src/main/assets

  7. วางเนื้อหาไว้ในไดเรกทอรี src/main/assets คุณสามารถสร้าง ในไดเรกทอรีย่อยด้วย โครงสร้างไดเรกทอรีสำหรับแอปควร ซึ่งจะมีลักษณะดังนี้

    • build.gradle
    • settings.gradle
    • app/
    • asset-pack-name/build.gradle
    • asset-pack-name/src/main/assets/your-asset-directories
  8. สร้าง Android App Bundle ด้วย Gradle ใน App Bundle ที่สร้างขึ้น ตอนนี้ไดเรกทอรีระดับรูทได้รวม ดังต่อไปนี้:

    • asset-pack-name/manifest/AndroidManifest.xml: กำหนดค่าตัวระบุและโหมดการนำส่งของ Asset Pack
    • asset-pack-name/assets/your-asset-directories: ไดเรกทอรีที่มีการนำส่งเนื้อหาทั้งหมดซึ่งเป็นส่วนหนึ่งของ Asset Pack

    Gradle สร้างไฟล์ Manifest สำหรับ Asset Pack แต่ละรายการและเอาต์พุต assets/ ไดเรกทอรีให้กับคุณ

  9. (ไม่บังคับ) กำหนดค่า App Bundle ให้รองรับพื้นผิวต่างๆ รูปแบบการบีบอัด

ผสานรวมกับไลบรารีการนำส่งเนื้อหา Play

คุณใช้ API นี้ตามประเภทการนำส่งของ Asset Pack ที่ต้องการเข้าถึง ขั้นตอนเหล่านี้จะปรากฏในส่วนต่อไปนี้ โฟลว์ชาร์ต

แผนภาพโฟลว์ของ Asset Pack สำหรับโค้ดแบบเนทีฟ

รูปที่ 1 แผนภาพสำหรับการเข้าถึง Asset Pack

Play Core Native SDK มีส่วนหัว C ไฟล์ play/asset_pack.h เพื่อขอ Asset Pack จัดการการดาวน์โหลด และ การเข้าถึงชิ้นงาน

ตั้งค่าสภาพแวดล้อมในการพัฒนาซอฟต์แวร์สําหรับ Play Core Native SDK

Download Play Core Native SDK

Before downloading, you must agree to the following terms and conditions.

Terms and Conditions

Last modified: September 24, 2020
  1. By using the Play Core Software Development Kit, you agree to these terms in addition to the Google APIs Terms of Service ("API ToS"). If these terms are ever in conflict, these terms will take precedence over the API ToS. Please read these terms and the API ToS carefully.
  2. For purposes of these terms, "APIs" means Google's APIs, other developer services, and associated software, including any Redistributable Code.
  3. “Redistributable Code” means Google-provided object code or header files that call the APIs.
  4. Subject to these terms and the terms of the API ToS, you may copy and distribute Redistributable Code solely for inclusion as part of your API Client. Google and its licensors own all right, title and interest, including any and all intellectual property and other proprietary rights, in and to Redistributable Code. You will not modify, translate, or create derivative works of Redistributable Code.
  5. Google may make changes to these terms at any time with notice and the opportunity to decline further use of the Play Core Software Development Kit. Google will post notice of modifications to the terms at https://developer.android.com/guide/playcore/license. Changes will not be retroactive.
Download Play Core Native SDK

play-core-native-sdk-1.14.0.zip

  1. เลือกดำเนินการอย่างหนึ่งดังต่อไปนี้

    • ติดตั้ง Android Studio เวอร์ชัน 4.0 ขึ้นไป ใช้ SDK UI ของ Manager เพื่อติดตั้งแพลตฟอร์ม Android SDK เวอร์ชัน 10.0 (API ระดับ 29)
    • ติดตั้งเครื่องมือบรรทัดคำสั่ง Android SDK และใช้ sdkmanager เพื่อติดตั้ง แพลตฟอร์ม Android SDK เวอร์ชัน 10.0 (API ระดับ 29)
  2. เตรียม Android Studio สำหรับการพัฒนาในตัวโดยใช้ SDK Manager เพื่อติดตั้งเวอร์ชันล่าสุด CMake และ Android Native Development Kit (NDK) สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ การสร้างหรือการนำเข้าโปรเจ็กต์เนทีฟ โปรดดู เริ่มต้นใช้งาน NDK

  3. ดาวน์โหลดไฟล์ ZIP และแตกข้อมูลควบคู่ไปกับโปรเจ็กต์ของคุณ

    ลิงก์ดาวน์โหลด ขนาด ผลรวมตรวจสอบ SHA-256
    36 MiB 782a8522d937848c83a715c9a258b95a3ff2879a7cd71855d137b41c00786a5e
  4. อัปเดตไฟล์ build.gradle ของแอปตามที่แสดงด้านล่าง

    ดึงดูด

        // 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/gms_task.pgcfg'
                    proguardFile '$playcoreDir/proguard/per-feature-proguard-files'
                    ...
                }
                debug {
                    ...
                }
            }
            externalNativeBuild {
                cmake {
                    path 'src/main/CMakeLists.txt'
                }
            }
        }
    
        dependencies {
            // Import these feature-specific AARs for each Google Play Core library.
            implementation 'com.google.android.play:app-update:2.1.0'
            implementation 'com.google.android.play:asset-delivery:2.2.2'
            implementation 'com.google.android.play:integrity:1.4.0'
            implementation 'com.google.android.play:review:2.0.1'
    
            // Import these common dependencies.
            implementation 'com.google.android.gms:play-services-tasks:18.0.2'
            implementation files("$playcoreDir/playcore-native-metadata.jar")
            ...
        }
        

    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/gms_task.pgcfg")
                proguardFile("$playcoreDir/proguard/per-feature-proguard-files")
                ...
            }
            debug {
                ...
            }
        }
        externalNativeBuild {
            cmake {
                path = "src/main/CMakeLists.txt"
            }
        }
    }
    
    dependencies {
        // Import these feature-specific AARs for each Google Play Core library.
        implementation("com.google.android.play:app-update:2.1.0")
        implementation("com.google.android.play:asset-delivery:2.2.2")
        implementation("com.google.android.play:integrity:1.4.0")
        implementation("com.google.android.play:review:2.0.1")
    
        // Import these common dependencies.
        implementation("com.google.android.gms:play-services-tasks:18.0.2")
        implementation(files("$playcoreDir/playcore-native-metadata.jar"))
        ...
    }
    
  5. อัปเดตไฟล์ CMakeLists.txt ของแอปตามที่แสดงด้านล่าง

    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
            ...)
    

การรวบรวมข้อมูล

Play Core Native SDK อาจรวบรวมข้อมูลที่เกี่ยวข้องกับเวอร์ชันเพื่อให้ Google ดำเนินการต่อไปนี้ได้ เพื่อปรับปรุงผลิตภัณฑ์ รวมถึง

  • ชื่อแพ็กเกจของแอป
  • เวอร์ชันแพ็กเกจของแอป
  • เวอร์ชันของ Play Core Native SDK

ข้อมูลนี้จะรวบรวมเมื่อคุณอัปโหลดแพ็กเกจแอป ไปยัง Play Console หากต้องการเลือกไม่ใช้กระบวนการเก็บรวบรวมข้อมูลนี้ ให้นำ นำเข้า $playcoreDir/playcore-native-metadata.jar ในไฟล์build.gradle

โปรดทราบว่าการรวบรวมข้อมูลนี้เกี่ยวข้องกับการใช้ Play Core Native SDK และ การใช้ข้อมูลที่เก็บรวบรวมของ Google แยกต่างหาก และเป็นอิสระจาก คอลเล็กชันของทรัพยากร Dependency ของไลบรารีที่ประกาศใน Gradle เมื่อคุณอัปโหลดแอป ลงใน Play Console ได้

การนำส่งเวลาติดตั้ง

Asset Pack ที่กำหนดค่าเป็น install-time จะพร้อมใช้งานในแอปทันที เปิดใช้งาน ใช้ NDK AAssetManager API เพื่อเข้าถึง เนื้อหาที่แสดงในโหมดนี้:

#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);

นำส่งสินค้าตามคำสั่งซื้ออย่างรวดเร็ว

ส่วนต่อไปนี้จะแสดงวิธีเริ่มต้นใช้งาน API รวมถึงวิธีรับข้อมูล เกี่ยวกับ Asset Pack ก่อนที่จะดาวน์โหลด วิธีเรียกใช้ API เพื่อเริ่มต้น ดาวน์โหลด และวิธีเข้าถึงชุดไฟล์ที่ดาวน์โหลดไว้ ส่วนเหล่านี้ใช้กับ Asset Pack fast-follow และ on-demand

การเปิดแอป

โทรหา AssetPackManager_init() เสมอ เพื่อเริ่มต้น Asset Pack API ก่อนที่จะเรียกใช้ API ตรวจหา รหัสข้อผิดพลาดของ Asset Pack

#include "play/asset_pack.h"
...
AssetPackErrorCode AssetPackManager_init(JavaVM* jvm, jobject android_context);

และอย่าลืมเรียกใช้ฟังก์ชันต่อไปนี้ใน onPause() และ onResume() จาก ANativeActivityCallbacks

ดูข้อมูลการดาวน์โหลดเกี่ยวกับ Asset Pack

แอปต้องเปิดเผยขนาดของการดาวน์โหลดก่อนดึงข้อมูลเนื้อหา แพ็ก ใช้เมนู AssetPackManager_requestInfo() เพื่อเริ่มคำขอแบบอะซิงโครนัสสำหรับขนาดของการดาวน์โหลดและ ดาวน์โหลดแพ็คนั้นๆ หรือไม่ จากนั้นใช้ AssetPackManager_getDownloadState() ในการสร้างแบบสำรวจสำหรับสถานะการดาวน์โหลด (เช่น เรียกใช้ฟังก์ชันนี้ 1 ครั้งต่อเฟรม) ใน Game Loop ของคุณ) หากคำขอล้มเหลว ให้ตรวจสอบ รหัสข้อผิดพลาดของ Asset Pack

AssetPackErrorCode AssetPackManager_requestInfo();      // Call once
AssetPackErrorCode AssetPackManager_getDownloadState(); // Call once per frame in your game loop

ฟังก์ชัน AssetPackManager_getDownloadState() แสดงผลประเภททึบแสง AssetPackDownloadState เป็นตัวชี้เอาต์พุต ใช้ตัวชี้นี้เพื่อเรียกฟังก์ชันต่อไปนี้

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);

ติดตั้ง

ใช้ AssetPackManager_requestDownload() เพื่อเริ่มดาวน์โหลด Asset Pack เป็นครั้งแรกหรือขอเนื้อหา การอัปเดตแพ็กเพื่อให้เสร็จสมบูรณ์:

AssetPackErrorCode AssetPackManager_requestDownload();  // Call once
AssetPackErrorCode AssetPackManager_getDownloadState(); // Call once per frame in your game loop

ฟังก์ชัน AssetPackManager_getDownloadState() แสดงผลประเภททึบแสง AssetPackDownloadState สำหรับข้อมูลเกี่ยวกับวิธีใช้ประเภทนี้ โปรดดูที่ รับข้อมูลการดาวน์โหลด

การดาวน์โหลดขนาดใหญ่

หากการดาวน์โหลดมีขนาดใหญ่กว่า 200 MB และผู้ใช้ไม่ได้ใช้ Wi-Fi ระบบจะดาวน์โหลด จะไม่เริ่มต้นจนกว่าผู้ใช้จะให้ความยินยอมอย่างชัดแจ้งในการดำเนินการต่อ ดาวน์โหลดโดยใช้การเชื่อมต่ออินเทอร์เน็ตมือถือ ในทำนองเดียวกัน หากไฟล์ดาวน์โหลดมีขนาดใหญ่และ ผู้ใช้ขาด Wi-Fi การดาวน์โหลดหยุดลงชั่วคราว และได้รับการยินยอมอย่างชัดเจนเพื่อ ดำเนินการต่อโดยใช้การเชื่อมต่ออินเทอร์เน็ตมือถือ แพ็กที่หยุดชั่วคราวมีสถานะ WAITING_FOR_WIFI หากต้องการทริกเกอร์โฟลว์ UI เพื่อแสดงข้อความแจ้งขอคำยินยอม ให้ใช้ ดังต่อไปนี้

ต้องมีการยืนยันผู้ใช้

หากแพ็กมีสถานะ REQUIRES_USER_CONFIRMATION การดาวน์โหลดจะไม่ ดำเนินการจนกว่าผู้ใช้จะยอมรับกล่องโต้ตอบที่ปรากฏพร้อมกับ AssetPackManager_showConfirmationDialog() สถานะนี้อาจเกิดขึ้นหาก Play ไม่รู้จักแอปนี้ โปรดทราบว่าการโทร AssetPackManager_showConfirmationDialog() ในกรณีนี้ทำให้แอป อัปเดตแล้ว หลังจากอัปเดตแล้ว ให้ขอชิ้นงานอีกครั้ง

เข้าถึง Asset Pack

คุณสามารถเข้าถึง Asset Pack ได้โดยใช้การเรียกระบบไฟล์หลังจากคำขอดาวน์โหลด มาถึงสถานะ COMPLETED Asset Pack แต่ละรายการจะเก็บอยู่ในไดเรกทอรีแยกต่างหาก ในที่จัดเก็บข้อมูลภายในของแอป ใช้ AssetPackManager_getAssetPackLocation() เพื่อรับ AssetPackLocation สำหรับ Asset Pack ที่ระบุ ใช้ AssetPackLocation_getStorageMethod() ที่ตำแหน่งนั้นเพื่อกำหนดวิธีการจัดเก็บข้อมูล

  • ASSET_PACK_STORAGE_APK: Asset Pack ติดตั้งเป็น APK โปรดดู การนำส่งเมื่อติดตั้งเพื่อเข้าถึงเนื้อหาเหล่านี้
  • ASSET_PACK_STORAGE_FILES: ใช้ AssetPackLocation_getAssetsPath() เพื่อรับเส้นทางของไฟล์ไปยังไดเรกทอรีที่มีเนื้อหา หรือไม่มีข้อมูลหาก ยังไม่ได้ดาวน์โหลดเนื้อหา ไม่ต้องแก้ไขไฟล์ที่ดาวน์โหลดในไฟล์นี้ เส้นทาง
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);
}

เมื่อพบเนื้อหาแล้ว ให้ใช้ฟังก์ชัน เช่น fopen หรือ ifstream เพื่อเข้าถึง ในไฟล์

เมธอด API ของ Play Core อื่นๆ

เมธอด API เพิ่มเติมบางส่วนที่คุณอาจต้องการใช้ในแอปมีดังนี้

ยกเลิกคำขอ

ใช้ AssetPackManager_cancelDownload() เพื่อยกเลิกคำขอ Asset Pack ที่ใช้งานอยู่ โปรดทราบว่าคำขอนี้เป็นวิธีที่ดีที่สุด

ขอให้นำออก

ใช้ AssetPackManager_requestRemoval() เพื่อกำหนดเวลาการนำ Asset Pack ออก

ขั้นตอนถัดไป

ทดสอบ Play Asset Delivery ในเครื่องและจาก Google Play