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

2023-10-06 22:04

本文主要是介绍安卓开发中遇到的奇奇怪怪的问题(四),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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 itemat 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 referenceat 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 referenceat 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() {@Overridepublic 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.chinasem.cn/article/154163

相关文章

Python+PyQt5开发一个Windows电脑启动项管理神器

《Python+PyQt5开发一个Windows电脑启动项管理神器》:本文主要介绍如何使用PyQt5开发一款颜值与功能并存的Windows启动项管理工具,不仅能查看/删除现有启动项,还能智能添加新... 目录开篇:为什么我们需要启动项管理工具功能全景图核心技术解析1. Windows注册表操作2. 启动文件

解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException: org.junit.Test问题

《解决tomcat启动时报Junit相关错误java.lang.ClassNotFoundException:org.junit.Test问题》:本文主要介绍解决tomcat启动时报Junit相... 目录tomcat启动时报Junit相关错误Java.lang.ClassNotFoundException

解决Maven项目报错:failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题

《解决Maven项目报错:failedtoexecutegoalorg.apache.maven.plugins:maven-compiler-plugin:3.13.0的问题》这篇文章主要介... 目录Maven项目报错:failed to execute goal org.apache.maven.pl

使用Python开发Markdown兼容公式格式转换工具

《使用Python开发Markdown兼容公式格式转换工具》在技术写作中我们经常遇到公式格式问题,例如MathML无法显示,LaTeX格式错乱等,所以本文我们将使用Python开发Markdown兼容... 目录一、工具背景二、环境配置(Windows 10/11)1. 创建conda环境2. 获取XSLT

MySQL主从同步延迟问题的全面解决方案

《MySQL主从同步延迟问题的全面解决方案》MySQL主从同步延迟是分布式数据库系统中的常见问题,会导致从库读取到过期数据,影响业务一致性,下面我将深入分析延迟原因并提供多层次的解决方案,需要的朋友可... 目录一、同步延迟原因深度分析1.1 主从复制原理回顾1.2 延迟产生的关键环节二、实时监控与诊断方案

Android开发环境配置避坑指南

《Android开发环境配置避坑指南》本文主要介绍了Android开发环境配置过程中遇到的问题及解决方案,包括VPN注意事项、工具版本统一、Gerrit邮箱配置、Git拉取和提交代码、MergevsR... 目录网络环境:VPN 注意事项工具版本统一:android Studio & JDKGerrit的邮

SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法

《SQLyog中DELIMITER执行存储过程时出现前置缩进问题的解决方法》在SQLyog中执行存储过程时出现的前置缩进问题,实际上反映了SQLyog对SQL语句解析的一个特殊行为,本文给大家介绍了详... 目录问题根源正确写法示例永久解决方案为什么命令行不受影响?最佳实践建议问题根源SQLyog的语句分

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二: