You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理Android应用内更新(in-app updates)抛出的InstallException异常

问题解答

异常抛出位置

你遇到的InstallException不止可能从startUpdateFlow()抛出,requestAppUpdateInfo()挂起方法才是本次崩溃的主要诱因:

  • play-core-ktx提供的requestAppUpdateInfo()挂起扩展,会将底层Task的失败结果直接转换为异常抛出,你没有对这个调用做异常捕获,首次请求拿不到应用归属信息时就会触发崩溃
  • startUpdateFlow()方法在调用时也可能同步抛出异常,同时它返回的Task也可能异步抛出异常,同样需要处理

修正方案

你可以参考如下修改后的代码,在两个关键位置添加异常捕获逻辑:

private lateinit var updateInfo: AppUpdateInfo

suspend fun checkForUpdate() {
    try {
        updateInfo = appUpdateManager.requestAppUpdateInfo() // play-core-ktx提供的挂起方法
        if(updateInfo.updateAvailability() == UpdateAvailability.UPDATE_AVAILABLE && updateInfo.isImmediateUpdateAllowed) {
            startImmediateUpdate(activity)
        }
    } catch (e: InstallException) {
        // 可根据错误码做差异化处理,错误码-10为应用归属权问题,直接跳过当次更新即可
        e.printStackTrace()
    } catch (e: Exception) {
        // 捕获其他未知异常,避免触发崩溃
        e.printStackTrace()
    }
}

fun startImmediateUpdate(activity: Activity) {
    try {
        appUpdateManager.startUpdateFlow(
                updateInfo, activity, AppUpdateOptions.defaultOptions(AppUpdateType.IMMEDIATE)
        ).addOnSuccessListener { result ->
            if (result == Activity.RESULT_CANCELED) {
                activity.finish()
            }
        }.addOnFailureListener { e ->
            // 捕获startUpdateFlow异步抛出的异常
            e.printStackTrace()
        }
    } catch (e: Exception) {
        // 捕获startUpdateFlow同步抛出的异常
        e.printStackTrace()
    }
}

补充说明

你遇到的首次打开崩溃、第二次运行正常的现象是内部测试场景下的常见情况:如果应用是刚从内部测试轨道下载、或者通过adb侧装的测试包,Play商店本地的应用归属权数据同步会有延迟,第一次请求更新信息时拿不到归属权就会抛出对应错误,等同步完成后第二次请求就能正常返回结果,捕获异常后直接跳过当次更新逻辑即可,不会影响用户正常使用。

内容的提问来源于stack exchange,提问作者Arpit Shukla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 11:18:04