安卓开发中遇到的奇奇怪怪的问题(四)

news2024/10/5 19:20:21

在这里插入图片描述
好久没有写这个系列了,感觉还是需要把日常开发中遇到的问题做一个记录总结,因为有些问题我当时遇到时,搜都搜不到,只能慢慢摸索。帮助他人的同时也能给自己留个备忘录。话不多说,凡是近一年的奇怪问题,我想起一个会补充一个。

1.适配Android 12应用启动画面

如果windowSplashScreenAnimatedIcon设置的是静态图片,即使你用的是矢量图,开屏是图片还是会模糊。最后发现使用动态矢量图就清晰了。。。可以用标签包裹原先的静态图,示例如下:

<animated-vector xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:aapt="http://schemas.android.com/aapt">
    <aapt:attr name="android:drawable">
        <vector .../>
    </aapt:attr>
</animated-vector>

也不知道具体是什么原因,只是当我发现Gmail的启动画面是正常的时,怀疑是不是需要用动态矢量图。结果一试发现果然正常了。

上线后发现了另一个问题,个别Android 12设备上出现了三种崩溃,由多到少排序如下:

Fatal Exception: java.lang.IllegalArgumentException: Activity client record must not be null to execute transaction item
       at android.app.servertransaction.ActivityTransactionItem.getActivityClientRecord(ActivityTransactionItem.java:85)
       at android.app.servertransaction.ActivityTransactionItem.getActivityClientRecord(ActivityTransactionItem.java:58)
       at android.app.servertransaction.ActivityTransactionItem.execute(ActivityTransactionItem.java:43)
       at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
       at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2443)
Fatal Exception: java.lang.NullPointerException: Attempt to invoke virtual method 'com.android.server.wm.DisplayContent com.android.server.wm.WindowContainer.getDisplayContent()' on a null object reference
       at android.os.Parcel.createExceptionOrNull(Parcel.java:2432)
       at android.os.Parcel.createException(Parcel.java:2410)
       at android.os.Parcel.readException(Parcel.java:2393)
       at android.os.Parcel.readException(Parcel.java:2335)
       at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:2377)
       at android.app.Instrumentation.execStartActivity(Instrumentation.java:1808)
       at android.app.Activity.startActivityForResult(Activity.java:5506)
       at androidx.activity.ComponentActivity.startActivityForResult(SourceFile:2)
       at android.app.Activity.startActivityForResult(Activity.java:5464)
       at androidx.activity.ComponentActivity.startActivityForResult(SourceFile:1)
       at android.app.Activity.startActivity(Activity.java:5854)
       at android.app.Activity.startActivity(Activity.java:5807)

下面这个都是Android12的小米手机,机型型号:Redmi 9T,Redmi Note 9 Pro,Redmi Note 11 Pro 5G,Poco M2 Pro:

Fatal Exception: java.lang.IllegalArgumentException: reparent: can't reparent to null, mParent is nullWindow{37a85c8 u0 Splash Screen com.xxx}
       at android.os.Parcel.createExceptionOrNull(Parcel.java:2430)
       at android.os.Parcel.createException(Parcel.java:2410)
       at android.os.Parcel.readException(Parcel.java:2393)
       at android.os.Parcel.readException(Parcel.java:2335)
       at android.app.IActivityTaskManager$Stub$Proxy.startActivity(IActivityTaskManager.java:2721)
       at android.app.Instrumentation.execStartActivity(Instrumentation.java:1745)
       at android.app.Activity.startActivityForResult(Activity.java:5482)
       at androidx.activity.ComponentActivity.startActivityForResult(SourceFile:2)
       at android.app.Activity.startActivityForResult(Activity.java:5440)
       at androidx.activity.ComponentActivity.startActivityForResult(SourceFile:1)
       at android.app.Activity.startActivity(Activity.java:5826)
       at android.app.Activity.startActivity(Activity.java:5779)

记得当时统计到一天会崩溃2次左右,这三种崩溃总计影响了近80位用户。

Android 13上会出现崩溃如下:

Fatal Exception: java.lang.NullPointerException: Attempt to invoke direct method 'void android.view.SurfaceControl.checkNotReleased()' on a null object reference
       at android.view.SurfaceControl.-$$Nest$mcheckNotReleased()
       at android.view.SurfaceControl$Transaction.checkPreconditions(SurfaceControl.java:2896)
       at android.view.SurfaceControl$Transaction.hide(SurfaceControl.java:3079)
       at android.app.ActivityThread.syncTransferSplashscreenViewTransaction(ActivityThread.java:4359)
       at android.app.ActivityThread.-$$Nest$msyncTransferSplashscreenViewTransaction()
       at android.app.ActivityThread$1.onDraw(ActivityThread.java:4336)
       at android.view.ViewTreeObserver.dispatchOnDraw(ViewTreeObserver.java:1132)
       at android.view.ViewRootImpl.draw(ViewRootImpl.java:4805)
       at android.view.ViewRootImpl.performDraw(ViewRootImpl.java:4572)
       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:3758)
       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2458)
       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:9466)

