diff options
-rw-r--r-- | core/java/android/app/ActivityManagerNative.java | 7 | ||||
-rw-r--r-- | core/java/android/app/ActivityThread.java | 6 | ||||
-rw-r--r-- | core/java/android/app/IActivityManager.java | 3 | ||||
-rw-r--r-- | core/java/android/app/LoadedApk.java | 6 | ||||
-rw-r--r-- | core/java/android/app/SearchManager.java | 9 | ||||
-rw-r--r-- | core/java/android/content/BroadcastReceiver.java | 10 | ||||
-rw-r--r-- | core/java/android/hardware/camera2/CameraDevice.java | 2 | ||||
-rw-r--r-- | core/java/android/util/NtpTrustedTime.java | 3 | ||||
-rw-r--r-- | core/jni/AndroidRuntime.cpp | 8 | ||||
-rw-r--r-- | core/jni/android/graphics/BitmapFactory.cpp | 15 | ||||
-rw-r--r-- | core/tests/coretests/src/android/net/http/HttpResponseCacheTest.java | 6 | ||||
-rw-r--r-- | media/java/android/media/Image.java | 6 | ||||
-rw-r--r-- | media/java/android/media/MediaCodec.java | 18 | ||||
-rw-r--r-- | services/core/java/com/android/server/MountService.java | 7 | ||||
-rwxr-xr-x | services/core/java/com/android/server/am/ActiveServices.java | 1 | ||||
-rw-r--r--[-rwxr-xr-x] | services/core/java/com/android/server/am/ActivityManagerService.java | 38 | ||||
-rw-r--r-- | tools/aapt/Main.cpp | 2 |
17 files changed, 80 insertions, 67 deletions
diff --git a/core/java/android/app/ActivityManagerNative.java b/core/java/android/app/ActivityManagerNative.java index 4e2ff0bdb54f..20355ec9ca0d 100644 --- a/core/java/android/app/ActivityManagerNative.java +++ b/core/java/android/app/ActivityManagerNative.java @@ -466,8 +466,9 @@ public abstract class ActivityManagerNative extends Binder implements IActivityM String resultData = data.readString(); Bundle resultExtras = data.readBundle(); boolean resultAbort = data.readInt() != 0; + int intentFlags = data.readInt(); if (who != null) { - finishReceiver(who, resultCode, resultData, resultExtras, resultAbort); + finishReceiver(who, resultCode, resultData, resultExtras, resultAbort, intentFlags); } reply.writeNoException(); return true; @@ -2807,7 +2808,8 @@ class ActivityManagerProxy implements IActivityManager data.recycle(); reply.recycle(); } - public void finishReceiver(IBinder who, int resultCode, String resultData, Bundle map, boolean abortBroadcast) throws RemoteException + public void finishReceiver(IBinder who, int resultCode, String resultData, Bundle map, + boolean abortBroadcast, int flags) throws RemoteException { Parcel data = Parcel.obtain(); Parcel reply = Parcel.obtain(); @@ -2817,6 +2819,7 @@ class ActivityManagerProxy implements IActivityManager data.writeString(resultData); data.writeBundle(map); data.writeInt(abortBroadcast ? 1 : 0); + data.writeInt(flags); mRemote.transact(FINISH_RECEIVER_TRANSACTION, data, reply, IBinder.FLAG_ONEWAY); reply.readException(); data.recycle(); diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java index 62336762816a..f15a1e0750c8 100644 --- a/core/java/android/app/ActivityThread.java +++ b/core/java/android/app/ActivityThread.java @@ -359,7 +359,7 @@ public final class ActivityThread { public ReceiverData(Intent intent, int resultCode, String resultData, Bundle resultExtras, boolean ordered, boolean sticky, IBinder token, int sendingUser) { super(resultCode, resultData, resultExtras, TYPE_COMPONENT, ordered, sticky, - token, sendingUser); + token, sendingUser, intent.getFlags()); this.intent = intent; } @@ -4481,6 +4481,10 @@ public final class ActivityThread { if ((data.appInfo.flags&ApplicationInfo.FLAG_LARGE_HEAP) != 0) { dalvik.system.VMRuntime.getRuntime().clearGrowthLimit(); + } else { + // Small heap, clamp to the current growth limit and let the heap release + // pages after the growth limit to the non growth limit capacity. b/18387825 + dalvik.system.VMRuntime.getRuntime().clampGrowthLimit(); } // Allow disk access during application and provider setup. This could diff --git a/core/java/android/app/IActivityManager.java b/core/java/android/app/IActivityManager.java index be26f3033459..d1279ad716ca 100644 --- a/core/java/android/app/IActivityManager.java +++ b/core/java/android/app/IActivityManager.java @@ -106,7 +106,8 @@ public interface IActivityManager extends IInterface { String resultData, Bundle map, String requiredPermission, int appOp, boolean serialized, boolean sticky, int userId) throws RemoteException; public void unbroadcastIntent(IApplicationThread caller, Intent intent, int userId) throws RemoteException; - public void finishReceiver(IBinder who, int resultCode, String resultData, Bundle map, boolean abortBroadcast) throws RemoteException; + public void finishReceiver(IBinder who, int resultCode, String resultData, Bundle map, + boolean abortBroadcast, int flags) throws RemoteException; public void attachApplication(IApplicationThread app) throws RemoteException; public void activityResumed(IBinder token) throws RemoteException; public void activityIdle(IBinder token, Configuration config, diff --git a/core/java/android/app/LoadedApk.java b/core/java/android/app/LoadedApk.java index aa98e973855c..973196c1f3f8 100644 --- a/core/java/android/app/LoadedApk.java +++ b/core/java/android/app/LoadedApk.java @@ -796,7 +796,7 @@ public final class LoadedApk { if (extras != null) { extras.setAllowFds(false); } - mgr.finishReceiver(this, resultCode, data, extras, false); + mgr.finishReceiver(this, resultCode, data, extras, false, intent.getFlags()); } catch (RemoteException e) { Slog.w(ActivityThread.TAG, "Couldn't finish broadcast to unregistered receiver"); } @@ -821,8 +821,8 @@ public final class LoadedApk { public Args(Intent intent, int resultCode, String resultData, Bundle resultExtras, boolean ordered, boolean sticky, int sendingUser) { super(resultCode, resultData, resultExtras, - mRegistered ? TYPE_REGISTERED : TYPE_UNREGISTERED, - ordered, sticky, mIIntentReceiver.asBinder(), sendingUser); + mRegistered ? TYPE_REGISTERED : TYPE_UNREGISTERED, ordered, + sticky, mIIntentReceiver.asBinder(), sendingUser, intent.getFlags()); mCurIntent = intent; mOrdered = ordered; } diff --git a/core/java/android/app/SearchManager.java b/core/java/android/app/SearchManager.java index a40b29a25d7d..d7c4467b3af1 100644 --- a/core/java/android/app/SearchManager.java +++ b/core/java/android/app/SearchManager.java @@ -540,11 +540,6 @@ public class SearchManager private final Context mContext; - /** - * The package associated with this seach manager. - */ - private String mAssociatedPackage; - // package private since they are used by the inner class SearchManagerCallback /* package */ final Handler mHandler; /* package */ OnDismissListener mDismissListener = null; @@ -742,10 +737,6 @@ public class SearchManager public void triggerSearch(String query, ComponentName launchActivity, Bundle appSearchData) { - if (!mAssociatedPackage.equals(launchActivity.getPackageName())) { - throw new IllegalArgumentException("invoking app search on a different package " + - "not associated with this search manager"); - } if (query == null || TextUtils.getTrimmedLength(query) == 0) { Log.w(TAG, "triggerSearch called with empty query, ignoring."); return; diff --git a/core/java/android/content/BroadcastReceiver.java b/core/java/android/content/BroadcastReceiver.java index 9a32fdffbb9c..af74e7314f6e 100644 --- a/core/java/android/content/BroadcastReceiver.java +++ b/core/java/android/content/BroadcastReceiver.java @@ -238,6 +238,7 @@ public abstract class BroadcastReceiver { final boolean mInitialStickyHint; final IBinder mToken; final int mSendingUser; + final int mFlags; int mResultCode; String mResultData; @@ -246,8 +247,8 @@ public abstract class BroadcastReceiver { boolean mFinished; /** @hide */ - public PendingResult(int resultCode, String resultData, Bundle resultExtras, - int type, boolean ordered, boolean sticky, IBinder token, int userId) { + public PendingResult(int resultCode, String resultData, Bundle resultExtras, int type, + boolean ordered, boolean sticky, IBinder token, int userId, int flags) { mResultCode = resultCode; mResultData = resultData; mResultExtras = resultExtras; @@ -256,6 +257,7 @@ public abstract class BroadcastReceiver { mInitialStickyHint = sticky; mToken = token; mSendingUser = userId; + mFlags = flags; } /** @@ -417,11 +419,11 @@ public abstract class BroadcastReceiver { } if (mOrderedHint) { am.finishReceiver(mToken, mResultCode, mResultData, mResultExtras, - mAbortBroadcast); + mAbortBroadcast, mFlags); } else { // This broadcast was sent to a component; it is not ordered, // but we still need to tell the activity manager we are done. - am.finishReceiver(mToken, 0, null, null, false); + am.finishReceiver(mToken, 0, null, null, false, mFlags); } } catch (RemoteException ex) { } diff --git a/core/java/android/hardware/camera2/CameraDevice.java b/core/java/android/hardware/camera2/CameraDevice.java index 0bb742c77f64..5cfa82126f47 100644 --- a/core/java/android/hardware/camera2/CameraDevice.java +++ b/core/java/android/hardware/camera2/CameraDevice.java @@ -183,7 +183,7 @@ public abstract class CameraDevice implements AutoCloseable { * Then obtain the Surface with * {@link android.renderscript.Allocation#getSurface}.</li> * - * <li>For access to raw, uncompressed JPEG data in the application: Create an + * <li>For access to RAW, uncompressed YUV, or compressed JPEG data in the application: Create an * {@link android.media.ImageReader} object with one of the supported output formats given by * {@link StreamConfigurationMap#getOutputFormats()}, setting its size to one of the * corresponding supported sizes by passing the chosen output format into diff --git a/core/java/android/util/NtpTrustedTime.java b/core/java/android/util/NtpTrustedTime.java index 602a68c81a69..b18cc3bbabee 100644 --- a/core/java/android/util/NtpTrustedTime.java +++ b/core/java/android/util/NtpTrustedTime.java @@ -22,6 +22,7 @@ import android.content.res.Resources; import android.net.SntpClient; import android.os.SystemClock; import android.provider.Settings; +import android.text.TextUtils; /** * {@link TrustedTime} that connects with a remote NTP server as its trusted @@ -73,7 +74,7 @@ public class NtpTrustedTime implements TrustedTime { @Override public boolean forceRefresh() { - if (mServer == null) { + if (TextUtils.isEmpty(mServer)) { // missing server, so no trusted time available return false; } diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index fb0d5d5be992..ce7f0d583000 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -696,6 +696,14 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv) if (skip_compilation) { addOption("-Xcompiler-option"); addOption("--compiler-filter=verify-none"); + + // We skip compilation when a minimal runtime is brought up for decryption. In that case + // /data is temporarily backed by a tmpfs, which is usually small. + // If the system image contains prebuilts, they will be relocated into the tmpfs. In this + // specific situation it is acceptable to *not* relocate and run out of the prebuilts + // directly instead. + addOption("--runtime-arg"); + addOption("-Xnorelocate"); } else { parseCompilerOption("dalvik.vm.dex2oat-filter", dex2oatCompilerFilterBuf, "--compiler-filter=", "-Xcompiler-option"); diff --git a/core/jni/android/graphics/BitmapFactory.cpp b/core/jni/android/graphics/BitmapFactory.cpp index 0a95b44a8acb..592559a454cb 100644 --- a/core/jni/android/graphics/BitmapFactory.cpp +++ b/core/jni/android/graphics/BitmapFactory.cpp @@ -63,7 +63,7 @@ jstring getMimeTypeString(JNIEnv* env, SkImageDecoder::Format format) { { SkImageDecoder::kWBMP_Format, "image/vnd.wap.wbmp" } }; - const char* cstr = NULL; + const char* cstr = nullptr; for (size_t i = 0; i < SK_ARRAY_COUNT(gMimeTypes); i++) { if (gMimeTypes[i].fFormat == format) { cstr = gMimeTypes[i].fMimeType; @@ -71,8 +71,10 @@ jstring getMimeTypeString(JNIEnv* env, SkImageDecoder::Format format) { } } - jstring jstr = 0; - if (NULL != cstr) { + jstring jstr = nullptr; + if (cstr != nullptr) { + // NOTE: Caller should env->ExceptionCheck() for OOM + // (can't check for nullptr as it's a valid return value) jstr = env->NewStringUTF(cstr); } return jstr; @@ -323,10 +325,13 @@ static jobject doDecode(JNIEnv* env, SkStreamRewindable* stream, jobject padding // update options (if any) if (options != NULL) { + jstring mimeType = getMimeTypeString(env, decoder->getFormat()); + if (env->ExceptionCheck()) { + return nullObjectReturn("OOM in getMimeTypeString()"); + } env->SetIntField(options, gOptions_widthFieldID, scaledWidth); env->SetIntField(options, gOptions_heightFieldID, scaledHeight); - env->SetObjectField(options, gOptions_mimeFieldID, - getMimeTypeString(env, decoder->getFormat())); + env->SetObjectField(options, gOptions_mimeFieldID, mimeType); } // if we're in justBounds mode, return now (skip the java bitmap) diff --git a/core/tests/coretests/src/android/net/http/HttpResponseCacheTest.java b/core/tests/coretests/src/android/net/http/HttpResponseCacheTest.java index 9015a6f5d7e4..0421d44c0b0b 100644 --- a/core/tests/coretests/src/android/net/http/HttpResponseCacheTest.java +++ b/core/tests/coretests/src/android/net/http/HttpResponseCacheTest.java @@ -19,6 +19,7 @@ package android.net.http; import com.google.mockwebserver.MockResponse; import com.google.mockwebserver.MockWebServer; import java.io.File; +import java.io.InputStream; import java.net.CacheRequest; import java.net.CacheResponse; import java.net.ResponseCache; @@ -118,7 +119,10 @@ public final class HttpResponseCacheTest extends TestCase { server.play(); URLConnection c1 = server.getUrl("/").openConnection(); - assertEquals('A', c1.getInputStream().read()); + InputStream inputStream1 = c1.getInputStream(); + assertEquals('A', inputStream1.read()); + inputStream1.close(); + assertEquals(1, cache.getRequestCount()); assertEquals(1, cache.getNetworkCount()); assertEquals(0, cache.getHitCount()); diff --git a/media/java/android/media/Image.java b/media/java/android/media/Image.java index 522e45d3b411..0d6b91a7046a 100644 --- a/media/java/android/media/Image.java +++ b/media/java/android/media/Image.java @@ -146,8 +146,10 @@ public abstract class Image implements AutoCloseable { * using coordinates in the largest-resolution plane. */ public void setCropRect(Rect cropRect) { - cropRect = new Rect(cropRect); // make a copy - cropRect.intersect(0, 0, getWidth(), getHeight()); + if (cropRect != null) { + cropRect = new Rect(cropRect); // make a copy + cropRect.intersect(0, 0, getWidth(), getHeight()); + } mCropRect = cropRect; } diff --git a/media/java/android/media/MediaCodec.java b/media/java/android/media/MediaCodec.java index 420510a93369..8985b52ab44e 100644 --- a/media/java/android/media/MediaCodec.java +++ b/media/java/android/media/MediaCodec.java @@ -1778,21 +1778,17 @@ final public class MediaCodec { mIsValid = true; mIsReadOnly = buffer.isReadOnly(); mBuffer = buffer.duplicate(); - if (cropRect != null) { - cropRect.offset(-xOffset, -yOffset); - } - super.setCropRect(cropRect); // save offsets and info mXOffset = xOffset; mYOffset = yOffset; mInfo = info; - // read media-info. the size of media info can be 80 or 156 depending on + // read media-info. the size of media info can be 80 or 156/160 depending on // whether it was created on a 32- or 64-bit process. See MediaImage - if (info.remaining() == 80 || info.remaining() == 156) { - boolean sizeIsLong = info.remaining() == 156; - int type = info.getInt(); + if (info.remaining() == 80 || info.remaining() == 156 || info.remaining() == 160) { + boolean sizeIsLong = info.remaining() != 80; + int type = readInt(info, info.remaining() == 160); if (type != TYPE_YUV) { throw new UnsupportedOperationException("unsupported type: " + type); } @@ -1833,6 +1829,12 @@ final public class MediaCodec { throw new UnsupportedOperationException( "unsupported info length: " + info.remaining()); } + + if (cropRect == null) { + cropRect = new Rect(0, 0, mWidth, mHeight); + } + cropRect.offset(-xOffset, -yOffset); + super.setCropRect(cropRect); } private class MediaPlane extends Plane { diff --git a/services/core/java/com/android/server/MountService.java b/services/core/java/com/android/server/MountService.java index 59570bf7eada..79cd867416ff 100644 --- a/services/core/java/com/android/server/MountService.java +++ b/services/core/java/com/android/server/MountService.java @@ -2371,9 +2371,16 @@ class MountService extends IMountService.Stub final NativeDaemonEvent event; try { event = mConnector.execute("cryptfs", "getpw"); + if ("-1".equals(event.getMessage())) { + // -1 equals no password + return null; + } return fromHex(event.getMessage()); } catch (NativeDaemonConnectorException e) { throw e.rethrowAsParcelableException(); + } catch (IllegalArgumentException e) { + Slog.e(TAG, "Invalid response to getPassword"); + return null; } } diff --git a/services/core/java/com/android/server/am/ActiveServices.java b/services/core/java/com/android/server/am/ActiveServices.java index f02a815833ca..05403261c31e 100755 --- a/services/core/java/com/android/server/am/ActiveServices.java +++ b/services/core/java/com/android/server/am/ActiveServices.java @@ -1322,6 +1322,7 @@ public final class ActiveServices { // We are now bringing the service up, so no longer in the // restarting state. if (mRestartingServices.remove(r)) { + r.resetRestartCounter(); clearRestartingIfNeededLocked(r); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index e3f7fb3c9120..138bedc6e056 100755..100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -399,16 +399,6 @@ public final class ActivityManagerService extends ActivityManagerNative return (isFg) ? mFgBroadcastQueue : mBgBroadcastQueue; } - BroadcastRecord broadcastRecordForReceiverLocked(IBinder receiver) { - for (BroadcastQueue queue : mBroadcastQueues) { - BroadcastRecord r = queue.getMatchingOrderedReceiver(receiver); - if (r != null) { - return r; - } - } - return null; - } - /** * Activity we have told the window manager to have key focus. */ @@ -6018,6 +6008,7 @@ public final class ActivityManagerService extends ActivityManagerNative // Take care of any services that are waiting for the process. mServices.processStartTimedOutLocked(app); app.kill("start timeout", true); + removeLruProcessLocked(app); if (mBackupTarget != null && mBackupTarget.app.pid == pid) { Slog.w(TAG, "Unattached app died before backup, skipping"); try { @@ -15313,11 +15304,11 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized(this) { ReceiverList rl = mRegisteredReceivers.get(receiver.asBinder()); if (rl != null) { - if (rl.curBroadcast != null) { - BroadcastRecord r = rl.curBroadcast; - final boolean doNext = finishReceiverLocked( - receiver.asBinder(), r.resultCode, r.resultData, - r.resultExtras, r.resultAbort); + final BroadcastRecord r = rl.curBroadcast; + if (r != null && r == r.queue.getMatchingOrderedReceiver(r)) { + final boolean doNext = r.queue.finishReceiverLocked( + r, r.resultCode, r.resultData, r.resultExtras, + r.resultAbort, false); if (doNext) { doTrim = true; r.queue.processNextBroadcast(false); @@ -15990,17 +15981,6 @@ public final class ActivityManagerService extends ActivityManagerNative } } - private final boolean finishReceiverLocked(IBinder receiver, int resultCode, - String resultData, Bundle resultExtras, boolean resultAbort) { - final BroadcastRecord r = broadcastRecordForReceiverLocked(receiver); - if (r == null) { - Slog.w(TAG, "finishReceiver called but not found on queue"); - return false; - } - - return r.queue.finishReceiverLocked(r, resultCode, resultData, resultExtras, resultAbort, false); - } - void backgroundServicesFinishedLocked(int userId) { for (BroadcastQueue queue : mBroadcastQueues) { queue.backgroundServicesFinishedLocked(userId); @@ -16008,7 +15988,7 @@ public final class ActivityManagerService extends ActivityManagerNative } public void finishReceiver(IBinder who, int resultCode, String resultData, - Bundle resultExtras, boolean resultAbort) { + Bundle resultExtras, boolean resultAbort, int flags) { if (DEBUG_BROADCAST) Slog.v(TAG, "Finish receiver: " + who); // Refuse possible leaked file descriptors @@ -16022,7 +16002,9 @@ public final class ActivityManagerService extends ActivityManagerNative BroadcastRecord r; synchronized(this) { - r = broadcastRecordForReceiverLocked(who); + BroadcastQueue queue = (flags & Intent.FLAG_RECEIVER_FOREGROUND) != 0 + ? mFgBroadcastQueue : mBgBroadcastQueue; + r = queue.getMatchingOrderedReceiver(who); if (r != null) { doNext = r.queue.finishReceiverLocked(r, resultCode, resultData, resultExtras, resultAbort, true); diff --git a/tools/aapt/Main.cpp b/tools/aapt/Main.cpp index 2857b59034ed..4ce4b2c17834 100644 --- a/tools/aapt/Main.cpp +++ b/tools/aapt/Main.cpp @@ -69,7 +69,7 @@ void usage(void) " [-S resource-sources [-S resource-sources ...]] \\\n" " [-F apk-file] [-J R-file-dir] \\\n" " [--product product1,product2,...] \\\n" - " [-c CONFIGS] [--preferred-configurations CONFIGS] \\\n" + " [-c CONFIGS] [--preferred-density DENSITY] \\\n" " [--split CONFIGS [--split CONFIGS]] \\\n" " [--feature-of package [--feature-after package]] \\\n" " [raw-files-dir [raw-files-dir] ...] \\\n" |