getParcelable() 由于 AGP 8 中的 ifTable 为空而崩溃

2023-12-21

我最近更新到了 AGP 8,并在 Play 商店上发布了更新。我收到一些最近未更改的代码区域发生崩溃的报告。我相当有信心这是由 AGP 8 升级引起的崩溃,特别是在 R8 全模式周围。

崩溃周围的代码正在恢复布局管理器的状态。

恢复代码

if (savedInstanceState != null) {
    oldRecyclerLayoutState = savedInstanceState.getParcelableCompat(
        SIS_RECYCLER_LAYOUT_STATE,
    )
}

保存实例代码

private lateinit var layoutManager: LinearLayoutManager
...
override fun onSaveInstanceState(outState: Bundle) {
    outState.putParcelable(SIS_RECYCLER_LAYOUT_STATE, layoutManager.onSaveInstanceState())
    super.onSaveInstanceState(outState)

}

崩溃报告表明,读取 Parcelable 时会崩溃,因为类的 ifTable 在以下情况下为空:Class.isAssignableFrom()被调用。从the AOSP https://android.googlesource.com/platform/libcore/+/a8a489492749b845cc2a85d67c664449d7b0b019/libart/src/main/java/java/lang/Class.java#171,我可以看到ifTable是一个接口表。我假设isAssignableFrom正在使用ifTable确定可分配性,但由于类为空,因此无法读取它。不幸的是,该错误没有告诉我哪个类为空。

完整的堆栈跟踪:

Fatal Exception: java.lang.NullPointerException: Attempt to read from field 'java.lang.Object[] java.lang.Class.ifTable' on a null object reference in method 'boolean java.lang.Class.isAssignableFrom(java.lang.Class)'
       at java.lang.Class.isAssignableFrom(Class.java:579)
       at android.os.Parcel.readParcelableCreatorInternal(Parcel.java:4865)
       at android.os.Parcel.readParcelableInternal(Parcel.java:4778)
       at android.os.Parcel.readValue(Parcel.java:4544)
       at android.os.Parcel.readValue(Parcel.java:4324)
       at android.os.Parcel.-$$Nest$mreadValue()
       at android.os.Parcel$LazyValue.apply(Parcel.java:4422)
       at android.os.Parcel$LazyValue.apply(Parcel.java:4381)
       at android.os.BaseBundle.getValueAt(BaseBundle.java:394)
       at android.os.BaseBundle.getValue(BaseBundle.java:374)
       at android.os.BaseBundle.getValue(BaseBundle.java:357)
       at android.os.BaseBundle.get(BaseBundle.java:696)
       at android.os.Bundle.getParcelable(Bundle.java:947)
       at com.ggstudios.lolcatalyst.util.ext.BundleExtKt.getParcelableCompat(BundleExt.kt:21)
       at com.ggstudios.lolcatalyst.summonerlookup.SummonerProfileFragment.onViewCreated(SummonerProfileFragment.kt:422)
       at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3137)
       at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:552)
       at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
       at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
       at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1435)
       at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2979)
       at androidx.fragment.app.FragmentManager.dispatchViewCreated(FragmentManager.java:2890)
       at androidx.fragment.app.Fragment.performViewCreated(Fragment.java:3138)
       at androidx.fragment.app.FragmentStateManager.createView(FragmentStateManager.java:552)
       at androidx.fragment.app.FragmentStateManager.moveToExpectedState(FragmentStateManager.java:261)
       at androidx.fragment.app.FragmentStore.moveToExpectedState(FragmentStore.java:113)
       at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1435)
       at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2979)
       at androidx.fragment.app.FragmentManager.dispatchActivityCreated(FragmentManager.java:2897)
       at androidx.fragment.app.FragmentController.dispatchActivityCreated(FragmentController.java:263)
       at androidx.fragment.app.FragmentActivity.onStart(FragmentActivity.java:351)
       at androidx.appcompat.app.AppCompatActivity.onStart(AppCompatActivity.java:251)
       at com.ggstudios.lolcatalyst.activity.abs.BaseActivity.onStart(BaseActivity.kt:90)
       at com.ggstudios.lolcatalyst.activity.MainActivity.onStart(MainActivity.kt)
       at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1510)
       at android.app.Activity.performStart(Activity.java:8603)
       at android.app.ActivityThread.handleStartActivity(ActivityThread.java:4191)
       at android.app.servertransaction.TransactionExecutor.performLifecycleSequence(TransactionExecutor.java:221)
       at android.app.servertransaction.TransactionExecutor.cycleToPath(TransactionExecutor.java:201)
       at android.app.servertransaction.TransactionExecutor.executeLifecycleState(TransactionExecutor.java:173)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:97)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2571)
       at android.os.Handler.dispatchMessage(Handler.java:106)
       at android.os.Looper.loopOnce(Looper.java:226)
       at android.os.Looper.loop(Looper.java:313)
       at android.app.ActivityThread.main(ActivityThread.java:8741)
       at java.lang.reflect.Method.invoke(Method.java)
       at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:571)
       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067)

如果有人知道原因或解决方法是什么,将不胜感激!


tl;dr 修复方法是使用BundleCompat.getParcelable(Bundle, String, Class) from androidx.core:core-ktx:1.10.0代替getParcelable(String, Class).

我认为这次事故是由两件事不幸结合造成的。

  1. AGP 8 默认启用 R8 的完整模式。R8 的完整模式剥离了默认构造函数并执行更积极的优化。 https://r8.googlesource.com/r8/+/refs/heads/master/compatibility-faq.md#r8-full-mode
  2. The new getParcelable(String, Class)如果未以特定方式定义 Parcelable,则 API 33 中引入的方法会存在一些错误。此处记录了这一点。 https://issuetracker.google.com/274185314

看起来执行起来很脆弱getParcelable(String, Class)R8 优化某些代码导致了此崩溃。目前的修复似乎是使用旧的getParcelable(String)API 33 中的方法。Google 表示他们已经解决了这个问题getParcelable(String, Class)在 API 34 中。

Update: androidx.core:core-ktx:1.10.0包含此问题的修复。它包含BundleCompat.getParcelable(Bundle, String, Class)这只会调用新的getParcelable(Bundle, Class)在 Android U 及以上版本上运行。

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

getParcelable() 由于 AGP 8 中的 ifTable 为空而崩溃 的相关文章

  • Android 中所有活动的单套接字 IO 连接

    我已经为 SocketIOClient 参考创建了 Singleton 类here https stackoverflow com questions 13709783 android socket io switch activities
  • Android 上的多处理

    我一直在 Android 上执行一些测试 以验证并行化算法 如 FFT 的性能可以提高多少 我通过使用带有 JNI FFTW 的 pthread 和 Java 线程 来自 JTransforms 来实现这些算法 我没有像预期那样通过使用线程
  • 如何创建没有标题的DialogFragment?

    我正在创建一个 DialogFragment 来显示一些有关我的应用程序的帮助消息 除了一件事之外 一切都工作正常 窗口顶部有一条黑色条纹 显示 DialogFragment 我认为它是为标题保留的 我不想使用它 这是特别痛苦的 因为我的自
  • 如何检测手机一整圈(360 度)?

    由于我在网络上搜索没有找到任何相关答案 因此我发布了有关检测的问题360度转弯使用加速度计绕其轴的 Android 设备 例如 在横向模式下围绕 y 轴 假设在起始位置 y 值为 0 设备平坦于地面 当手机向前旋转 90 度时y 10 18
  • React-Native 中的导航抽屉

    我是反应原生的新手 不介意我问一个基本问题 我想知道 实现抽屉式导航的分步过程是什么 推荐链接这个链接 https github com react native community react native side menu usage
  • Google Play 商店中的 Android 应用程序与 LG G3(密度 538,尺寸 2560x1440)不兼容?

    Android 应用程序与具有高分辨率和密度的 LG G3 设备不兼容 我已经在清单中测试了以下配置 支持屏幕和兼容屏幕都不起作用
  • 如何将webview内容划分为多个页面

    我必须使用 Android 上的 PdfDocument 从 webView 创建 PDF https developer android com reference android graphics pdf PdfDocument htm
  • Ionic 4:硬件后退按钮重新加载应用程序

    从事项目并陷入问题 硬件后退按钮重新加载应用程序 我在此应用程序中使用 Angular Router 我退出应用程序的代码 ionViewDidEnter this subscription this platform backButton
  • 彩信数据总是错误

    我正在从 Galaxy S6 读取短信和彩信数据 所有 SMS 消息都有一个date像这样的字段1456252633000 该数字是 unix 时间戳 1000 我发送 未收到 的彩信具有如下日期字段 1440628863时间戳是正确的 u
  • Horizo​​ntalScrollView 将 GridView 缩小为小行

    当我将 Horizo ntalScrollView 放在 GridView 周围时 GridView 会被压缩到左侧的一个小列中 Gridview 的垂直滚动条甚至出现在左侧 Horizo ntalScrollView 的宽度设置为 fil
  • 标签栏随键盘一起上升

    这个问题之前已经发过 但是没有答案 Problem TabBar gt 2 个选项卡 选项卡一有一个Scrollview and an EddiText 标签二 其他 贴带时EditText 软键盘上升 TabBar与它一起 一个丑陋的解决
  • 如何解决Android错误类型3?

    下面是我在项目中使用的清单格式 但是每当我尝试运行模拟器时 我都会收到下面提到的错误 请给我一个解决该错误的准确解决方案 工具信息 Android studio Nexus S API 22 android 5 1 1 我的清单文件格式
  • 如何让 Mockito 在 androidTest 中工作

    在我的测试中 我如何模拟我编写的课程 这是我的测试代码 import android support test runner AndroidJUnit4 import org junit Before import org junit Te
  • java.exe 以非零退出值 1 结束

    只是为了开始 我并不是真正尝试从 Android 中的 xlsx 文件中读取单元格 我已经尝试了几乎所有我在 Google 上搜索到的内容 但是每次 在两台不同的 PC 上 都是 Java 1 7 0 79 当我尝试构建 运行 这个应用程序
  • 我怎样才能实现CoverFlow视图[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想用点线布局实现溢出视图 目前我正在使用 polidea 封面流库 URL github https
  • 在 Tensorflow-lite Android 中将位图转换为 ByteBuffer(浮点)

    在用于图像分类的tensorflow lite android演示代码中 图像首先转换为ByteBuffer格式以获得更好的性能 这种从位图到浮点格式的转换以及随后到字节缓冲区的转换似乎是一个昂贵的操作 循环 按位运算符 float mem
  • 突出显示菜单抽屉/滑动菜单中的所选项目

    使用的库 https github com SimonVT android menudrawer https github com SimonVT android menudrawer https github com JakeWharto
  • 手动添加带有依赖pom/iml文件的aar

    由于我无法使用私人 Maven 来共享我的库 因此我正在考虑共享 aar 并导入到另一个项目中 当 aar 和 jar 文件不包含任何依赖项时 就会出现问题 因此 一旦我在android studio中手动导入aar 使用Import JA
  • AsyncTask的并行执行

    An 异步任务单击时执行 List
  • Android:通过查找带有标签而不是 ID 的容器来添加片段

    我正在使用 for 循环创建片段的多个实例 在每个片段中 我需要添加另一组子片段 为此 我需要找到正确的容器 如果我使用容器的 ID 所有子片段都会添加到第一个父片段 而不是它们自己的父片段 在我的主要片段中 for ParentFragm

随机推荐

  • Python 中的静态类型检查工具

    我正在使用现有的大型 Python 代码库 并希望开始添加类型注释 以便获得一定程度的静态检查 我在想象类似的事情Erlang http www erlang org doc reference manual typespec html 强
  • 将 HttpServletRequest 转发到不同的服务器

    I got a HttpServletRequest我想将 Spring Servlet 中的请求按原样 即 GET 或 POST 内容 转发到不同的服务器 使用 Spring 框架最好的方法是什么 我是否需要获取所有信息并构建一个新的HT
  • 从intel到arm交叉编译库

    我正在使用开源 C 库 DCMTKhttp dicom offis de dcmtk php en http dicom offis de dcmtk php en 我已经使用 VC IDE MacOS Xcode Mac iOS 模拟器在
  • jQuery 显示/隐藏 Div

    我将其用于显示 隐藏 div 扩展器 它工作正常 但是 HTML 实体没有被输出 document ready function slickbox hide slick toggle toggle function this text 96
  • ZADD 或 HMGET 等 Redis 命令可以处理的参数数量是否有限制?

    我想使用单个 ZADD 或 HMGET 命令而不是 MULTI EXEC ZADD 可以处理的 分数 成员 元组的数量有限制吗 HMGET 可以处理的字段数量有限制吗 理论上的限制相当高 但你应该以不会达到它的方式设计你的读数 保持读取大小
  • OpenThread() 返回 NULL Win32

    我觉得这个问题有一个明显的答案 但它一直在逃避我 我这里有一些 C 遗留代码 当它尝试调用 OpenThread 时 这些代码会中断 我在 Visual C 2008 Express Edition 中运行它 程序首先获取调用线程的 Thr
  • 过程没有参数并且提供了参数 3

    存储过程返回一个值 ALTER PROCEDURE dbo spCaller AS BEGIN DECLARE URL nvarchar 255 EXECUTE spBuscarUrl MIREX 2017 00001 url URL OU
  • Jenkins + Git:仅当 PR 在子目录中引入更改时才构建

    我们有一个大型 monorepo 其中包含多个项目 A 和 B 我目前将 Jenkins 设置为多分支管道项目 用于监视 monorepo 的 PR 如果创建了 PR Jenkins 会同时构建 A 和 B 现在 我希望 Jenkins 变
  • 解析if-else if语句算法

    我正在尝试为 if else 类型结构创建一个非常简单的解析器 它将构建并执行 SQL 语句 我不会测试执行语句的条件 而是测试构建字符串的条件 声明的一个例子是 select column1 from if VariableA Case1
  • 方法内部的 self 有什么意义?

    我正在七周内阅读七种编程语言 其中一个问题指出 你会如何改变 回来0如果分母为零 我首先尝试定义自己的 并将其实现代理到原始的 像这样的方法 Number oldSlash Number getSlot Number method x Nu
  • 如何在 Swift 4 中连接 Socket

    我想将我的应用程序连接到套接字 这里是代码 import UIKit import SocketIO class SocketIOManager NSObject static let manager SocketManager socke
  • 地理编码 API 有多少请求是免费的?

    我想使用 Google Geocoding API 从纬度 经度获取地址 为此 我想知道 使用免费帐户可以完成多少次点击 下面的链接显示了每 24 小时内 2 500 个免费请求 Google 地理编码 API 免费吗 https stac
  • 在专有软件中使用 Glassfish 库 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我想在 CDDL GPLv2 许可证下的专有软件中使用 Glassfish 的某些部分 我可以这样做吗 我没有修改这些库的代码中的任何内容
  • 如何在我的 ASP.NET 菜单中使用 Bootstrap 风格的 BreadCrumb?

    我是一名新的 ASP NET 开发人员 也是 Twitter Bootstrap 的新用户 我试图在我的 ASP NET 应用程序中添加面包屑导航 我已经开发了它 但我正在尝试在其上应用 Twitter Breadcrumb 的风格 将特定
  • WebAPI POST [FromBody] 未绑定

    我将 JSON 发布到 WebAPI 控制器 但模型上的属性未绑定 public void Post FromBody Models Users User model throw new Exception model Id ToStrin
  • 如何指示 GCC 在出现 5 个错误后停止?

    是否可以指示 GNU c 编译器在发现 5 个错误后停止 在文档中找不到这个 命令行选项 fmax errors N https gcc gnu org onlinedocs gcc 4 6 0 gcc Warning Options ht
  • 在 MATLAB 中将 ASCII 代码转换为字符串

    如果我在 matlab 中有一个字符串 我可以使用以下命令将其转换为 ASCII 代码向量double gt gt my string asd gt gt double my string ans 97 115 100 我怎样才能从另一条路
  • 如何找到张量对象中每一行的最大索引?

    因此 我正在创建一个 pytorch 模型 对于前向传递 我应用前向传递方法来获取包含每个类别的预测分数的分数张量 该张量的形状为 100 10 现在 我想通过将其与包含实际分数的 y 进行比较来获得准确性 该张量的形状为 100 为了比较
  • 玩2.5 Ebean和JPA:NoSuchMethodError

    我在将项目迁移到 Play 2 5 时遇到了另一个问题 其中一个项目同时使用 Ebean 和 JPA 这是build sbt name Project version 1 0 SNAPSHOT lazy val root project i
  • getParcelable() 由于 AGP 8 中的 ifTable 为空而崩溃

    我最近更新到了 AGP 8 并在 Play 商店上发布了更新 我收到一些最近未更改的代码区域发生崩溃的报告 我相当有信心这是由 AGP 8 升级引起的崩溃 特别是在 R8 全模式周围 崩溃周围的代码正在恢复布局管理器的状态 恢复代码 if