这个总共崩溃14次,对于大多数用户是Android 13系统来说,相对比较低。

后面我也查询到了相关问题:

  • java.lang.IllegalArgumentException: Activity client record must not be null to execute transaction item
  • App crashing by NPE or IllegalArgumentException on WindowContainer#reparent() during system splash screen exit animation
  • Crash: Attempt to invoke direct method ‘void android.view.SurfaceControl.checkNotReleased()’ on a null object reference

结论是Android 源码中的一个bug,但是另我不解的是当时另外一个产品也做了相关适配,但是没有此类问题。后面对比发现是多了下面这个方法:

getSplashScreen().setOnExitAnimationListener(new SplashScreen.OnExitAnimationListener() {
    @Override
    public void onSplashScreenExit(@NonNull SplashScreenView splashScreenView) {
        splashScreenView.remove();
    }
});

加这个目的是原因是个别手机上SplashScreen和页面过渡时会有淡入淡出的切换动画。为了过渡“无感”,所以加了这个监听方法,在SplashScreen结束时直接移除。

一开始以为是remove导致的空指针,所以一开始的修复方式是改为隐藏splashScreenView.setVisibility(View.GONE),然后上线后发现无效。。。最后只能是删除了这个监听,之后就没有崩溃了。

因为是个别机型个别系统版本的问题,所以也不方便去找这些厂家的源码去一探究竟。所以只能是去线上快速试错,好在此类崩溃不多,否则真是会让人头疼不已。

2. Gson与Gradle

年初将Gradle从7.0.2升到7.2.2后,发现release包运行崩溃了。

Fatal Exception: java.lang.RuntimeException: Missing type parameter.
	com.google.gson.reflect.TypeToken.getSuperclassTypeParameter (TypeToken.java:84)
	com.google.gson.reflect.TypeToken.<init> (TypeToken.java:62)

看到异常报到了Gson上面,所以我就去gson项目下搜了一下相关异常,结果如下:(gson版本是2.8.5)

相关问题:

  • Missing type parameter RuntimeException
  • R8 FullMode in AGP 7.0.0-beta01 transforming ParameterizedType implementations to Class

原因是R8 3.0版本开始从未在完整模式下(full mode)与-keep规则匹配的项目中删除通用签名。此更改的动机是避免在程序中保留所有通用签名,而通常只需要少数通用签名用于反射。

解决方法,添加混淆配置:

-keep,allowobfuscation,allowshrinking class com.google.gson.reflect.TypeToken
-keep,allowobfuscation,allowshrinking class * extends com.google.gson.reflect.TypeToken

3. 静音与投屏

这个是最近出现的问题。项目中的视频在播放时,有段逻辑会触发"取消静音"的操作,这块发生了崩溃,问题代码:

AudioManager mAudioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
mAudioManager.setStreamMute(AudioManager.STREAM_MUSIC, true);

Android 13 ,机型:Galaxy Z Flip4 / Galaxy Z Flip3 / Galaxy Z Fold4 ,异常如下:

Fatal Exception: java.lang.SecurityException: Permission required to call setVolumeKeyEvent: Neither user 10188 nor current process has android.permission.CONFIGURE_WIFI_DISPLAY.
       at android.os.Parcel.createExceptionOrNull(Parcel.java:3023)
       at android.os.Parcel.createException(Parcel.java:3007)
       at android.os.Parcel.readException(Parcel.java:2990)
       at android.os.Parcel.readException(Parcel.java:2932)
       at android.media.IAudioService$Stub$Proxy.adjustStreamVolumeWithAttribution(IAudioService.java:4666)
       at android.media.AudioManager.adjustStreamVolume(AudioManager.java:971)
       at android.media.AudioManager.setStreamMute(AudioManager.java:1506)

Caused by android.os.RemoteException: Remote stack trace:
	at android.app.ContextImpl.enforce(ContextImpl.java:2359)
	at android.app.ContextImpl.enforceCallingOrSelfPermission(ContextImpl.java:2387)
	at com.android.server.display.DisplayManagerService$BinderService.setVolumeKeyEvent(DisplayManagerService.java:4566)
	at android.hardware.display.DisplayManagerGlobal.setVolumeKeyEvent(DisplayManagerGlobal.java:1196)
	at android.hardware.display.DisplayManager.semSetWifiDisplayConfiguration(DisplayManager.java:2489)

