diff options
-rw-r--r-- | api/current.txt | 6 | ||||
-rw-r--r-- | api/system-current.txt | 6 | ||||
-rw-r--r-- | core/java/com/android/server/BootReceiver.java | 4 | ||||
-rw-r--r-- | media/java/android/media/MediaCodec.java | 33 | ||||
-rw-r--r-- | media/jni/android_media_MediaCodec.cpp | 39 | ||||
-rw-r--r-- | services/core/java/com/android/server/am/ActivityManagerService.java | 17 |
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; } |