当前位置: 首页 > web >正文

TimeoutException问题排查

崩溃堆栈:

java.util.concurrent.TimeoutException: com.android.internal.os.BinderInternal$GcWatcher.finalize() timed out after 10 secondsat com.android.internal.os.BinderInternal$GcWatcher.finalize(BinderInternal.java:63)at java.lang.Daemons$FinalizerDaemon.doFinalize(Daemons.java:289)at java.lang.Daemons$FinalizerDaemon.runInternal(Daemons.java:276)at java.lang.Daemons$Daemon.run(Daemons.java:137)at java.lang.Thread.run(Thread.java:919)

崩溃的设备上大量报错:

onBillingSetupFinished: 3 Google Play In-app Billing API version is less than 3
Billing service disconnected

检查方法

  1. 看网上的讨论,大多是模拟器场景会有问题,出错问题的设备基本上都有root
  2. 逆向查看了 https://mvnrepository.com/artifact/com.android.billingclient/billing/6.0.1 细节如下:

看起来这个sdk只是调用intent,跨进程调用 com.android.vending 的服务,不确定是不是 用户的 com.android.vending 服务版本有问题。

Intent intent = new Intent("com.android.vending.billing.InAppBillingService.BIND");
intent.setPackage("com.android.vending");
List<ResolveInfo> queryIntentServices = this.zze.getPackageManager().queryIntentServices(intent, 0);this.zzh = new zzaf(this, billingClientStateListener, null);
if (this.zze.bindService(intent2, this.zzh, 1)) {com.google.android.gms.internal.play_billing.zzb.zzi("BillingClient", "Service was bonded successfully.");return;
} else {com.google.android.gms.internal.play_billing.zzb.zzj("BillingClient", "Connection to Billing service is blocked.");i = 39;
}
@Override // android.content.ServiceConnection
public final void onServiceDisconnected(ComponentName componentName) {com.google.android.gms.internal.play_billing.zzb.zzj("BillingClient", "Billing service disconnected.");BillingClientImpl.zzg(this.zza).zzc(zzgd.zzw());BillingClientImpl.zzD(this.zza, null);BillingClientImpl.zzp(this.zza, 0);synchronized (this.zzb) {try {BillingClientStateListener billingClientStateListener = this.zzd;if (billingClientStateListener != null) {billingClientStateListener.onBillingServiceDisconnected();}} catch (Throwable th) {throw th;}}
}

触发来源是 onServiceDisconnected。
这意味着,用户设备上的 com.android.vending 这个程序,正在不断经历启动、崩溃、重启。
我们这边因为支付功能,需要调用 Billing 去跨进程使用 vending 的服务,所以被波及了。

解决的思路有几个:

  1. 限频调用 billingClient.startConnection,避免大量密集调用 【前同事的缓解措施】

  2. 升级Billingsdk:注意到触发崩溃的是 com.android.vending 的服务 ,升级可能意义不大。【未使用】

  3. 增加heap,减少触发gc的概率 【观察有效】

  4. 参考滴滴的做法,忽略这个崩溃 江义旺:滴滴出行安卓端 finalize time out 的解决方案 【未使用】



忽略这个崩溃

下文的细节来自:江义旺:滴滴出行安卓端 finalize time out 的解决方案

  1. 手动修改 finalize() 方法超时时间
try {Class<?> c = Class.forName(java.lang.Daemons);Field maxField = c.getDeclaredField(MAX_FINALIZE_NANOS);maxField.setAccessible(true);maxField.set(null, Long.MAX_VALUE);
} catch (Exception e) {...
}
  1. 手动停掉 FinalizerWatchdogDaemon 线程
try {Class clazz = Class.forName("java.lang.Daemons$FinalizerWatchdogDaemon");Method method = clazz.getSuperclass().getDeclaredMethod("stop");method.setAccessible(true);Field field = clazz.getDeclaredField("INSTANCE");field.setAccessible(true);method.invoke(field.get(null));
} catch (Throwable e) {e.printStackTrace();
}
  1. 忽略这个崩溃,避免用户触发
final Thread.UncaughtExceptionHandler defaultUncaughtExceptionHandler = Thread.getDefaultUncaughtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {@Overridepublic void uncaughtException(Thread t, Throwable e) {if (t.getName().equals("FinalizerWatchdogDaemon") && e instanceof TimeoutException) {//ignore it} else {defaultUncaughtExceptionHandler.uncaughtException(t, e);}}
});
http://www.xdnf.cn/news/9940.html

相关文章:

  • 必会利器:scp 命令
  • Linux程序管理练习题
  • Python中的enumerate函数:优雅地遍历序列索引与元素
  • 一个开源脚本,可自动安装在 AMD Radeon 7900XTX 上运行选定 AI 接口所需的所有内容
  • 【Java Web】速通CSS
  • DeepSeek与AI提示语设计的全面指南
  • 使用大模型预测结节性甲状腺肿的全流程系统技术方案
  • 花哨桌面 V 3.0.0 (火影忍者版)
  • 模型评估指标详解:准确率、召回率、AUC 是什么?
  • WebVm:无需安装,一款可以在浏览器运行的 Linux 来了
  • 使用有名管道(FIFO)实现循环通信的客户端-服务端
  • 深入了解linux系统—— 库的链接和加载
  • 最大流-Ford-Fulkerson增广路径算法py/cpp/Java三语言实现
  • 春秋云镜 Brute4Road Writeup
  • 互联网商业模式全景解读:B2B、B2C、C2C及更多
  • docker常见考点
  • Qt 中的 d-pointer 与 p-pointer小结
  • 每日一题——提取服务器物料型号并统计出现次数
  • Jupyter Notebook 是否需要与环境绑定
  • [C]基础17.自定义类型:结构体
  • [ctfshow web入门] web124
  • `qDebug`消息重定向到`QLabel`中。
  • 安卓手机照片在这个目录/storage/emulated/999/DCIM/Camera下的导出解决方案
  • 解决报错error: ‘void_t’ is not a member of ‘std’
  • Python reduce()函数详解:累积计算的艺术
  • 机器学习课设
  • 麒麟v10+信创x86处理器离线搭建k8s集群完整过程
  • 定点小数 不需要指数部分 不采用移码
  • ASP.NET TreeView控件使用指南
  • Java复习Day22