summaryrefslogtreecommitdiffstats
path: root/core/java/android/app
diff options
context:
space:
mode:
authorDianne Hackborn <hackbod@google.com>2011-08-11 19:36:18 -0700
committerDianne Hackborn <hackbod@google.com>2011-08-12 14:20:59 -0700
commit8e8d65ff5fdef12c6af3d003dfef19aadc39bea9 (patch)
treecaae5adb7a77cee7617e4533620075a6afb4c0ae /core/java/android/app
parent8a5c6617d513bd0a47c733520facb3ba543b70b0 (diff)
downloadframeworks_base-8e8d65ff5fdef12c6af3d003dfef19aadc39bea9.zip
frameworks_base-8e8d65ff5fdef12c6af3d003dfef19aadc39bea9.tar.gz
frameworks_base-8e8d65ff5fdef12c6af3d003dfef19aadc39bea9.tar.bz2
Fix some crashes that are happening in the system process.
- When shutting down, if the screen goes to sleep there is code that tries to do a notifyAll without holding the lock: java.lang.IllegalMonitorStateException: object not locked by thread before notifyAll() at java.lang.Object.notifyAll(Native Method) at com.android.server.am.ActivityStack.checkReadyForSleepLocked(ActivityStack.java:776) at com.android.server.am.ActivityStack$1.handleMessage(ActivityStack.java:282) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at com.android.server.ServerThread.run(SystemServer.java:603) - If an invalid Uri object is sent to the system process it can crash because the Uri class throws an assertion while unmarshalling. Change this to an IllegalArgumentException so it gets sent back to the caller: java.lang.AssertionError at android.net.Uri$PathPart.readFrom(Uri.java:2224) at android.net.Uri$HierarchicalUri.readFrom(Uri.java:1106) at android.net.Uri$1.createFromParcel(Uri.java:1689) at android.net.Uri$1.createFromParcel(Uri.java:1681) at android.content.IContentService$Stub.onTransact(IContentService.java:53) at android.content.ContentService.onTransact(ContentService.java:120) at android.os.Binder.execTransact(Binder.java:338) at dalvik.system.NativeStart.run(Native Method) - StrictMode can try to access the first index in the stack crawl of a stack crawl array of length 0. Not sure why this happens, but make the code more robust: java.lang.ArrayIndexOutOfBoundsException: length=0; index=0 at android.app.ApplicationErrorReport$CrashInfo.<init>(ApplicationErrorReport.java:341) at android.os.StrictMode$ViolationInfo.<init>(StrictMode.java:1978) at android.os.StrictMode$AndroidBlockGuardPolicy.startHandlingViolationException(StrictMode.java:1097) at android.os.StrictMode$AndroidBlockGuardPolicy.onReadFromDisk(StrictMode.java:1068) at libcore.io.BlockGuardOs.read(BlockGuardOs.java:137) at libcore.io.IoBridge.read(IoBridge.java:426) at java.io.FileInputStream.read(FileInputStream.java:179) at java.io.InputStream.read(InputStream.java:148) at com.android.internal.os.ProcessStats.readFile(ProcessStats.java:804) at com.android.internal.os.ProcessStats.getCpuSpeedTimes(ProcessStats.java:564) at com.android.internal.os.ProcessStats.getLastCpuSpeedTimes(ProcessStats.java:545) at com.android.server.am.ActivityManagerService.updateCpuStatsNow(ActivityManagerService.java:1470) at com.android.server.am.ActivityManagerService.batteryNeedsCpuUpdate(ActivityManagerService.java:1522) at com.android.internal.os.BatteryStatsImpl$MyHandler.handleMessage(BatteryStatsImpl.java:110) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loop(Looper.java:137) at com.android.server.am.ActivityManagerService$AThread.run(ActivityManagerService.java:1302) (Also fix this code to not cause strict mode to trigger at all, because there is no need, because this is just reading stuff from /proc.) - The system seems to crash during boot if it thinks it needs to rotate the screen, when it is trying to take the freeze snapshot way too early. There is no need to freeze the screen during boot or if the screen is off: java.lang.NullPointerException at android.view.Surface.init(Native Method) at android.view.Surface.<init>(Surface.java:256) at com.android.server.wm.ScreenRotationAnimation.<init>(ScreenRotationAnimation.java:91) at com.android.server.wm.WindowManagerService.startFreezingDisplayLocked(WindowManagerService.java:8758) at com.android.server.wm.WindowManagerService.startAppFreezingScreenLocked(WindowManagerService.java:3971) at com.android.server.wm.WindowManagerService.startAppFreezingScreen(WindowManagerService.java:4003) at com.android.server.am.ActivityRecord.startFreezingScreenLocked(ActivityRecord.java:515) at com.android.server.am.ActivityStack.ensureActivityConfigurationLocked(ActivityStack.java:3997) at com.android.server.am.ActivityManagerService.updateConfigurationLocked(ActivityManagerService.java:12535) at com.android.server.am.ActivityManagerService.updateConfiguration(ActivityManagerService.java:12439) at com.android.server.wm.WindowManagerService.systemReady(WindowManagerService.java:6161) at com.android.server.ServerThread.run(SystemServer.java:521) Change-Id: I85062bb5f6b0909a0f52feedaa75e7611d9d7fbd
Diffstat (limited to 'core/java/android/app')
-rw-r--r--core/java/android/app/ApplicationErrorReport.java23
1 files changed, 17 insertions, 6 deletions
diff --git a/core/java/android/app/ApplicationErrorReport.java b/core/java/android/app/ApplicationErrorReport.java
index 6524c9a..588125d 100644
--- a/core/java/android/app/ApplicationErrorReport.java
+++ b/core/java/android/app/ApplicationErrorReport.java
@@ -332,20 +332,31 @@ public class ApplicationErrorReport implements Parcelable {
exceptionMessage = tr.getMessage();
// Populate fields with the "root cause" exception
+ Throwable rootTr = tr;
while (tr.getCause() != null) {
tr = tr.getCause();
+ if (tr.getStackTrace() != null && tr.getStackTrace().length > 0) {
+ rootTr = tr;
+ }
String msg = tr.getMessage();
if (msg != null && msg.length() > 0) {
exceptionMessage = msg;
}
}
- exceptionClassName = tr.getClass().getName();
- StackTraceElement trace = tr.getStackTrace()[0];
- throwFileName = trace.getFileName();
- throwClassName = trace.getClassName();
- throwMethodName = trace.getMethodName();
- throwLineNumber = trace.getLineNumber();
+ exceptionClassName = rootTr.getClass().getName();
+ if (rootTr.getStackTrace().length > 0) {
+ StackTraceElement trace = rootTr.getStackTrace()[0];
+ throwFileName = trace.getFileName();
+ throwClassName = trace.getClassName();
+ throwMethodName = trace.getMethodName();
+ throwLineNumber = trace.getLineNumber();
+ } else {
+ throwFileName = "unknown";
+ throwClassName = "unknown";
+ throwMethodName = "unknown";
+ throwLineNumber = 0;
+ }
}
/**