提示没有CONFIGURE_WIFI_DISPLAY权限,但是这个权限只授予系统应用程序。这个权限是允许应用程序配置和连接到Wifi显示器的,通常用做系统无线投屏(Miracast)。

我查到同样机型和系统且能触发这块代码的用户一百多人,目前出现此问题的只有四人。(十天时间)

在这里插入图片描述

我能想到的是,用户可能有使用三星系统自带的Smart View来进行投屏。因为使用App同时使用系统投屏功能本就是少数(因为App中有投屏功能),且这个功能不是最近才有的。这样突然集中出现,且都是三星的设备,只能大概率怀疑是手机系统更新后出现的新问题。

目前处理方法只能先加上异常捕获,改为错误上报,持续观察一下。后面有进展了会补充到这里。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1063372.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Rust中的枚举和模式匹配

专栏简介&#xff1a;本专栏作为Rust语言的入门级的文章&#xff0c;目的是为了分享关于Rust语言的编程技巧和知识。对于Rust语言&#xff0c;虽然历史没有C、和python历史悠远&#xff0c;但是它的优点可以说是非常的多&#xff0c;既继承了C运行速度&#xff0c;还拥有了Java…

24 mysql all 查询

前言 这里主要是 探究一下 explain $sql 中各个 type 诸如 const, ref, range, index, all 的查询的影响, 以及一个初步的效率的判断 这里会调试源码来看一下 各个类型的查询 需要 lookUp 的记录 以及 相关的差异 此系列文章建议从 mysql const 查询 开始看 测试表结构…

【网络】路由器和交换机的区别

&#x1f341; 博主 "开着拖拉机回家"带您 Go to New World.✨&#x1f341; &#x1f984; 个人主页——&#x1f390;开着拖拉机回家_Linux,大数据运维-CSDN博客 &#x1f390;✨&#x1f341; &#x1fa81;&#x1f341; 希望本文能够给您带来一定的帮助&#x1…

小谈设计模式(21)—迭代器模式

小谈设计模式&#xff08;21&#xff09;—迭代器模式 专栏介绍专栏地址专栏介绍 迭代器模式对象分析聚合对象&#xff08;Aggregate&#xff09;迭代器对象&#xff08;Iterator&#xff09; Java程序示例程序分析12 优缺点分析优点简化了聚合对象的接口统一的遍历方式增加了代…

20秒基于Chat GPT完成工作中的小程序

1. 写在前面 GPT自从去年爆发以来&#xff0c;各大公司在大模型方面持续发力&#xff0c;行业大模型也如雨后春笋一般发展迅速&#xff0c;日常工作中比较多的应用场景还是问答模式&#xff0c;作为写程序的辅助也偶尔使用。今天看到一篇翻译的博客“我用 ChatGPT&#xff0c;…

更新Xcode 版本后运行项目出现错误 Unable to boot the Simulator 解决方法

错误截图 出现 Unable to boot the Simulator 错误原因很多&#xff0c;以下方法不一定都适用&#xff0c;我是通过以下方法解决的 打开命令终端输入以下命令&#xff0c;可能需要你输入开机密码 sudo rm -rf ~/Library/Developer/CoreSimulator/Caches

Android---字节码层面分析Class类文件

Java 提供了一种可以在所有平台上都能使用的一种中间代码---字节码文件(.class文件)。有了字节码&#xff0c;无论是那个平台只要安装了虚拟机都可以直接运行字节码文件。有了虚拟机&#xff0c;解除了 java 虚拟机与 java 代码之间的耦合。 Java 虚拟机当初被设计出来时就不单…

【设计模式】访问者模式

文章目录 1.访问者模式定义2.访问者模式的角色3.访问者模式实战案例3.1.场景说明3.2.UML类图3.3.代码实现 4.访问者模式优缺点5.访问者模式适用场景6.访问者模式总结 主页传送门&#xff1a;&#x1f481; 传送 1.访问者模式定义 访问者模式&#xff08;Visitor Pattern&#x…

【MATLAB源码-第43期】基于matlab的turbo码误码率仿真比较不同迭代次数,采用logmap/sova算法。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 Turbo码是一种前向纠错码 (Forward Error Correction, FEC)&#xff0c;在 1993 年由法国的两位研究员 Claude Berrou 和 Alain Glavieux 提出。这种编码技术以其接近 Shannon 极限的高性能而受到广泛关注。以下是关于 Turbo…

