Android,debug正常运行,用其他途径打开程序就会崩溃,且没报异常!
2017-08-07 11:20
786 查看
概括来说就是一句话:慎用 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。
相关文章推荐
- 【转】Android 当打开“开发者模式”中的“不保留活动”后,程序应当怎么保持正常运行
- [求解]在debug模式下程序正常运行(多次测试),运行模式下(正确数据)时常会抛异常,抛异常后事务也没有阻止,而继续执行操作?
- Android:程序运行正常,启动debug就崩了
- Android 当打开“开发者模式”中的“不保留活动”后,程序应当怎么保持正常运行
- ArcGIS for Android 10.1.1API 中文标注导致程序异常崩溃问题
- vc中debug版程序正常但release版崩溃
- Android程序:使用系统服务*1.获取网络状态 * 2.打开关闭wifi * 3.获取系统音量 * 4.获取运行程序的包名
- vc中debug版程序正常但release版崩溃的解决方法
- Android 打开其他程序
- IOS 打包后安装崩溃,debug正常运行
- android 中处理崩溃异常并重启程序
- ArcGIS for Android 10.1.1API 中文标注导致程序异常崩溃问题
- android 中处理崩溃异常并重启程序
- android 中处理崩溃异常并重启程序
- android处理crash程序崩溃异常
- android 如何调用(打开)其他程序
- IOS错误异常一个未知的实例在运行,出现程序崩溃
- 网页使用ie或者360打开时按F12出现程序停止运行异常的原因以及解决方案
- DEBUG后可以正常运行,RELEASE后出现异常错误
- Android程序异常崩溃处理