最近的项目需要用到服务端收集客户端崩溃的详细异常log数据:
之前也做过,感觉很轻松,没想到遇到问题了,还纠结了半天:
以下是关键log日志
05-04 20:28:42.409: W/ActivityManager(374): Process com.example.service has crashed too many times: killing!
05-04 20:28:42.409: I/ActivityManager(374): Killing proc 20556:com.example.service/u0a10080: crash
05-04 20:28:43.323: W/ActivityManager(374): Unable to launch app com.example.service/10080 for service Intent { cmp=com.example.service/.service.TestService }: process is bad
问题介绍:
a、带界面的应用,当应用拥有当前界面时发生RuntimeException,可以被alarm和BroadcastReceiver唤醒;
b、统计器后台运行:产生RuntimeException之后再也起不来了(不可以被alarm和BroadcastReceiver再次唤醒);
问题查找过程:
推荐一个在线查看源码的网站,很方便
http://grepcode.com/project/repository.grepcode.com/java/ext/com.google.android/android/
1、 关键词搜索:process is bad
2、发现出处
class: com.android.server.am.ActivityManagerService
method: private final ContentProviderHolder getContentProviderImpl(IApplicationThread caller,
String name, IBinder token, boolean stable, int userId);
具体位置:
ProcessRecord proc = startProcessLocked(cpi.processName,
cpr.appInfo, false, 0, "content provider",
new ComponentName(cpi.applicationInfo.packageName,
cpi.name), false, false);
if (proc == null) {
Slog.w(TAG, "Unable to launch app "
+ cpi.applicationInfo.packageName + "/"
+ cpi.applicationInfo.uid + " for provider "
+ name + ": process is bad");
return null;
}
3、继续跟踪 com.android.server.am.ActivityManagerService 的 startProcessLocked ,原因就在里头;
原因:
参考:
class : com.android.server.am.ActivityManagerService
method: final ProcessRecordstartProcessLocked(String processName,
ApplicationInfo info, boolean knownToBeDead, int intentFlags,
String hostingType, ComponentName hostingName,
boolean allowWhileBooting, boolean isolated) {}
程序发生RuntimeException,被crash掉,如果被重新起来,这个时候判断是否是后台应用,如果是后台应用则silently fail.
关键代码:红色标记注释
if (!isolated) {
if ((intentFlags&Intent.FLAG_FROM_BACKGROUND) != 0) {
// If we are in the background, then check to see if this process
// is bad. If so, we will just silently fail.
if (mBadProcesses.get(info.processName, info.uid) != null) {
if (DEBUG_PROCESSES) Slog.v(TAG, "Bad process: " + info.uid
+ "/" + info.processName);
return null;
}
} else {
// When the user is explicitly starting a process, then clear its
// crash count so that we won't make it bad until they see at
// least one crash dialog again, and make the process good again
// if it had been bad.
if (DEBUG_PROCESSES) Slog.v(TAG, "Clearing bad process: " + info.uid
+ "/" + info.processName);
mProcessCrashTimes.remove(info.processName, info.uid);
if (mBadProcesses.get(info.processName, info.uid) != null) {
EventLog.writeEvent(EventLogTags.AM_PROC_GOOD,
UserHandle.getUserId(info.uid), info.uid,
info.processName);
mBadProcesses.remove(info.processName, info.uid);
if (app != null) {
app.bad = false;
}
}
}
相关推荐
It is designed to assist users in understanding the functionalities of the tester, ensuring they can effectively utilize it for cable testing purposes. #### Cirris Customer Support Cirris Systems ...
在iOS应用开发中,"LaunchScreen.storyboard"是用于创建应用程序启动界面的关键文件。这个启动界面,也称为启动图或启动画面,是用户打开应用时首先看到的屏幕,它不仅提升了用户体验,还能够展示品牌风格。在iOS 13...
11. **--cwd=CWD_LAUNCH**:设置程序运行时的工作目录。 12. **--enable-gcov**:启用代码覆盖率分析。注意:此选项仅在与之配合的特定编译条件下有效。 这些命令和选项是NS3中WAF的核心组成部分,它们使得开发者...
然而,在配置和运行Tomcat时,开发者常常会遇到各种问题,其中“`The required Server component failed to start so Tomcat is unable to start`”是一个常见的错误提示,这通常意味着Tomcat在启动过程中遇到了问题...
安卓手机购物清单 The applications require: * The latest Android 2.3 SDK * Ant 1.8 (if you are using ant) Most projects depend on the OI ...* the OI Distribution Library is included automatically.
16. **Launch**:启动,开始运行一个程序或进程。 17. **Skip**:跳过,忽略某个步骤或操作。 18. **Slave**:从属,常用于数据库中的主从复制,指从服务器。 19. **Master**:主控,通常指在主从结构中的控制端...
57. **Launch**:发射,启动,通常指产品上市或新项目的开始。 58. **Photocopy**:影印,复印件,复制文件或其他印刷材料的过程。 59. **Branch**:分支,分公司,指企业在一个地区的分部。 60. **Market Project ...
简单的安卓手机文件管理 Jan 17, 2011 The applications require: * The latest Android 2.3 SDK * Ant 1.8 (if you are using ant) ...* the OI Distribution Library is included automatically.
在这个案例中,我们需要在小程序的管理后台,将`https://restapi.amap.com`添加到"服务器域名"的白名单中。这是为了确保小程序能够安全地与高德地图的服务器进行通信,获取地图服务的相关数据,如定位、路径规划等。...
15. **nimbus.task.launch.secs**:task启动时的特殊超时设置,用于在首次心跳前临时替代nimbus.task.timeout.secs。 16. **nimbus.reassign**:当nimbus检测到task失败时是否自动重新分配,默认为true。 17. **...
25. **Launch**:启动或发起,常用于产品发布、项目启动等场景。 26. **Core**:中心或核心,可以指事物的本质或重要组成部分。 27. **Modify**、**Alter**、**Convert**:动词,均表示“改变”,但各有不同的侧...
3. **矩阵运算**:包括加减乘除、矩阵乘法(`*`)、点乘(`.*`)、点除(`./`)等。 4. **矩阵逆**:使用`inv(A)`计算矩阵A的逆。 5. **矩阵的乘方**:`A^2`表示A的平方,`A^n`表示A的n次方。 6. **关系逻辑操作**:如`==`...
- 例句:The initial plan was to launch the product in April. - **拓展**:*initialize*(初始化)、*initially*(最初)。 3. **modern** (adj.):现代的;当代的。 - 例句:Modern technology has ...
2. **Manage bookmarks Edit bookmarks (launch Bookmark dialog box)Alt+F2**:管理书签,启动书签对话框。 3. **Toggle bookmarkCtrl+F2**:切换当前行的书签状态。 4. **Toggle bookmark and edit itCtrl+Alt+F2*...
4. **Intent和IntentFilter**:Intent在Android中用于启动其他组件或传递数据,IntentFilter则定义了BroadcastReceiver可以响应的Intent类型。在这里,可能使用IntentFilter来匹配系统发送的特定广播,如用户离开...
"outFiles": ["${workspaceFolder}/dist/**/*.js"], "env": {} } ] } ``` 1. **version**:表示`launch.json`的版本,保持默认即可。 2. **configurations**:包含一组调试配置。 3. **type**:指定调试器类型...
14. **Service与Activity通信**:通过Binder、意图(Intent)、Messenger、AIDL等方式。 15. **Android版本API差异**:不同版本API提供了新功能,开发者需根据目标设备适配。 16. **后台服务不被杀死**:设置前台...
48. **Launch Splash**:为未上线的网站生成欢迎页面,提升用户体验。 以上仅是120款工具中的部分代表,每一款都有其独特的价值,开发者可以根据项目需求选择合适的工具,提升开发效率和产品质量。持续关注新兴工具...
1. **launch**:动词,表示发射、启动,如卫星的发射或新产品的上市;名词形式则指发射事件或船舶下水。 2. **conquest**:名词,常用来描述成功地占领或征服一个地方,也可指个人克服困难的过程。 3. **bog**:...