运行时异常 (Chromecast)

2024-01-30

我尝试配置 Chromecast 但收到 RuntimeException 并且不明白原因。 Fabric 有日志:

致命异常:java.lang.RuntimeException:无法启动活动 ComponentInfo{....activity.TVActivityPhone}: java.lang.RuntimeException: com.google.android.gms.dynamite.DynamiteModule$zza:远程加载 失败的。未找到本地回退。 在 android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2677) 在 android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2747) 在 android.app.ActivityThread.access 900 美元(ActivityThread.java:187) 在 android.app.ActivityThread$H.handleMessage(ActivityThread.java:1584) 在 android.os.Handler.dispatchMessage(Handler.java:111) 在 android.os.Looper.loop(Looper.java:194) 在 android.app.ActivityThread.main(ActivityThread.java:5877) 在 java.lang.reflect.Method.invoke(Method.java) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1020) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:815) 由 java.lang.RuntimeException 引起: com.google.android.gms.dynamite.DynamiteModule$zza:远程加载 失败的。未找到本地回退。

这是我的代码:

protected void configureCast() {
        mCastContext = CastContext.getSharedInstance(this); // here I've got RuntimeException
        if(mCastContext != null) mCastSession = mCastContext.getSessionManager().getCurrentCastSession();
        mSessionManagerListener = new CastSessionManagerListener(this);
        mSessionManagerListener.setCastConnectionListener(mCastConnectionListener);
    }

这是build.gradle:

    compile 'com.google.android.gms:play-services-gcm:10.2.0'
    compile 'com.google.android.gms:play-services-analytics:10.2.0'
    compile 'com.google.android.gms:play-services-location:10.2.0'
    compile 'com.google.android.gms:play-services-cast-framework:10.2.0'

有什么帮助吗?


首先,它与错误的项目配置无关,如中所述为什么我在谷歌地图上时收到此错误“无法加载 DynamiteLoader:java.lang.ClassNotFoundException:找不到类? https://stackoverflow.com/questions/40701107/why-i-get-this-error-when-on-google-map-failed-to-load-dynamiteloader-java-lan.


有一天,我在 Fabric 中遇到了崩溃高峰(一天内崩溃了约 1300 次)com.google.android.gms.dynamite.DynamiteModule$zza: Remote load failed. No local fallback, com.google.android.gms.dynamite.DynamiteModule$zzc: No acceptable module found. Local version is 0 and remote version is 0例外情况。

我乍一看并不清楚为什么会发生这种情况,因为在那段时间我没有发布任何应用程序更新。经过更深入的调查(总共几天),我发现问题是由Google Play 服务版本和过时的 Google Cast SDK 之间的兼容性已损坏。

我的 Android 应用程序使用 10.2.4 版本的 Google Cast SDK,该版本与某些 Google Play 服务版本不兼容。 我发现2002年11月3日(480-161239932) https://www.apkmirror.com/apk/google-inc/google-play-services/google-play-services-11-3-02-release/google-play-services-11-3-02-480-161239932-android-apk-download/Google Play 服务版本不兼容10.2.4谷歌投射 SDK。 (肯定)还有其他版本的 Google Play 服务与 Google Cast SDK 库不兼容,但我只找到了一个,它足以进行测试和进一步修复。

Having 2002年11月3日(480-161239932) https://www.apkmirror.com/apk/google-inc/google-play-services/google-play-services-11-3-02-release/google-play-services-11-3-02-480-161239932-android-apk-download/设备上安装的 Google Play 服务版本我的应用程序在启动后立即崩溃。值得注意的是,我发现我的设备上的其他应用程序在启动后立即崩溃,并且堆栈跟踪是相同的.

修复崩溃问题

修复对我来说很简单 -我必须将 Google Play 服务从 10.2.4 更新到 11.4.2, 尤其play-services-cast-framework, play-services-ads, firebase-core, firebase-messaging.


Fabric 中的 Spike 历史:

  • 9 月 25 日(约 400 次崩溃),第一次高峰
  • 9 月 27 日(约 200 次崩溃)
  • 9 月 29 日(约 140 次崩溃)
  • 10 月 8 日(约 1300 次崩溃)

10 月 8 日之后,崩溃不再那么严重(每天约 10-20 次崩溃),并且没有再观察到峰值。这意味着用户更新了 Google Play 服务,并且应用程序在启动时不再崩溃。

