Android应用内更新显示成功但未实际更新的问题咨询
Android应用内更新(In App Update)测试问题
我正在测试Android In App Update功能,尝试使用签名生产发布APK以及版本低于Google Play商店可用版本的调试生产APK。每次应用内更新弹窗都会显示并提示完成成功,但应用版本并未从Play商店完成更新。
以下是我使用的代码:
fun checkInAppUpdate() { val appUpdateManager = AppUpdateManagerFactory.create(this@FoundationActivity) val appUpdateInfoTask = appUpdateManager.appUpdateInfo appUpdateInfoTask.addOnSuccessListener { appUpdateInfo -> if (appUpdateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && appUpdateInfo.isUpdateTypeAllowed(AppUpdateType.IMMEDIATE)) { appUpdateManager.startUpdateFlowForResult(appUpdateInfo, AppUpdateType.IMMEDIATE, this@FoundationActivity, APP_UPDATE_REQUEST_CODE) } } appUpdateInfoTask.addOnCompleteListener { Timber.e("In App update complete ${it.isSuccessful} - ${it.result}") } } override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) { super.onActivityResult(requestCode, resultCode, data) if (requestCode == APP_UPDATE_REQUEST_CODE) { if (resultCode == RESULT_OK) Timber.e("In App Update Worked OK") else Timber.e("In App Update failed with $resultCode") } }
我总能看到日志条目"In App Update Worked OK"和"In App update complete true - com.google.android.play.core.appupdate.AppUpdateInfo@f0b5242",但应用并未更新。请问是否无法通过这种方式测试In App Update API?是否只能发布到Google Play商店才能测试该功能?
核心结论
直接用本地安装的签名APK/调试APK无法触发真实的Play商店应用内更新流程,必须通过Google Play的官方测试渠道验证该功能。
具体原因
- Play商店校验逻辑限制:In App Update API完全依赖Google Play服务的校验体系,只有从Play商店(含各类测试渠道)下载安装的APK,才会被Play服务识别为可管理的应用,进而触发真实的更新下载与安装。本地安装的APK即使包名、签名正确,也不在Play商店的应用管理链路中,无法启动后续更新步骤。
- 日志的误导性:你看到的
RESULT_OK仅代表更新弹窗的UI交互流程完成(比如用户点击了更新按钮),并不意味着Play服务真正启动了更新任务。因为本地APK未关联Play商店的应用条目,后续的下载、安装环节根本不会执行。
正确测试方式
- 使用Google Play测试渠道:将测试版本上传到Google Play的内部测试/封闭测试渠道,邀请测试账号加入后,用这些账号从Play商店下载旧版本APK,即可触发真实的应用内更新流程。
- 开启Play App Signing:确保应用开启Play App Signing功能,保证本地签名APK与Play商店分发的APK签名一致,避免因签名不匹配导致更新失败。
- 补充更新状态监听:除
onActivityResult外,建议添加AppUpdateManager的状态监听,更准确判断更新进度,示例代码如下:
appUpdateManager.registerListener { state -> when (state.installStatus()) { InstallStatus.DOWNLOADED -> { // 提示用户重启应用完成更新 showUpdateCompletePrompt() } InstallStatus.INSTALLED -> { // 更新完成,可移除监听 appUpdateManager.unregisterListener(this) } } }
内容的提问来源于stack exchange,提问作者Hector
相关产品推荐
相关产品推荐

