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

来源:互联网 发布:韩寒新作品2018 知乎 编辑:程序博客网 时间:2024/06/03 16:00

概括来说就是一句话:慎用 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
原创粉丝点击