一旦我更新了 Google Play 服务版本并且用户更新到了新版本的应用程序,崩溃就消失了(每天约 1-2 次崩溃)。

解释发生此崩溃的原因

如您所知,Google Play 服务会在后台自动更新。这意味着有一天用户可以收到与应用程序中使用的 Google Cast SDK 不兼容的 Google Play 服务更新,并且应用程序将崩溃(100%)。

根据我的经验,Google Cast SDK 会出现这种情况,但其他库也可能出现这种情况(没有证据)。

当您从 Google Cast SDK 调用任何方法时,应用程序会崩溃。我已经评论了我的应用程序中依赖 Google Cast SDK 的不同位置,并且应用程序总是崩溃。

详细指南

如果有人好奇如何模仿这次崩溃,这里有详细的指南。

  • First of all, we need to uninstall existing version of Google Play Services. This can be achieved from "Google Play Services" application info screen downgrade of google play services
  • 在 Android 设备上安装 11.3.02 (480-161239932) 版本的 Google Play 服务 (apk镜像链接 https://www.apkmirror.com/apk/google-inc/google-play-services/google-play-services-11-3-02-release/google-play-services-11-3-02-480-161239932-android-apk-download/).

    adb install -r com.google.android.gms_11.3.02_(480-161239932)-11302480_minAPI23(x86,x86_64)(nodpi)_apkmirror.com.apk

  • 访问 Google Cast SDK 时,打开的应用程序和观察者应用程序崩溃。

事故第二次到达

我以为我已经通过更新 Google Play 服务修复了崩溃,但在沉默几周后,我收到通知,具有相同堆栈跟踪的崩溃再次出现。

经过一番调查(又是几天),我能够重现该问题。这是一个悲伤的消息 - 我对这次崩溃无能为力:sad_face:或者至少我还没有找到优雅的解决方案。

好消息是,重新出现的崩溃现象非常罕见(每月约 1-2 次崩溃)。

Google Play 服务自动更新或强制卸载(可能性较小)强制停止打开的应用程序以使 Play 服务更新生效。这是一个不可控的过程,这意味着Android操作系统可以随时静默安装Google Play服务。如果用户打开了应用程序并且 Google Play 服务安装在某个时刻完成,则应用程序将被系统终止,用户需要重新打开它。当应用程序被系统终止时,我们可以在日志中看到与第一种情况完全相同的崩溃堆栈跟踪。 这种情况很难重现,而且只在我身上发生过几次。 但这种情况更有可能发生,因为 Google Play 服务经常更新。

尽管有一种方法可以重现这种崩溃(在现实生活中可能性较小)-“从设备中删除 Google Play 服务更新”。它产生相同的堆栈跟踪。

所以基本上,我们需要开始删除 Google Play 服务更新并快速(我的意思是非常快)打开我们的应用程序。如果我们成功,该应用程序将在启动时被系统杀死,因为 Google Play 服务被删除并且系统会杀死该应用程序。

这是堆栈跟踪:

FATAL EXCEPTION: main
Process: XXX, PID: 26149
java.lang.RuntimeException: Unable to start activity ComponentInfo{XXX/XXX.SomeActivity}: android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class fragment
    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2733)
    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2819)
    at android.app.ActivityThread.-wrap12(ActivityThread.java)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1532)
    at android.os.Handler.dispatchMessage(Handler.java:102)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6321)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
 Caused by: android.view.InflateException: Binary XML file line #0: Binary XML file line #0: Error inflating class fragment
 Caused by: android.view.InflateException: Binary XML file line #0: Error inflating class fragment
 Caused by: java.lang.RuntimeException: com.google.android.gms.dynamite.DynamiteModule$zzc: No acceptable module found. Local version is 0 and remote version is 0.
    at com.google.android.gms.internal.zzavl.zzbp(Unknown Source)
    at com.google.android.gms.internal.zzavl.zza(Unknown Source)
    at com.google.android.gms.cast.framework.CastContext.<init>(Unknown Source)
    at com.google.android.gms.cast.framework.CastContext.getSharedInstance(Unknown Source)
    at com.google.android.gms.cast.framework.media.uicontroller.UIMediaController.<init>(Unknown Source)
    at com.google.android.gms.cast.framework.media.widget.MiniControllerFragment.onCreateView(Unknown Source)
    at android.support.v4.app.Fragment.performCreateView(Fragment.java:2343)
    at android.support.v4.app.FragmentManagerImpl.ensureInflatedFragmentView(FragmentManager.java:1645)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1390)
    at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1640)
    at android.support.v4.app.FragmentManagerImpl.addFragment(FragmentManager.java:1896)
    at android.support.v4.app.FragmentManagerImpl.onCreateView(FragmentManager.java:3673)
    at android.support.v4.app.FragmentController.onCreateView(FragmentController.java:111)
    at android.support.v4.app.FragmentActivity.dispatchFragmentsOnCreateView(FragmentActivity.java:331)
    at android.support.v4.app.BaseFragmentActivityApi14.onCreateView(BaseFragmentActivityApi14.java:39)
    at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:65)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:777)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:727)
    at android.view.LayoutInflater.rInflate(LayoutInflater.java:858)
    at android.view.LayoutInflater.rInflateChildren(LayoutInflater.java:821)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:518)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:426)
    at android.view.LayoutInflater.inflate(LayoutInflater.java:377)
    at android.support.v7.app.AppCompatDelegateImplV9.setContentView(AppCompatDelegateImplV9.java:287)
    at android.support.v7.app.AppCompatActivity.setContentView(AppCompatActivity.java:139)
    at XXX.SomeActivity.setContentView(SomeActivity:XXX)
    at XXX.SomeActivity.onCreate(SomeActivity:XXX)
    at android.app.Activity.performCreate(Activity.java:6760)
    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1134)

