我正在编写和测试一个Android应用程序,我需要在多次崩溃时重新启动应用程序。 重启代码工作正常,但2次崩溃后服务没有重启,我在日志中看到以下消息
06-13 02:31:02.098: W/ActivityManager(2117): Service crashed 2 times, stopping: ServiceRecord{42b5b6a0
AcitivityManager不允许在2次崩溃后重新启动服务。
是否有一些API用于我们可以将此数字从2更改为其他?
此处提供了重现此功能的示例应用
https://github.com/devendram/servicecrashdemo
此处提供Logcat输出
https://gist.github.com/devendram/5c5259d3f91fd8409e7b#file-gistfile1-txt-L1754
答案 0 :(得分:0)
所以我不能发誓这是适用的,但它是我在网上找到的“ServiceRecord”的更好例子之一:
http://hi-android.info/src/com/android/server/am/ServiceRecord.java.html
另外
http://justanapplication.wordpress.com/2012/06/06/dgc_18/
对ServiceRecord进行了一些很好的讨论。从我所看到的,它看起来像Android跟踪您的服务,并为了避免一些问题,停止允许服务启动,如果它反复崩溃。我看到的常数并不完全匹配2,但我怀疑这是问题所在。
你能找到避免崩溃的方法吗?以Try-Catch为例?这是昂贵的,但它可以避免崩溃和碰撞....
否则 - 为什么您的服务频繁崩溃?为什么需要?
答案 1 :(得分:0)
查看android源代码后,我发现ProcessRecord的一个属性可以解决问题,isPersistent()。然后我用 adb 转储了所有包的包信息。结果如下:
Package [com.android.phone] (fa7158b):
userId=1001
sharedUser=SharedUserSetting{3eab065 android.uid.phone/1001}
pkg=Package{4db66c com.android.phone}
codePath=/system/priv-app/TeleService
resourcePath=/system/priv-app/TeleService
legacyNativeLibraryDir=/system/priv-app/TeleService/lib
primaryCpuAbi=null
secondaryCpuAbi=null
versionCode=29 minSdk=29 targetSdk=29
versionName=10
splits=[base]
apkSigningVersion=3
applicationInfo=ApplicationInfo{58dac1b com.android.phone}
flags=[ SYSTEM HAS_CODE PERSISTENT ALLOW_CLEAR_USER_DATA ]
标志 PERSISTENT 很有趣,我认为它可能在 AndroidManifest.xml 中设置。于是查了all available attributes of tag application,终于得到了android:persistent属性来解决这个问题。
顺便说一下,我是一名 android 系统服务程序员,他编写了使用平台密钥签名的 android 应用程序。我不确定它是否也适用于普通的。