如何处理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
相关产品推荐
相关产品推荐

