这个框架的核心是 Google Play Core Library,它提供了一个标准化的 API,让你的应用可以安全、可靠地与 Google Play 商店进行交互,而无需处理复杂的底层逻辑。

(图片来源网络,侵删)
核心功能概览
Google Play Core 主要提供以下功能:
- 应用内更新:允许用户在不离开应用的情况下直接更新应用。
- 应用内交付:让用户可以在不下载完整 APK 的情况下,下载和安装额外的功能模块(如语言包、关卡包、OBB 文件等)。
- 获取应用信息:检查应用是否已安装、获取版本号、获取应用签名等。
- 应用内评论:引导用户在应用内留下评分和评论。
我们将重点讲解最常用的 应用内更新 和 获取应用信息。
第一步:配置项目环境
在编写代码之前,你需要在 Android Studio 项目中进行必要的配置。
添加依赖
在你的模块级 build.gradle (通常是 app/build.gradle) 文件中,添加 Google Play Core 库的依赖。

(图片来源网络,侵删)
dependencies {
// 应用内更新
implementation 'com.google.android.play:app-update:2.1.0'
implementation 'com.google.android.play:app-update-ktx:2.1.0' // Kotlin 扩展,方便使用
// 应用内交付 (如果需要)
implementation 'com.google.android.play:app-delivery:2.0.1'
implementation 'com.google.android.play:app-delivery-ktx:2.0.1' // Kotlin 扩展
// 获取应用信息
implementation 'com.google.android.gms:play-services-base:18.2.0'
}
注意:请务必在 Google 的 Maven 代码库 中查找最新的版本号。
配置 Google Play 服务
Google Play Core 依赖于 Google Play 服务,在 AndroidManifest.xml 中,确保你的应用有 INTERNET 权限,并声明了对 Google Play 服务的依赖。
app/src/main/AndroidManifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<!-- 必需:允许网络访问 -->
<uses-permission android:name="android.permission.INTERNET" />
<application
...>
<!-- 声明对 Google Play 服务的依赖 -->
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version"
tools:replace="android:value" />
...
</application>
</manifest>
第二步:实现应用内更新
应用内更新分为两种类型,你需要根据场景选择合适的类型:

(图片来源网络,侵删)
| 类型 | 描述 | 用户体验 | 适用场景 |
|---|---|---|---|
| 灵活更新 | 后台下载更新包,下载完成后提示用户安装。 | 流畅,用户几乎无感知。 | 较小,非紧急。 |
| 强制更新 | 立即下载并安装更新,用户必须完成更新才能继续使用应用。 | 中断性强,会强制用户离开当前界面。 | 安全漏洞修复、关键功能更新。 |
检查更新
在更新逻辑开始前,首先需要检查 Play 商店中是否有新版本。
import com.google.android.play.core.appupdate.AppUpdateInfo
import com.google.android.play.core.appupdate.AppUpdateManager
import com.google.android.play.core.appupdate.AppUpdateManagerFactory
import com.google.android.play.core.install.model.AppUpdateType
import com.google.android.play.core.install.model.UpdateAvailability
import com.google.android.play.core.tasks.Tasks
// 在你的 Activity 或 ViewModel 中
private lateinit var appUpdateManager: AppUpdateManager
fun checkForUpdate(activity: Activity) {
appUpdateManager = AppUpdateManagerFactory.create(activity)
// 获取 AppUpdateInfo
val appUpdateInfoTask = appUpdateManager.appUpdateInfo
// 使用 Kotlin 协程处理异步任务 (推荐)
appUpdateInfoTask.addOnSuccessListener { appUpdateInfo ->
if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE) {
// 检查更新是否是可强制更新的
if (appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.FLEXIBLE)) {
// 可以进行灵活更新
startFlexibleUpdate(activity, appUpdateInfo)
} else if (appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) {
// 可以进行强制更新
startImmediateUpdate(activity, appUpdateInfo)
}
}
}
}
执行灵活更新
灵活更新需要你管理下载和安装的流程。
// 在你的 Activity 中定义
private val flexibleUpdateRequestCode = 101
fun startFlexibleUpdate(activity: Activity, appUpdateInfo: AppUpdateInfo) {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
flexibleUpdateRequestCode,
activity,
AppUpdateType.FLEXIBLE
)
}
// 在你的 Activity 中重写 onActivityResult 来接收结果
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == flexibleUpdateRequestCode) {
if (resultCode != RESULT_OK) {
// 更新被用户取消或失败
Log.d("Update", "Update flow failed! Result code: $resultCode")
// 可以在这里决定是否重试或提示用户
}
}
}
// 你还需要监听下载状态
// 在 Activity 的 onResume 中检查下载状态
override fun onResume() {
super.onResume()
appUpdateManager
.appUpdateInfo
.addOnSuccessListener { appUpdateInfo ->
// 如果更新被暂停了,可以在这里恢复下载流程
if (appUpdateInfo.updateAvailability() == UpdateAvailability.DEVELOPER_TRIGGERED_UPDATE_IN_PROGRESS) {
// 可以尝试恢复更新
// appUpdateManager.startUpdateFlowForResult(...)
}
}
}
执行强制更新
强制更新的流程更简单,因为它会接管界面。
// 在你的 Activity 中定义
private val immediateUpdateRequestCode = 102
fun startImmediateUpdate(activity: Activity, appUpdateInfo: AppUpdateInfo) {
appUpdateManager.startUpdateFlowForResult(
appUpdateInfo,
immediateUpdateRequestCode,
activity,
AppUpdateType.IMMEDIATE
)
}
// 同样,在 onActivityResult 中处理结果
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
super.onActivityResult(requestCode, resultCode, data)
if (requestCode == immediateUpdateRequestCode) {
if (resultCode != RESULT_OK) {
// 强制更新失败,应用可能无法正常运行
Log.e("Update", "Immediate update failed!")
// 可以显示一个对话框,告诉用户必须更新才能使用
}
}
}
第三步:获取应用信息
有时你可能需要获取当前应用在 Play 商店中的信息。
import com.google.android.play.core.install.model.AppUpdateInfo
import com.google.android.gms.tasks.Tasks
fun getAppInfo(activity: Activity) {
val appUpdateManager = AppUpdateManagerFactory.create(activity)
val appUpdateInfoTask = appUpdateManager.appUpdateInfo
appUpdateInfoTask.addOnSuccessListener { appUpdateInfo: AppUpdateInfo ->
// 获取 Play 商店中最新应用的版本代码
val latestVersionCode = appUpdateInfo.availableVersionCode()
Log.d("AppInfo", "Latest version code on Play Store: $latestVersionCode")
// 获取当前已安装应用的版本代码
val currentVersionCode = activity.packageManager.getPackageInfo(activity.packageName, 0).versionCode
Log.d("AppInfo", "Current installed version code: $currentVersionCode")
// 比较版本
if (latestVersionCode > currentVersionCode) {
Log.d("AppInfo", "A new version is available!")
}
}
}
最佳实践和注意事项
-
选择合适的时机检查更新:
- 不推荐:在
onCreate()或onResume()中频繁检查,这会消耗用户流量并可能影响启动速度。 - 推荐:在应用启动后一段时间(如 5-10 秒)、用户完成某个任务后(如看完一集视频)、或者从后台恢复时检查。
- 不推荐:在
-
处理网络和 Play 服务不可用的情况:
- 在检查更新前,最好先检查网络连接状态。
- 捕获可能抛出的异常,如
IntentSender.SendIntentException、SecurityException等,并向用户显示友好的错误提示。
-
为强制更新设计好 UI:
当强制更新失败时,应用可能无法正常工作,你应该设计一个简单的 UI,告知用户“检测到新版本,请前往 Google Play 商店更新”,并提供一个按钮跳转到 Play 商
