一个崩溃的排查出错过程

Firebase 里显示了一个崩溃,是在 app 的代码调用 ApplicationPackageManager.getPackageInfo 进行数据查询的时候:“android.os.DeadSystemException”,“Package manager has died”。网上也有相关的分析,英文可以看这篇。看其中说,是因为跨进程交换的数据太大导致,而导致数据太大的原因,又往往是因为不止一个线程在同时调用。

app 里的正常逻辑显然是不应该出现同时并发调用的情况的,但我突然脑补了一种可能:功能入口按钮被快速重复点击。这是 Android 编程时的一个常见问题,在进行了验证测试后几个小时,果然 Firebase 里出现了该问题的新增计数。

如何避免重复点击带来的副作用,网上有好多现成代码,还有用 AspectJ 这种杀器自制注解的。老夫还是决定自己写一个小工具类,代码如下。

自评一句,那个带 cookie 参数的版本我没有测试,但那个参数本身我觉得设计的很棒,它使得一组按钮,既可以总体限速,也可以分别限速。1000ms 是个经验值,可能直觉上不应该有这么久,但事实就是如果时限短于 1 秒的话,效果会大打折扣。

 

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注