summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--api/current.txt6
-rw-r--r--api/system-current.txt6
-rw-r--r--core/java/com/android/server/BootReceiver.java4
-rw-r--r--media/java/android/media/MediaCodec.java33
-rw-r--r--media/jni/android_media_MediaCodec.cpp39
-rw-r--r--services/core/java/com/android/server/am/ActivityManagerService.java17
6 files changed, 54 insertions, 51 deletions
diff --git a/api/current.txt b/api/current.txt
index b89edcf..3dc5901 100644
--- a/api/current.txt
+++ b/api/current.txt
@@ -15415,11 +15415,11 @@ package android.media {
public static final class MediaCodec.CodecException extends java.lang.IllegalStateException {
method public java.lang.String getDiagnosticInfo();
- method public int getReason();
+ method public int getErrorCode();
method public boolean isRecoverable();
method public boolean isTransient();
- field public static final int REASON_HARDWARE = 0; // 0x0
- field public static final int REASON_RECLAIMED = 1; // 0x1
+ field public static final int ERROR_INSUFFICIENT_RESOURCE = 1100; // 0x44c
+ field public static final int ERROR_RECLAIMED = 1101; // 0x44d
}
public static final class MediaCodec.CryptoException extends java.lang.RuntimeException {
diff --git a/api/system-current.txt b/api/system-current.txt
index 1bf273a..d807563 100644
--- a/api/system-current.txt
+++ b/api/system-current.txt
@@ -16637,11 +16637,11 @@ package android.media {
public static final class MediaCodec.CodecException extends java.lang.IllegalStateException {
method public java.lang.String getDiagnosticInfo();
- method public int getReason();
+ method public int getErrorCode();
method public boolean isRecoverable();
method public boolean isTransient();
- field public static final int REASON_HARDWARE = 0; // 0x0
- field public static final int REASON_RECLAIMED = 1; // 0x1
+ field public static final int ERROR_INSUFFICIENT_RESOURCE = 1100; // 0x44c
+ field public static final int ERROR_RECLAIMED = 1101; // 0x44d
}
public static final class MediaCodec.CryptoException extends java.lang.RuntimeException {
diff --git a/core/java/com/android/server/BootReceiver.java b/core/java/com/android/server/BootReceiver.java
index 155f5d3..92d5aea 100644
--- a/core/java/com/android/server/BootReceiver.java
+++ b/core/java/com/android/server/BootReceiver.java
@@ -144,10 +144,6 @@ public class BootReceiver extends BroadcastReceiver {
-LOG_SIZE, "SYSTEM_RECOVERY_LOG");
addFileToDropBox(db, prefs, headers, "/cache/recovery/last_kmsg",
-LOG_SIZE, "SYSTEM_RECOVERY_KMSG");
- addFileToDropBox(db, prefs, headers, "/data/dontpanic/apanic_console",
- -LOG_SIZE, "APANIC_CONSOLE");
- addFileToDropBox(db, prefs, headers, "/data/dontpanic/apanic_threads",
- -LOG_SIZE, "APANIC_THREADS");
addAuditErrorsToDropBox(db, prefs, headers, -LOG_SIZE, "SYSTEM_AUDIT");
addFsckErrorsToDropBox(db, prefs, headers, -LOG_SIZE, "SYSTEM_FSCK");
} else {
diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java
index 6f7b583..72198b6 100644
--- a/media/java/android/media/MediaCodec.java
+++ b/media/java/android/media/MediaCodec.java
@@ -816,10 +816,9 @@ final public class MediaCodec {
* Thrown when an internal codec error occurs.
*/
public final static class CodecException extends IllegalStateException {
- CodecException(int errorCode, int actionCode, @Nullable String detailMessage, int reason) {
+ CodecException(int errorCode, int actionCode, @Nullable String detailMessage) {
super(detailMessage);
mErrorCode = errorCode;
- mReason = reason;
mActionCode = actionCode;
// TODO get this from codec
@@ -847,21 +846,7 @@ final public class MediaCodec {
}
/**
- * Retrieve the reason associated with a CodecException.
- * The reason could be one of {@link #REASON_HARDWARE} or {@link #REASON_RECLAIMED}.
- *
- */
- @ReasonCode
- public int getReason() {
- return mReason;
- }
-
- /**
- * Retrieve the error code associated with a CodecException.
- * This is opaque diagnostic information and may depend on
- * hardware or API level.
- *
- * @hide
+ * Retrieve the error code associated with a CodecException
*/
public int getErrorCode() {
return mErrorCode;
@@ -878,22 +863,21 @@ final public class MediaCodec {
}
/**
- * This indicates the exception is caused by the hardware.
+ * This indicates required resource was not able to be allocated.
*/
- public static final int REASON_HARDWARE = 0;
+ public static final int ERROR_INSUFFICIENT_RESOURCE = 1100;
/**
- * This indicates the exception is because the resource manager reclaimed
- * the media resource used by the codec.
+ * This indicates the resource manager reclaimed the media resource used by the codec.
* <p>
* With this exception, the codec must be released, as it has moved to terminal state.
*/
- public static final int REASON_RECLAIMED = 1;
+ public static final int ERROR_RECLAIMED = 1101;
/** @hide */
@IntDef({
- REASON_HARDWARE,
- REASON_RECLAIMED,
+ ERROR_INSUFFICIENT_RESOURCE,
+ ERROR_RECLAIMED,
})
@Retention(RetentionPolicy.SOURCE)
public @interface ReasonCode {}
@@ -904,7 +888,6 @@ final public class MediaCodec {
private final String mDiagnosticInfo;
private final int mErrorCode;
- private final int mReason;
private final int mActionCode;
}
diff --git a/media/jni/android_media_MediaCodec.cpp b/media/jni/android_media_MediaCodec.cpp
index f808c0d..31fb37c 100644
--- a/media/jni/android_media_MediaCodec.cpp
+++ b/media/jni/android_media_MediaCodec.cpp
@@ -70,10 +70,10 @@ static struct CodecActionCodes {
jint codecActionRecoverable;
} gCodecActionCodes;
-static struct ExceptionReason {
- jint reasonHardware;
- jint reasonReclaimed;
-} gExceptionReason;
+static struct CodecErrorCodes {
+ jint errorInsufficientResource;
+ jint errorReclaimed;
+} gCodecErrorCodes;
static struct {
jclass clazz;
@@ -600,7 +600,7 @@ static jthrowable createCodecException(
env, env->FindClass("android/media/MediaCodec$CodecException"));
CHECK(clazz.get() != NULL);
- const jmethodID ctor = env->GetMethodID(clazz.get(), "<init>", "(IILjava/lang/String;I)V");
+ const jmethodID ctor = env->GetMethodID(clazz.get(), "<init>", "(IILjava/lang/String;)V");
CHECK(ctor != NULL);
ScopedLocalRef<jstring> msgObj(
@@ -619,9 +619,19 @@ static jthrowable createCodecException(
break;
}
- int reason =
- (err == DEAD_OBJECT) ? gExceptionReason.reasonReclaimed : gExceptionReason.reasonHardware;
- return (jthrowable)env->NewObject(clazz.get(), ctor, err, actionCode, msgObj.get(), reason);
+ /* translate OS errors to Java API CodecException errorCodes */
+ switch (err) {
+ case NO_MEMORY:
+ err = gCodecErrorCodes.errorInsufficientResource;
+ break;
+ case DEAD_OBJECT:
+ err = gCodecErrorCodes.errorReclaimed;
+ break;
+ default: /* Other error codes go out as is. */
+ break;
+ }
+
+ return (jthrowable)env->NewObject(clazz.get(), ctor, err, actionCode, msgObj.get());
}
void JMediaCodec::handleCallback(const sp<AMessage> &msg) {
@@ -1636,14 +1646,14 @@ static void android_media_MediaCodec_native_init(JNIEnv *env) {
gCodecActionCodes.codecActionRecoverable =
env->GetStaticIntField(clazz.get(), field);
- field = env->GetStaticFieldID(clazz.get(), "REASON_HARDWARE", "I");
+ field = env->GetStaticFieldID(clazz.get(), "ERROR_INSUFFICIENT_RESOURCE", "I");
CHECK(field != NULL);
- gExceptionReason.reasonHardware =
+ gCodecErrorCodes.errorInsufficientResource =
env->GetStaticIntField(clazz.get(), field);
- field = env->GetStaticFieldID(clazz.get(), "REASON_RECLAIMED", "I");
+ field = env->GetStaticFieldID(clazz.get(), "ERROR_RECLAIMED", "I");
CHECK(field != NULL);
- gExceptionReason.reasonReclaimed =
+ gCodecErrorCodes.errorReclaimed =
env->GetStaticIntField(clazz.get(), field);
clazz.reset(env->FindClass("android/view/Surface"));
@@ -1693,6 +1703,11 @@ static void android_media_MediaCodec_native_setup(
String8::format("Failed to initialize %s, error %#x", tmp, err));
env->ReleaseStringUTFChars(name, tmp);
return;
+ } if (err == NO_MEMORY) {
+ throwCodecException(env, err, ACTION_CODE_TRANSIENT,
+ String8::format("Failed to initialize %s, error %#x", tmp, err));
+ env->ReleaseStringUTFChars(name, tmp);
+ return;
} else if (err != OK) {
// believed possible to try again
jniThrowException(env, "java/io/IOException",
diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java
index f25f588..ab7fba5 100644
--- a/services/core/java/com/android/server/am/ActivityManagerService.java
+++ b/services/core/java/com/android/server/am/ActivityManagerService.java
@@ -375,6 +375,10 @@ public final class ActivityManagerService extends ActivityManagerNative
// Delay in notifying task stack change listeners (in millis)
static final int NOTIFY_TASK_STACK_CHANGE_LISTENERS_DELAY = 1000;
+ // Necessary ApplicationInfo flags to mark an app as persistent
+ private static final int PERSISTENT_MASK =
+ ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT;
+
/** All system services */
SystemServiceManager mSystemServiceManager;
@@ -9843,10 +9847,10 @@ public final class ActivityManagerService extends ActivityManagerNative
String proc = customProcess != null ? customProcess : info.processName;
BatteryStatsImpl.Uid.Proc ps = null;
BatteryStatsImpl stats = mBatteryStatsService.getActiveStatistics();
+ final int userId = UserHandle.getUserId(info.uid);
int uid = info.uid;
if (isolated) {
if (isolatedUid == 0) {
- int userId = UserHandle.getUserId(uid);
int stepsLeft = Process.LAST_ISOLATED_UID - Process.FIRST_ISOLATED_UID + 1;
while (true) {
if (mNextIsolatedProcessUid < Process.FIRST_ISOLATED_UID
@@ -9870,7 +9874,13 @@ public final class ActivityManagerService extends ActivityManagerNative
uid = isolatedUid;
}
}
- return new ProcessRecord(stats, info, proc, uid);
+ final ProcessRecord r = new ProcessRecord(stats, info, proc, uid);
+ if (!mBooted && !mBooting
+ && userId == UserHandle.USER_OWNER
+ && (info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) {
+ r.persistent = true;
+ }
+ return r;
}
final ProcessRecord addAppLocked(ApplicationInfo info, boolean isolated,
@@ -9902,8 +9912,7 @@ public final class ActivityManagerService extends ActivityManagerNative
+ info.packageName + ": " + e);
}
- if ((info.flags&(ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT))
- == (ApplicationInfo.FLAG_SYSTEM|ApplicationInfo.FLAG_PERSISTENT)) {
+ if ((info.flags & PERSISTENT_MASK) == PERSISTENT_MASK) {
app.persistent = true;
app.maxAdj = ProcessList.PERSISTENT_PROC_ADJ;
}