Update

有一个Google Play 服务 12.0.0 发布 https://developers.google.com/android/guides/releases#march_20_2018_-_version_1200,这应该可以解决这个问题:

修复了在具有过时版本的 Google Play 服务的设备上调用 CastContext.getSharedInstance() 导致崩溃的错误。过时的 Google Play 服务版本仍然会导致该方法失败,因此客户端应检查是否有合适的版本。

但事实上,即使更新到 12.0.0 版本后,我仍然看到很多崩溃。当设备上发生 Google Play 服务更新时,会发生崩溃。 为了解决这个问题,我们需要通过检查调用 Cast API 时是否未抛出异常来检查 Cast API 是否可用。

fun isCastApiAvailable(): Boolean {
    val isCastApiAvailable = isNotTv(context)
            && GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context) == ConnectionResult.SUCCESS
    try {
        CastContext.getSharedInstance(context)
    } catch (e: Exception) {
        // track non-fatal
        return false
    }
    return isCastApiAvailable
}

这样我们就可以防止崩溃。如果应用程序位于前台时发生 Play 服务更新,则应用程序可能会被系统终止并重新启动。或者,Cast API 相关功能将不可用(Chromecast 图标不可见)。 因此,我们通过这种方式避免崩溃并报告为非致命事件,只是为了了解这种情况发生的频率。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

