本指南介绍了如何使用原生(C 或 C++)代码在应用中集成应用内评价。如果您使用的是 Kotlin 或 Java、Unity 或 Unreal Engine,则有单独的集成指南。
原生 SDK 概览
Play Core 原生 SDK 是 Google Play Core 库系列的一部分。Play Core 原生 SDK 包含一个 C 头文件 review.h
,它封装了 Java Play 应用内评价库中的 ReviewManager
。此头文件允许您的应用直接从原生代码调用 API。有关可用公共函数的概览,请参阅 Play Review 原生模块文档。
ReviewManager_requestReviewFlow
会启动一个请求,用于收集稍后启动应用内评价流程所需的信息。您可以使用 ReviewManager_getReviewStatus
跟踪请求的结果。有关 ReviewManager_getReviewStatus
可以返回的所有状态的更多信息,请参阅 ReviewErrorCode
。
如果函数成功,请求和启动函数都将返回 REVIEW_NO_ERROR
。
设置您的开发环境
下载 Play Core 原生 SDK
下载前,您必须同意以下条款和条件。
条款和条件
上次修改时间:2020 年 9 月 24 日- 使用 Play Core 软件开发套件,即表示您同意这些条款以及 Google API 服务条款(“API 服务条款”)。如果这些条款与 API 服务条款发生冲突,则以这些条款为准。请仔细阅读这些条款和 API 服务条款。
- 就这些条款而言,“API”是指 Google 的 API、其他开发者服务以及相关软件,包括任何可再分发代码。
- “可再分发代码”是指调用 API 的 Google 提供的目标代码或头文件。
- 在遵守这些条款和 API 服务条款的前提下,您可以复制和分发可再分发代码,但仅限于将其作为您的 API 客户端的一部分。Google 及其许可方拥有可再分发代码的所有权利、所有权和利益,包括任何及所有知识产权和其他所有权。您不得修改、翻译或创建可再分发代码的衍生作品。
- Google 可能会随时修改这些条款,并会提供通知以及拒绝继续使用 Play Core 软件开发套件的机会。Google 将在 https://developer.android.com/guide/playcore/license 发布条款修改通知。修改不具有追溯力。
执行以下任一操作
- 安装 Android Studio 4.0 或更高版本。使用 SDK 管理器界面安装 Android SDK Platform 10.0 版(API 级别 29)。
- 安装 Android SDK 命令行工具,并使用
sdkmanager
安装 Android SDK Platform 10.0 版(API 级别 29)。
使用 SDK 管理器 安装最新的 CMake 和 Android 原生开发套件 (NDK),从而为原生开发准备 Android Studio。有关创建或导入原生项目的更多信息,请参阅 NDK 入门指南。
下载 zip 文件并将其解压到您的项目旁边。
下载链接 大小 SHA-256 校验和 37.8 兆字节 9db60185185342f28d2c278b60222333608c67bc022e458a25224eaea8c4c4b7 按如下所示更新应用的
build.gradle
文件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/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.3.0' implementation 'com.google.android.play:integrity:1.4.0' implementation 'com.google.android.play:review:2.0.2' // 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.3.0") implementation("com.google.android.play:integrity:1.4.0") implementation("com.google.android.play:review:2.0.2") // Import these common dependencies. implementation("com.google.android.gms:play-services-tasks:18.0.2") implementation(files("$playcoreDir/playcore-native-metadata.jar")) ... }
按如下所示更新应用的
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 原生 SDK 可能会收集版本相关数据,以便 Google 改进产品,其中包括:
- 应用软件包名称
- 应用软件包版本
- Play Core 原生 SDK 版本
当您将 应用软件包 上传到 Play 管理中心时,系统会收集这些数据。如要选择停用此数据收集过程,请移除 build.gradle 文件中的 $playcoreDir/playcore-native-metadata.jar
导入。
请注意,与您使用 Play Core 原生 SDK 相关的数据收集以及 Google 对所收集数据的使用,独立于您将应用软件包上传到 Play 管理中心时 Google 收集 Gradle 中声明的库依赖项的过程。
将 Play Core 原生 SDK 集成到您的项目后,在包含 API 调用的文件中加入以下行
包含 review.h
将 Play Core 原生 SDK 集成到您的项目后,在将包含 API 调用的文件中加入以下行
#include "play/review.h"
初始化 Review API
每当您想使用 API 时,都必须先调用 ReviewManager_init
函数对其进行初始化,如以下使用 android_native_app_glue.h
构建的示例所示
void android_main(android_app* app) {
app->onInputEvent = HandleInputEvent;
ReviewErrorCode error_code = ReviewManager_init(app->activity->vm, app->activity->clazz);
if (error_code == REVIEW_NO_ERROR) {
// You can use the API.
}
}
请求应用内评价流程
遵循关于何时请求应用内评价的指导,以确定应用用户流程中的适当点来提示用户进行评价(例如,在用户关闭游戏关卡结束时的摘要屏幕后)。当您的应用接近这些点时,调用 ReviewManager_requestReviewFlow
以异步请求您的应用启动应用内评价流程所需的信息。通过调用 ReviewManager_getReviewStatus
监控 ReviewManager_requestReviewFlow
操作的进度,例如每帧调用一次。这可能需要几秒钟,因此您应该在应用达到您想要显示应用内评价流程的时间点之前启动此过程。
ReviewErrorCode error_code = ReviewManager_requestReviewFlow();
if (error_code == REVIEW_NO_ERROR) {
// The request has successfully started, check the status using
// ReviewManager_getReviewStatus.
} else {
// Error such as REVIEW_PLAY_STORE_NOT_FOUND indicating that the in-app
// review isn't currently possible.
}
处理状态并启动应用内评价流程
无论请求何时开始或应用内评价流程何时启动,您都可以使用 ReviewManager_getReviewStatus
检查状态。这使您可以根据 API 状态定义逻辑。一种方法是将状态作为全局变量,并在用户执行特定操作(例如,在游戏中点击“下一关”按钮)时检查状态是否为 REVIEW_REQUEST_FLOW_COMPLETED
,如下例所示
ReviewStatus status;
ReviewErrorCode error_code = ReviewManager_getReviewStatus(&status);
if (error_code != REVIEW_NO_ERROR) {
// There was an error with the most recent operation.
return;
}
switch (status) {
case REVIEW_REQUEST_FLOW_PENDING:
// Request is ongoing. The flow can't be launched yet.
break;
case REVIEW_REQUEST_FLOW_COMPLETED:
// Request completed. The flow can be launched now.
break;
case REVIEW_LAUNCH_FLOW_PENDING:
// The review flow is ongoing, meaning the dialog might be displayed.
break;
case REVIEW_LAUNCH_FLOW_COMPLETED:
// The review flow has finished. Continue with your app flow (for
// example, move to the next screen).
break;
default:
// Unknown status.
break;
}
当状态为 REVIEW_REQUEST_FLOW_COMPLETED
且您的应用准备就绪时,启动应用内评价流程
// This call uses android_native_app_glue.h. ReviewErrorCode error_code = ReviewManager_launchReviewFlow(app->activity->clazz); if (error_code != REVIEW_NO_ERROR) { // There was an error while launching the flow. return; }
启动应用内评价流程后,继续检查完成状态并继续您的应用流程。处理此问题的一种常见方法是遵循 游戏循环 模式。
释放资源
应用使用 API 完毕后(例如,应用内评价流程完成后),别忘了调用 ReviewManager_destroy
函数释放资源。
void ReviewManager_destroy();
后续步骤
测试您应用的应用内评价流程,以验证您的集成是否正常工作。