Android,debug正常运行,用其他途径打开程序就会崩溃,且没报异常!

概括来说就是一句话:慎用 Android.os.Debug.waitForDebugger()  !!!

我在Service中加了下面这句:
android.os.Debug.waitForDebugger();	//程序运行到这行后,会寻找下一个断点,然后进入暂停状态,等待调试完成

这就导致了一种现象,而当退出应用时,如果相应的Service没有被正常关闭,重新打开应用时,程序就会一直黑屏等待,最后超时崩溃。这时只有一种情况能正常打开程序,就是通过AndroidStudio的debug功能。

注意上面的红字,也就是说,如果Service已经被正常关闭了,再通过debug之外的其他途径打开的话,程序也是可以正常运行的。

于是我在MainActivity的onDestry方法中,调用stopService()手动关闭服务。然后按返回键正常退出,重新打开程序就可以正常运行了。

解决办法只有一个:删除waitForDebugger()这行代码。

除此之外还有一个奇怪的现象:
开机自动启动时,重新打开程序依然崩溃。
(这个我暂时还不明白是为什么。理论上,之前的Service已经被正常关闭了,这次启动不应该会有问题啊?)

以上现象,我个人猜测原因可能是:程序在开始debug运行时,会给APP加上一个标签tag,这个tag告诉操作系统要“不忽略waitForDebugger()”这一行;而正常结束运行时,程序会再去修改这个tag,告诉操作系统之后的运行“要忽略waitForDebugger()”。  而当APP第一次被安装,或者操作系统重启之后,这个tag都会被还原,也就是变成“不忽略waitForDebugger()”。
而被强制退出的情况,程序还没来得及去修改这个tag,程序就已经被关闭了,再重新打开时,tag还是“不忽略”的状态,然后也就出现了程序卡死崩溃的情况。

===============================================================================================
2017/8/9 补充:

在waitForDebugger()那一行仍然存在的情况下,如果我把项目换到一个电脑上的AndroidStudio里,结果就是连debug都失败了。这说明——
标签tag中,包含了AndroidStudio的debug签名信息,作用类似于“验证”。所以换了一个AndroidStudio去用debug调试时,debug签名信息变了,“验证”不通过,其也就不能修改这个tag。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值