运行时异常 (Chromecast) 的相关文章

  • onBeaconServiceConnect 未调用

    和以前一样 我使用 Android Beacon 库 它已经工作了 我可以通过 BLE 低功耗蓝牙找到信标 但是现在 更新到最新版本的库后 现在方法onBeaconServiceConnect 不再跑了 请告诉我我需要做什么才能让它发挥作用
  • 如何强制 Eclipse 将 xml 布局和样式显示为文本?

    我最近升级到带有 ADT 20 0 3 的 Eclipse 4 2 Juno 如果我查看旧项目中的布局或样式 Eclipse 只会向我显示其适当的基于控件的编辑器 我想编辑语法突出显示的 xml 文本 我没有找到将插件的编辑器切换到此模式的
  • Android 在打开应用程序时会广播吗?

    例如 如果我想知道Youtube何时打开 是否有与之相关的广播 我当然知道我可以轮询 logcat 消息来检查活动 但我可以通过广播来做到这一点吗 因为它会少得多的耗电 此链接似乎表明这是不可能的 如何跟踪 Android 中的应用程序使用
  • Manifest Merger工具:替换失败

    我正在使用一个使用自己的 android theme 的库 因此在构建时收到以下错误 错误 55 9 任务 contacit processDebugManifest 执行失败 清单合并失败 AndroidManifest xml 中的属性
  • FTS3 在 ORMLite 中搜索?

    我对 FTS3 一无所知 除了http developer android com guide topics search search dialog html http developer android com guide topics
  • 通过 WhatsApp 发送消息

    由于我发现了一些较旧的帖子 表明 Whatsapp 不支持此功能 我想知道是否发生了变化 以及是否有办法打开与我通过意图发送的号码进行 Whatsapp 聊天 UPDATE请参阅https faq whatsapp com en andro
  • 从 Android 代码设置的 SECRET_CODE

    我知道如何使用清单文件中的秘密代码 它与此源代码配合良好
  • 带操作按钮的颤动本地通知

    我在我的 flutter 项目中尝试了 flutter 本地通知插件 它在简单通知上工作正常 但我需要带有操作按钮的通知功能 请帮助我或建议我实现此功能 不幸的是 flutter local notifications 插件尚不支持操作按钮
  • 如何在React Native Android中获取响应头?

    您好 我想在获取 POST 请求后获取响应标头 我尝试调试看看里面有什么response with console log response 我可以从以下位置获取响应机构responseData但我不知道如何获取标题 我想同时获得标题和正文
  • 如何为发布而不是调试创建密钥库?扑

    我按照使用此网站部署 flutter 的步骤进行操作https flutter io android release https flutter io android release 当我运行 flutter build apk 时出现此错
  • Android Studio:未找到 Gradle DSL 方法:“classpath()”

    首先 我已阅读所有其他解决方案帖子以及有关迁移到 1 0 的官方文档 到目前为止 还没有任何效果 Error Error 23 0 Gradle DSL method not found classpath Possible causes
  • 获取手机的 z 轴和磁北极(而不是 y 轴)之间的角度

    我知道如何使用 getOrientation 方法获取手机 y 轴和磁北之间的方向角 如此处所述https developer android com guide topics sensors sensors position https
  • Android:滚动 Horizo​​ntalScrollView 时如何禁用 ScrollView 的垂直滚动?

    我正在开发一个带有带有 ScrollView 的 Activity 的 Android 应用程序 其中包含 Horizo ntalScrollView 等内容 当我触摸 Horizo ntalScrollView 时 我想禁用外部 Scro
  • PhoneStateListener 不调用

    这是我的完整代码 广播示例 java package com example broadcast gt import android app Activity import gt android content Context import
  • react-native run-android 失败并出现错误:任务 ':app:dexDebug' 执行失败

    我使用的是 Windows 8 1 和react native cli 1 0 0 and react native 0 31 0 添加后react native maps对于该项目 我运行了命令react native upgrade并给
  • 如何在 Viewpager 中禁用预加载下一页? [复制]

    这个问题在这里已经有答案了 如何在 Viewpager 中禁用页面预加载 I tried viewPager setOffscreenPageLimit 0 但它不起作用 用这个viewPager setOffscreenPageLimit
  • 如何在android asynctask中使用inputstream作为参数?

    我正在制作一个 Android 应用程序来跟踪股票详细信息 我将通过 csv 雅虎财经 检索数据 据我所知 在android 4 0中 网络连接无法在主线程上完成 因此 我将使用 asynctask 来建立连接 但是 我在参数方面遇到了一些
  • Android 中循环事件的星期几和时间选择器

    我想创建一个控件 允许用户在我的 Android 活动中选择一周中的某一天 星期一 和一天中的某个时间 下午 1 00 找不到任何关于此的好帖子 好吧 我想我已经明白了 我只是不喜欢这个解决方案 因为我在一周中的某一天使用的微调器与时间选择
  • 单元测试时 Android Studio 2.0 中测试状态终止且没有任何失败消息

    Issue 我昨天在 Ubuntu 上从 1 5 升级到了 Android Studio 2 0 当我在 Android Studio 2 0 中进行单元测试时 即使所有测试都已通过 它也会显示 终止测试 状态 有时它只显示部分测试通过 我
  • Android 中带有组的列表视图

    我有一个列表视图 每行都有一些日期和文本 我可以像 iPhone 中那样将这个 listView 分组 组之间有标题吗 在 android 中是否可能 请帮忙 即 我需要在 Listview 行之间有标题栏 以便如果我使用日期对其进行分组

随机推荐