黑马JVM总结(二十六)

&#xff08;1&#xff09;异常-catch 下面看一下字节码里面怎么做异常的处理 &#xff08;2&#xff09;异常-多个catch astore_2:就是把异常对象的地址存到局部变量表2号曹位上 &#xff08;3&#xff09;异常-multicatch &#xff08;4&#xff09;异常-finally &#xff0…

uniapp 实现地图头像上的水波纹效果

最近实现了uniapp 地图头像水波纹的效果&#xff0c;话不多说&#xff0c;先来看看视频效果吧&#xff1a;链接 在这里具体的代码就不放出来了&#xff0c;还是利用了uniapp的 uni.createAnimation 方法&#xff0c;因为cover-view 不支持一些css 的动画效果&#xff0c;所以这…

探秘布隆过滤器:高效数据查找与去重利器

探秘布隆过滤器&#xff1a;高效数据查找与去重利器 引言 在现代计算机科学中&#xff0c;数据的查找与去重是一个至关重要的问题。本文将介绍一种高效的数据结构——布隆过滤器&#xff0c;它能够在海量数据中快速判断某个元素是否存在&#xff0c;同时具有出色的空间效率。…

动态调整系统主题色(4): CssVar 与 Variant 方案的探索

动态调整系统主题色(4): CssVar 与 Variant 方案的探索 动态调整系统主题色(4): CssVar 与 Variant 方案的探索 前言方案的介绍与比较 CssVar (CSS 变量方案)CSS 变量方案与 tailwindcss 的结合Variant 方案 2种方案在小程序上的示例之前的几篇 前言 这篇已经是动态调整系统…

深度学习模型部署与优化:策略与实践;L40S与A100、H100的对比分析

★深度学习、机器学习、生成式AI、深度神经网络、抽象学习、Seq2Seq、VAE、GAN、GPT、BERT、预训练语言模型、Transformer、ChatGPT、GenAI、多模态大模型、视觉大模型、TensorFlow、PyTorch、Batchnorm、Scale、Crop算子、L40S、A100、H100、A800、H800 随着生成式AI应用的迅猛…

python打开浏览器并模拟搜索

打开已存在的浏览器 打开已存在的浏览器有个很重要的作用就是&#xff0c;可以对于一些登录场景&#xff0c;提前登录好&#xff0c;不需要模拟登录了。 在命令行中执行打开chrome的命令&#xff0c;在图标上找到chrome的安装位置 在cmd命令行下执行命令 C:\Program Files\…

工厂管理软件中的计划排产是什么

一、计划排产的定义&#xff1a; 计划排产是指根据工厂的生产能力、订单需求和资源限制等因素&#xff0c;合理安排生产任务和时间&#xff0c;以实现高效的生产计划。它涉及到生产订单的分配、生产线的调度和资源的优化利用&#xff0c;旨在提高生产效率、缩短交货时间和降低…

高速公路堵车动力学

S/t trace 图可以分析牛顿力学时间序列的一切。 下例分析了当车距太小时&#xff0c;一个轻微的刹车扰动如何触发大堵车的&#xff1a; 堵车由以下因素促成&#xff1a; 刹车反应时间&#xff0c;刹车反应很快&#xff0c;看见灯即可&#xff0c;即使这样越往后刹车必须越狠&…

对于对象初始化的加深理解

一道有一定难度和挑战性的注重细节的有趣的面试题 目录 案例需求不同写法与角度下写法一写法二写法三写法四A类B类测试类 注参考视频 案例需求 不同写法与角度下 写法一 注&#xff1a;方法的修饰符为private package com.xie.interview;/*** 对象属性初始化相关的面试笔试题*…

Stable diffusion的架构解读(本博客还是以unet架构为主)

博客只是简单的记录一下自己学的&#xff0c;基于自己的一些情况&#xff0c;所以简单了一些只是将来忘记&#xff0c;用来回顾用。 论文的大体框架 unet结构位于 unet会接受prompt特征、latent特征、和t时间步特征&#xff0c;最后生成新一轮的特征 可以参考知乎大佬htt…

re学习(37)DASCTF 2023 0X401七月暑期挑战赛 controflow

程序通过改变栈里面的返回地址来控制程序的控制流 从而达到混淆的效果 左侧有许多被hook的函数 在每个函数开头设置断点 然后观察程序的运行流程 会发现输入的数据会进行 异或 相加 异或 相减 相乘 异或等操作 要注意部分运算的索引是 从[10]开始的 具体思路参考&#xf…