diff options
32 files changed, 231 insertions, 88 deletions
diff --git a/api/current.txt b/api/current.txt index e48aad3cc49d..40fd30837fbb 100644 --- a/api/current.txt +++ b/api/current.txt @@ -36685,14 +36685,18 @@ package android.system { public final class StructStat { ctor public StructStat(long, long, int, long, int, int, long, long, long, long, long, long, long); + ctor public StructStat(long, long, int, long, int, int, long, long, android.system.StructTimespec, android.system.StructTimespec, android.system.StructTimespec, long, long); + field public final android.system.StructTimespec st_atim; field public final long st_atime; field public final long st_blksize; field public final long st_blocks; + field public final android.system.StructTimespec st_ctim; field public final long st_ctime; field public final long st_dev; field public final int st_gid; field public final long st_ino; field public final int st_mode; + field public final android.system.StructTimespec st_mtim; field public final long st_mtime; field public final long st_nlink; field public final long st_rdev; @@ -36715,6 +36719,13 @@ package android.system { field public final long f_namemax; } + public final class StructTimespec implements java.lang.Comparable { + ctor public StructTimespec(long, long); + method public int compareTo(android.system.StructTimespec); + field public final long tv_nsec; + field public final long tv_sec; + } + public final class StructUtsname { ctor public StructUtsname(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String); field public final java.lang.String machine; diff --git a/api/system-current.txt b/api/system-current.txt index ae772dd03f60..13e283c46761 100644 --- a/api/system-current.txt +++ b/api/system-current.txt @@ -39636,14 +39636,18 @@ package android.system { public final class StructStat { ctor public StructStat(long, long, int, long, int, int, long, long, long, long, long, long, long); + ctor public StructStat(long, long, int, long, int, int, long, long, android.system.StructTimespec, android.system.StructTimespec, android.system.StructTimespec, long, long); + field public final android.system.StructTimespec st_atim; field public final long st_atime; field public final long st_blksize; field public final long st_blocks; + field public final android.system.StructTimespec st_ctim; field public final long st_ctime; field public final long st_dev; field public final int st_gid; field public final long st_ino; field public final int st_mode; + field public final android.system.StructTimespec st_mtim; field public final long st_mtime; field public final long st_nlink; field public final long st_rdev; @@ -39666,6 +39670,13 @@ package android.system { field public final long f_namemax; } + public final class StructTimespec implements java.lang.Comparable { + ctor public StructTimespec(long, long); + method public int compareTo(android.system.StructTimespec); + field public final long tv_nsec; + field public final long tv_sec; + } + public final class StructUtsname { ctor public StructUtsname(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String); field public final java.lang.String machine; diff --git a/api/test-current.txt b/api/test-current.txt index 63322af883c7..9d23dc83ec66 100644 --- a/api/test-current.txt +++ b/api/test-current.txt @@ -36768,14 +36768,18 @@ package android.system { public final class StructStat { ctor public StructStat(long, long, int, long, int, int, long, long, long, long, long, long, long); + ctor public StructStat(long, long, int, long, int, int, long, long, android.system.StructTimespec, android.system.StructTimespec, android.system.StructTimespec, long, long); + field public final android.system.StructTimespec st_atim; field public final long st_atime; field public final long st_blksize; field public final long st_blocks; + field public final android.system.StructTimespec st_ctim; field public final long st_ctime; field public final long st_dev; field public final int st_gid; field public final long st_ino; field public final int st_mode; + field public final android.system.StructTimespec st_mtim; field public final long st_mtime; field public final long st_nlink; field public final long st_rdev; @@ -36798,6 +36802,13 @@ package android.system { field public final long f_namemax; } + public final class StructTimespec implements java.lang.Comparable { + ctor public StructTimespec(long, long); + method public int compareTo(android.system.StructTimespec); + field public final long tv_nsec; + field public final long tv_sec; + } + public final class StructUtsname { ctor public StructUtsname(java.lang.String, java.lang.String, java.lang.String, java.lang.String, java.lang.String); field public final java.lang.String machine; diff --git a/core/java/android/app/timezone/Callback.java b/core/java/android/app/timezone/Callback.java index b51e5bad0f69..aea8038056ab 100644 --- a/core/java/android/app/timezone/Callback.java +++ b/core/java/android/app/timezone/Callback.java @@ -27,7 +27,6 @@ import java.lang.annotation.RetentionPolicy; * * @hide */ -// TODO(nfuller): Expose necessary APIs for OEMs with @SystemApi. http://b/31008728 public abstract class Callback { @Retention(RetentionPolicy.SOURCE) diff --git a/core/java/android/app/timezone/DistroFormatVersion.java b/core/java/android/app/timezone/DistroFormatVersion.java index e879e8f8adbc..be732e4c0188 100644 --- a/core/java/android/app/timezone/DistroFormatVersion.java +++ b/core/java/android/app/timezone/DistroFormatVersion.java @@ -35,7 +35,6 @@ import android.os.Parcelable; * * @hide */ -// TODO(nfuller): Expose necessary APIs for OEMs with @SystemApi. http://b/31008728 public final class DistroFormatVersion implements Parcelable { private final int mMajorVersion; diff --git a/core/java/android/app/timezone/DistroRulesVersion.java b/core/java/android/app/timezone/DistroRulesVersion.java index 1eb9f45f48f1..a680594657ae 100644 --- a/core/java/android/app/timezone/DistroRulesVersion.java +++ b/core/java/android/app/timezone/DistroRulesVersion.java @@ -36,7 +36,6 @@ import android.os.Parcelable; * * @hide */ -// TODO(nfuller): Expose necessary APIs for OEMs with @SystemApi. http://b/31008728 public final class DistroRulesVersion implements Parcelable { private final String mRulesVersion; diff --git a/core/java/android/app/timezone/RulesManager.java b/core/java/android/app/timezone/RulesManager.java index 649d894ca685..ad9b698a8fd7 100644 --- a/core/java/android/app/timezone/RulesManager.java +++ b/core/java/android/app/timezone/RulesManager.java @@ -64,7 +64,6 @@ import java.util.Arrays; * {@link Context#TIME_ZONE_RULES_MANAGER_SERVICE}. * @hide */ -// TODO(nfuller): Expose necessary APIs for OEMs with @SystemApi. http://b/31008728 public final class RulesManager { private static final String TAG = "timezone.RulesManager"; private static final boolean DEBUG = false; diff --git a/core/java/android/app/timezone/RulesState.java b/core/java/android/app/timezone/RulesState.java index 7d6ad2119fb7..ec247ebf502f 100644 --- a/core/java/android/app/timezone/RulesState.java +++ b/core/java/android/app/timezone/RulesState.java @@ -60,7 +60,6 @@ import java.lang.annotation.RetentionPolicy; * * @hide */ -// TODO(nfuller): Expose necessary APIs for OEMs with @SystemApi. http://b/31008728 public final class RulesState implements Parcelable { @Retention(RetentionPolicy.SOURCE) diff --git a/core/java/android/app/timezone/RulesUpdaterContract.java b/core/java/android/app/timezone/RulesUpdaterContract.java index 07b2f33ef5e0..9c62f46b6e36 100644 --- a/core/java/android/app/timezone/RulesUpdaterContract.java +++ b/core/java/android/app/timezone/RulesUpdaterContract.java @@ -27,7 +27,6 @@ import android.os.UserHandle; * * @hide */ -// TODO(nfuller): Expose necessary APIs for OEMs with @SystemApi. http://b/31008728 public final class RulesUpdaterContract { /** diff --git a/core/java/android/bluetooth/IBluetoothStateChangeCallback.aidl b/core/java/android/bluetooth/IBluetoothStateChangeCallback.aidl index feccdce57b98..0da4e8843282 100644 --- a/core/java/android/bluetooth/IBluetoothStateChangeCallback.aidl +++ b/core/java/android/bluetooth/IBluetoothStateChangeCallback.aidl @@ -21,7 +21,7 @@ package android.bluetooth; * * {@hide} */ -interface IBluetoothStateChangeCallback +oneway interface IBluetoothStateChangeCallback { void onBluetoothStateChange(boolean on); } diff --git a/core/java/android/os/Debug.java b/core/java/android/os/Debug.java index e05bd89079af..55b6dc817e5c 100644 --- a/core/java/android/os/Debug.java +++ b/core/java/android/os/Debug.java @@ -221,28 +221,69 @@ public final class Debug /** @hide */ public static final int OTHER_OTHER_MEMTRACK = 16; + // Needs to be declared here for the DVK_STAT ranges below. + /** @hide */ + public static final int NUM_OTHER_STATS = 17; + + // Dalvik subsections. /** @hide */ public static final int OTHER_DALVIK_NORMAL = 17; /** @hide */ public static final int OTHER_DALVIK_LARGE = 18; /** @hide */ - public static final int OTHER_DALVIK_LINEARALLOC = 19; + public static final int OTHER_DALVIK_ZYGOTE = 19; + /** @hide */ + public static final int OTHER_DALVIK_NON_MOVING = 20; + // Section begins and ends for dumpsys, relative to the DALVIK categories. + /** @hide */ + public static final int OTHER_DVK_STAT_DALVIK_START = + OTHER_DALVIK_NORMAL - NUM_OTHER_STATS; /** @hide */ - public static final int OTHER_DALVIK_ACCOUNTING = 20; + public static final int OTHER_DVK_STAT_DALVIK_END = + OTHER_DALVIK_NON_MOVING - NUM_OTHER_STATS; + + // Dalvik Other subsections. + /** @hide */ + public static final int OTHER_DALVIK_OTHER_LINEARALLOC = 21; + /** @hide */ + public static final int OTHER_DALVIK_OTHER_ACCOUNTING = 22; /** @hide */ - public static final int OTHER_DALVIK_CODE_CACHE = 21; + public static final int OTHER_DALVIK_OTHER_CODE_CACHE = 23; /** @hide */ - public static final int OTHER_DALVIK_ZYGOTE = 22; + public static final int OTHER_DALVIK_OTHER_COMPILER_METADATA = 24; /** @hide */ - public static final int OTHER_DALVIK_NON_MOVING = 23; + public static final int OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE = 25; /** @hide */ - public static final int OTHER_DALVIK_INDIRECT_REFERENCE_TABLE = 24; + public static final int OTHER_DVK_STAT_DALVIK_OTHER_START = + OTHER_DALVIK_OTHER_LINEARALLOC - NUM_OTHER_STATS; + /** @hide */ + public static final int OTHER_DVK_STAT_DALVIK_OTHER_END = + OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE - NUM_OTHER_STATS; + // Dex subsections (Boot vdex, App dex, and App vdex). /** @hide */ - public static final int NUM_OTHER_STATS = 17; + public static final int OTHER_DEX_BOOT_VDEX = 26; + /** @hide */ + public static final int OTHER_DEX_APP_DEX = 27; + /** @hide */ + public static final int OTHER_DEX_APP_VDEX = 28; + /** @hide */ + public static final int OTHER_DVK_STAT_DEX_START = OTHER_DEX_BOOT_VDEX - NUM_OTHER_STATS; + /** @hide */ + public static final int OTHER_DVK_STAT_DEX_END = OTHER_DEX_APP_VDEX - NUM_OTHER_STATS; + + // Art subsections (App image, boot image). + /** @hide */ + public static final int OTHER_ART_APP = 29; + /** @hide */ + public static final int OTHER_ART_BOOT = 30; + /** @hide */ + public static final int OTHER_DVK_STAT_ART_START = OTHER_ART_APP - NUM_OTHER_STATS; + /** @hide */ + public static final int OTHER_DVK_STAT_ART_END = OTHER_ART_BOOT - NUM_OTHER_STATS; /** @hide */ - public static final int NUM_DVK_STATS = 8; + public static final int NUM_DVK_STATS = 14; /** @hide */ public static final int NUM_CATEGORIES = 8; @@ -406,12 +447,18 @@ public final class Debug case OTHER_OTHER_MEMTRACK: return "Other mtrack"; case OTHER_DALVIK_NORMAL: return ".Heap"; case OTHER_DALVIK_LARGE: return ".LOS"; - case OTHER_DALVIK_LINEARALLOC: return ".LinearAlloc"; - case OTHER_DALVIK_ACCOUNTING: return ".GC"; - case OTHER_DALVIK_CODE_CACHE: return ".JITCache"; case OTHER_DALVIK_ZYGOTE: return ".Zygote"; case OTHER_DALVIK_NON_MOVING: return ".NonMoving"; - case OTHER_DALVIK_INDIRECT_REFERENCE_TABLE: return ".IndirectRef"; + case OTHER_DALVIK_OTHER_LINEARALLOC: return ".LinearAlloc"; + case OTHER_DALVIK_OTHER_ACCOUNTING: return ".GC"; + case OTHER_DALVIK_OTHER_CODE_CACHE: return ".JITCache"; + case OTHER_DALVIK_OTHER_COMPILER_METADATA: return ".CompilerMetadata"; + case OTHER_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE: return ".IndirectRef"; + case OTHER_DEX_BOOT_VDEX: return ".Boot vdex"; + case OTHER_DEX_APP_DEX: return ".App dex"; + case OTHER_DEX_APP_VDEX: return ".App vdex"; + case OTHER_ART_APP: return ".App art"; + case OTHER_ART_BOOT: return ".Boot art"; default: return "????"; } } diff --git a/core/java/android/provider/TimeZoneRulesDataContract.java b/core/java/android/provider/TimeZoneRulesDataContract.java index a60756312310..789638523905 100644 --- a/core/java/android/provider/TimeZoneRulesDataContract.java +++ b/core/java/android/provider/TimeZoneRulesDataContract.java @@ -24,7 +24,6 @@ import android.net.Uri; * * @hide */ -// TODO(nfuller): Expose necessary APIs for OEMs with @SystemApi. http://b/31008728 public final class TimeZoneRulesDataContract { private TimeZoneRulesDataContract() {} diff --git a/core/java/com/android/server/BootReceiver.java b/core/java/com/android/server/BootReceiver.java index 5a50fbfd5277..9151cee84986 100644 --- a/core/java/com/android/server/BootReceiver.java +++ b/core/java/com/android/server/BootReceiver.java @@ -195,6 +195,8 @@ public class BootReceiver extends BroadcastReceiver { "/proc/last_kmsg", -LOG_SIZE, "SYSTEM_LAST_KMSG"); addFileWithFootersToDropBox(db, timestamps, headers, lastKmsgFooter, "/sys/fs/pstore/console-ramoops", -LOG_SIZE, "SYSTEM_LAST_KMSG"); + addFileWithFootersToDropBox(db, timestamps, headers, lastKmsgFooter, + "/sys/fs/pstore/console-ramoops-0", -LOG_SIZE, "SYSTEM_LAST_KMSG"); addFileToDropBox(db, timestamps, headers, "/cache/recovery/log", -LOG_SIZE, "SYSTEM_RECOVERY_LOG"); addFileToDropBox(db, timestamps, headers, "/cache/recovery/last_kmsg", @@ -276,6 +278,10 @@ public class BootReceiver extends BroadcastReceiver { if (fileTime <= 0) { file = new File("/sys/fs/pstore/console-ramoops"); fileTime = file.lastModified(); + if (fileTime <= 0) { + file = new File("/sys/fs/pstore/console-ramoops-0"); + fileTime = file.lastModified(); + } } if (fileTime <= 0) return; // File does not exist diff --git a/core/jni/android_os_Debug.cpp b/core/jni/android_os_Debug.cpp index 821d0e515d09..120962390ef3 100644 --- a/core/jni/android_os_Debug.cpp +++ b/core/jni/android_os_Debug.cpp @@ -75,14 +75,27 @@ enum { HEAP_GL, HEAP_OTHER_MEMTRACK, + // Dalvik extra sections (heap). HEAP_DALVIK_NORMAL, HEAP_DALVIK_LARGE, - HEAP_DALVIK_LINEARALLOC, - HEAP_DALVIK_ACCOUNTING, - HEAP_DALVIK_CODE_CACHE, HEAP_DALVIK_ZYGOTE, HEAP_DALVIK_NON_MOVING, - HEAP_DALVIK_INDIRECT_REFERENCE_TABLE, + + // Dalvik other extra sections. + HEAP_DALVIK_OTHER_LINEARALLOC, + HEAP_DALVIK_OTHER_ACCOUNTING, + HEAP_DALVIK_OTHER_CODE_CACHE, + HEAP_DALVIK_OTHER_COMPILER_METADATA, + HEAP_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE, + + // Boot vdex / app dex / app vdex + HEAP_DEX_BOOT_VDEX, + HEAP_DEX_APP_DEX, + HEAP_DEX_APP_VDEX, + + // App art, boot art. + HEAP_ART_APP, + HEAP_ART_BOOT, _NUM_HEAP, _NUM_EXCLUSIVE_HEAP = HEAP_OTHER_MEMTRACK+1, @@ -297,15 +310,30 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss) whichHeap = HEAP_TTF; is_swappable = true; } else if ((nameLen > 4 && strstr(name, ".dex") != NULL) || - (nameLen > 5 && strcmp(name+nameLen-5, ".odex") == 0) || - (nameLen > 5 && strcmp(name+nameLen-5, ".vdex") == 0)) { + (nameLen > 5 && strcmp(name+nameLen-5, ".odex") == 0)) { whichHeap = HEAP_DEX; + subHeap = HEAP_DEX_APP_DEX; + is_swappable = true; + } else if (nameLen > 5 && strcmp(name+nameLen-5, ".vdex") == 0) { + whichHeap = HEAP_DEX; + // Handle system@framework@boot* and system/framework/boot* + if (strstr(name, "@boot") != NULL || strstr(name, "/boot") != NULL) { + subHeap = HEAP_DEX_BOOT_VDEX; + } else { + subHeap = HEAP_DEX_APP_VDEX; + } is_swappable = true; } else if (nameLen > 4 && strcmp(name+nameLen-4, ".oat") == 0) { whichHeap = HEAP_OAT; is_swappable = true; } else if (nameLen > 4 && strcmp(name+nameLen-4, ".art") == 0) { whichHeap = HEAP_ART; + // Handle system@framework@boot* and system/framework/boot* + if (strstr(name, "@boot") != NULL || strstr(name, "/boot") != NULL) { + subHeap = HEAP_ART_BOOT; + } else { + subHeap = HEAP_ART_APP; + } is_swappable = true; } else if (strncmp(name, "/dev/", 5) == 0) { if (strncmp(name, "/dev/kgsl-3d0", 13) == 0) { @@ -314,7 +342,7 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss) if (strncmp(name, "/dev/ashmem/dalvik-", 19) == 0) { whichHeap = HEAP_DALVIK_OTHER; if (strstr(name, "/dev/ashmem/dalvik-LinearAlloc") == name) { - subHeap = HEAP_DALVIK_LINEARALLOC; + subHeap = HEAP_DALVIK_OTHER_LINEARALLOC; } else if ((strstr(name, "/dev/ashmem/dalvik-alloc space") == name) || (strstr(name, "/dev/ashmem/dalvik-main space") == name)) { // This is the regular Dalvik heap. @@ -332,13 +360,14 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss) whichHeap = HEAP_DALVIK; subHeap = HEAP_DALVIK_ZYGOTE; } else if (strstr(name, "/dev/ashmem/dalvik-indirect ref") == name) { - subHeap = HEAP_DALVIK_INDIRECT_REFERENCE_TABLE; + subHeap = HEAP_DALVIK_OTHER_INDIRECT_REFERENCE_TABLE; } else if (strstr(name, "/dev/ashmem/dalvik-jit-code-cache") == name || - strstr(name, "/dev/ashmem/dalvik-data-code-cache") == name || - strstr(name, "/dev/ashmem/dalvik-CompilerMetadata") == name) { - subHeap = HEAP_DALVIK_CODE_CACHE; + strstr(name, "/dev/ashmem/dalvik-data-code-cache") == name) { + subHeap = HEAP_DALVIK_OTHER_CODE_CACHE; + } else if (strstr(name, "/dev/ashmem/dalvik-CompilerMetadata") == name) { + subHeap = HEAP_DALVIK_OTHER_COMPILER_METADATA; } else { - subHeap = HEAP_DALVIK_ACCOUNTING; // Default to accounting. + subHeap = HEAP_DALVIK_OTHER_ACCOUNTING; // Default to accounting. } } else if (strncmp(name, "/dev/ashmem/CursorWindow", 24) == 0) { whichHeap = HEAP_CURSOR; @@ -423,7 +452,8 @@ static void read_mapinfo(FILE *fp, stats_t* stats, bool* foundSwapPss) stats[whichHeap].sharedClean += shared_clean; stats[whichHeap].swappedOut += swapped_out; stats[whichHeap].swappedOutPss += swapped_out_pss; - if (whichHeap == HEAP_DALVIK || whichHeap == HEAP_DALVIK_OTHER) { + if (whichHeap == HEAP_DALVIK || whichHeap == HEAP_DALVIK_OTHER || + whichHeap == HEAP_DEX || whichHeap == HEAP_ART) { stats[subHeap].pss += pss; stats[subHeap].swappablePss += swappable_pss; stats[subHeap].privateDirty += private_dirty; diff --git a/core/jni/android_text_AndroidBidi.cpp b/core/jni/android_text_AndroidBidi.cpp index 2a3f0361a9cd..3b97a5e6442e 100644 --- a/core/jni/android_text_AndroidBidi.cpp +++ b/core/jni/android_text_AndroidBidi.cpp @@ -38,7 +38,7 @@ static jint runBidi(JNIEnv* env, jobject obj, jint dir, jcharArray chsArray, if (info != NULL) { UErrorCode status = U_ZERO_ERROR; UBiDi* bidi = ubidi_openSized(n, 0, &status); - ubidi_setPara(bidi, chs, n, dir, NULL, &status); + ubidi_setPara(bidi, reinterpret_cast<const UChar*>(chs), n, dir, NULL, &status); if (U_SUCCESS(status)) { for (int i = 0; i < n; ++i) { info[i] = ubidi_getLevelAt(bidi, i); diff --git a/core/jni/android_view_InputDevice.cpp b/core/jni/android_view_InputDevice.cpp index 9cf6a9d08890..4e6e512b69df 100644 --- a/core/jni/android_view_InputDevice.cpp +++ b/core/jni/android_view_InputDevice.cpp @@ -17,7 +17,7 @@ #include <input/Input.h> #include <android_runtime/AndroidRuntime.h> -#include <nativehelper/jni.h> +#include <jni.h> #include <nativehelper/JNIHelp.h> #include <ScopedLocalRef.h> diff --git a/core/jni/android_view_KeyCharacterMap.cpp b/core/jni/android_view_KeyCharacterMap.cpp index e5519a752c39..586b26ef328f 100644 --- a/core/jni/android_view_KeyCharacterMap.cpp +++ b/core/jni/android_view_KeyCharacterMap.cpp @@ -20,7 +20,7 @@ #include <input/Input.h> #include <binder/Parcel.h> -#include <nativehelper/jni.h> +#include <jni.h> #include <nativehelper/JNIHelp.h> #include "android_os_Parcel.h" diff --git a/core/jni/android_view_SurfaceControl.cpp b/core/jni/android_view_SurfaceControl.cpp index 73b3f52f078b..bc3593977a99 100644 --- a/core/jni/android_view_SurfaceControl.cpp +++ b/core/jni/android_view_SurfaceControl.cpp @@ -23,6 +23,7 @@ #include "android/graphics/Region.h" #include "core_jni_helpers.h" +#include <android-base/chrono_utils.h> #include <JNIHelp.h> #include <ScopedUtfChars.h> #include <android_runtime/android_view_Surface.h> @@ -495,8 +496,9 @@ static void nativeSetDisplayPowerMode(JNIEnv* env, jclass clazz, jobject tokenOb sp<IBinder> token(ibinderForJavaObject(env, tokenObj)); if (token == NULL) return; - ALOGD_IF_SLOW(100, "Excessive delay in setPowerMode()"); + android::base::Timer t; SurfaceComposerClient::setDisplayPowerMode(token, mode); + if (t.duration() > 100ms) ALOGD("Excessive delay in setPowerMode()"); } static jboolean nativeClearContentFrameStats(JNIEnv* env, jclass clazz, jlong nativeObject) { diff --git a/core/jni/include/android_runtime/AndroidRuntime.h b/core/jni/include/android_runtime/AndroidRuntime.h index c2189d4af86d..3ec8b1fe903f 100644 --- a/core/jni/include/android_runtime/AndroidRuntime.h +++ b/core/jni/include/android_runtime/AndroidRuntime.h @@ -26,7 +26,7 @@ #include <utils/Vector.h> #include <utils/threads.h> #include <pthread.h> -#include <nativehelper/jni.h> +#include <jni.h> namespace android { diff --git a/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java b/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java index 9bbcd3d2d2e9..70a0877beb5f 100644 --- a/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java +++ b/core/tests/coretests/src/android/app/timezone/DistroFormatVersionTest.java @@ -27,7 +27,6 @@ import org.junit.Test; /** * Tests for {@link DistroFormatVersion}. */ -// TODO(nfuller) Move to CTS once this class is part of the SystemApi. http://b/31008728 public class DistroFormatVersionTest { @Test diff --git a/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java b/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java index 2fbc9a1f8e7a..eecae46910fd 100644 --- a/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java +++ b/core/tests/coretests/src/android/app/timezone/DistroRulesVersionTest.java @@ -27,7 +27,6 @@ import org.junit.Test; /** * Tests for {@link DistroRulesVersion}. */ -// TODO(nfuller) Move to CTS once this class is part of the SystemApi. http://b/31008728 public class DistroRulesVersionTest { @Test diff --git a/core/tests/coretests/src/android/app/timezone/RulesStateTest.java b/core/tests/coretests/src/android/app/timezone/RulesStateTest.java index 7f4819bf63a1..99abe243556c 100644 --- a/core/tests/coretests/src/android/app/timezone/RulesStateTest.java +++ b/core/tests/coretests/src/android/app/timezone/RulesStateTest.java @@ -29,7 +29,6 @@ import org.junit.Test; /** * Tests for {@link RulesState}. */ -// TODO(nfuller) Move to CTS once this class is part of the SystemApi. http://b/31008728 public class RulesStateTest { @Test diff --git a/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java b/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java index e7a839c3e9fb..91f8ebc9ec1c 100644 --- a/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java +++ b/core/tests/coretests/src/android/app/timezone/RulesUpdaterContractTest.java @@ -33,7 +33,6 @@ import org.junit.Test; /** * Tests for {@link RulesUpdaterContract}. */ -// TODO(nfuller) Move to CTS once this class is part of the SystemApi. http://b/31008728 public class RulesUpdaterContractTest { @Test diff --git a/media/jni/audioeffect/android_media_AudioEffect.cpp b/media/jni/audioeffect/android_media_AudioEffect.cpp index a9b7062509b2..5f2656337db7 100644 --- a/media/jni/audioeffect/android_media_AudioEffect.cpp +++ b/media/jni/audioeffect/android_media_AudioEffect.cpp @@ -20,7 +20,7 @@ #define LOG_TAG "AudioEffects-JNI" #include <utils/Log.h> -#include <nativehelper/jni.h> +#include <jni.h> #include <nativehelper/JNIHelp.h> #include <android_runtime/AndroidRuntime.h> #include "media/AudioEffect.h" diff --git a/media/jni/audioeffect/android_media_Visualizer.cpp b/media/jni/audioeffect/android_media_Visualizer.cpp index 0645543d4a74..f0cfeef197d8 100644 --- a/media/jni/audioeffect/android_media_Visualizer.cpp +++ b/media/jni/audioeffect/android_media_Visualizer.cpp @@ -20,7 +20,7 @@ #define LOG_TAG "visualizers-JNI" #include <utils/Log.h> -#include <nativehelper/jni.h> +#include <jni.h> #include <nativehelper/JNIHelp.h> #include <android_runtime/AndroidRuntime.h> #include <utils/threads.h> diff --git a/media/jni/soundpool/android_media_SoundPool.cpp b/media/jni/soundpool/android_media_SoundPool.cpp index ab3e3408bcac..703a0158a13f 100644 --- a/media/jni/soundpool/android_media_SoundPool.cpp +++ b/media/jni/soundpool/android_media_SoundPool.cpp @@ -20,7 +20,7 @@ #define LOG_TAG "SoundPool-JNI" #include <utils/Log.h> -#include <nativehelper/jni.h> +#include <jni.h> #include <nativehelper/JNIHelp.h> #include <android_runtime/AndroidRuntime.h> #include "SoundPool.h" diff --git a/services/core/java/com/android/server/IpSecService.java b/services/core/java/com/android/server/IpSecService.java index b88bbc1bdd69..ac5da9361c4d 100644 --- a/services/core/java/com/android/server/IpSecService.java +++ b/services/core/java/com/android/server/IpSecService.java @@ -206,7 +206,11 @@ public class IpSecService extends IIpSecService.Stub { T get(int key) { T val = mArray.get(key); - val.checkOwnerOrSystemAndThrow(); + // The value should never be null unless the resource doesn't exist + // (since we do not allow null resources to be added). + if (val != null) { + val.checkOwnerOrSystemAndThrow(); + } return val; } @@ -402,17 +406,14 @@ public class IpSecService extends IIpSecService.Stub { private void connectNativeNetdService() { // Avoid blocking the system server to do this - Thread t = - new Thread( - new Runnable() { - @Override - public void run() { - synchronized (IpSecService.this) { - NetdService.get(NETD_FETCH_TIMEOUT); - } - } - }); - t.run(); + new Thread() { + @Override + public void run() { + synchronized (IpSecService.this) { + NetdService.get(NETD_FETCH_TIMEOUT); + } + } + }.start(); } INetd getNetdInstance() throws RemoteException { diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index c5fc038028e2..784a7104bba4 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -16447,23 +16447,41 @@ public final class ActivityManagerService extends ActivityManagerNative ArrayList<MemItem> catMems = new ArrayList<MemItem>(); catMems.add(new MemItem("Native", "Native", nativePss, nativeSwapPss, -1)); - final MemItem dalvikItem = - new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, -2); - if (dalvikSubitemPss.length > 0) { - dalvikItem.subitems = new ArrayList<MemItem>(); - for (int j=0; j<dalvikSubitemPss.length; j++) { - final String name = Debug.MemoryInfo.getOtherLabel( - Debug.MemoryInfo.NUM_OTHER_STATS + j); - dalvikItem.subitems.add(new MemItem(name, name, dalvikSubitemPss[j], - dalvikSubitemSwapPss[j], j)); - } - } - catMems.add(dalvikItem); + final int dalvikId = -2; + catMems.add(new MemItem("Dalvik", "Dalvik", dalvikPss, dalvikSwapPss, dalvikId)); catMems.add(new MemItem("Unknown", "Unknown", otherPss, otherSwapPss, -3)); for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) { String label = Debug.MemoryInfo.getOtherLabel(j); catMems.add(new MemItem(label, label, miscPss[j], miscSwapPss[j], j)); } + if (dalvikSubitemPss.length > 0) { + // Add dalvik subitems. + for (MemItem memItem : catMems) { + int memItemStart = 0, memItemEnd = 0; + if (memItem.id == dalvikId) { + memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_START; + memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_END; + } else if (memItem.id == Debug.MemoryInfo.OTHER_DALVIK_OTHER) { + memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_OTHER_START; + memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_DALVIK_OTHER_END; + } else if (memItem.id == Debug.MemoryInfo.OTHER_DEX) { + memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_DEX_START; + memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_DEX_END; + } else if (memItem.id == Debug.MemoryInfo.OTHER_ART) { + memItemStart = Debug.MemoryInfo.OTHER_DVK_STAT_ART_START; + memItemEnd = Debug.MemoryInfo.OTHER_DVK_STAT_ART_END; + } else { + continue; // No subitems, continue. + } + memItem.subitems = new ArrayList<MemItem>(); + for (int j=memItemStart; j<=memItemEnd; j++) { + final String name = Debug.MemoryInfo.getOtherLabel( + Debug.MemoryInfo.NUM_OTHER_STATS + j); + memItem.subitems.add(new MemItem(name, name, dalvikSubitemPss[j], + dalvikSubitemSwapPss[j], j)); + } + } + } ArrayList<MemItem> oomMems = new ArrayList<MemItem>(); for (int j=0; j<oomPss.length; j++) { diff --git a/services/core/java/com/android/server/timezone/PackageStatusStorage.java b/services/core/java/com/android/server/timezone/PackageStatusStorage.java index fe82dc4f1572..cac7f7b811bf 100644 --- a/services/core/java/com/android/server/timezone/PackageStatusStorage.java +++ b/services/core/java/com/android/server/timezone/PackageStatusStorage.java @@ -16,6 +16,7 @@ package com.android.server.timezone; +import com.android.internal.annotations.GuardedBy; import com.android.internal.util.FastXmlSerializer; import org.xmlpull.v1.XmlPullParser; @@ -80,7 +81,7 @@ final class PackageStatusStorage { private final AtomicFile mPackageStatusFile; PackageStatusStorage(File storageDir) { - mPackageStatusFile = new AtomicFile(new File(storageDir, "packageStatus.xml")); + mPackageStatusFile = new AtomicFile(new File(storageDir, "package-status.xml")); if (!mPackageStatusFile.getBaseFile().exists()) { try { insertInitialPackageStatus(); @@ -103,7 +104,7 @@ final class PackageStatusStorage { PackageStatus getPackageStatus() { synchronized (this) { try { - return getPackageStatusInternal(); + return getPackageStatusLocked(); } catch (ParseException e) { // This means that data exists in the file but it was bad. Slog.e(LOG_TAG, "Package status invalid, resetting and retrying", e); @@ -111,7 +112,7 @@ final class PackageStatusStorage { // Reset the storage so it is in a good state again. recoverFromBadData(e); try { - return getPackageStatusInternal(); + return getPackageStatusLocked(); } catch (ParseException e2) { throw new IllegalStateException("Recovery from bad file failed", e2); } @@ -119,7 +120,8 @@ final class PackageStatusStorage { } } - private PackageStatus getPackageStatusInternal() throws ParseException { + @GuardedBy("this") + private PackageStatus getPackageStatusLocked() throws ParseException { try (FileInputStream fis = mPackageStatusFile.openRead()) { XmlPullParser parser = parseToPackageStatusTag(fis); Integer checkStatus = getNullableIntAttribute(parser, ATTRIBUTE_CHECK_STATUS); @@ -137,7 +139,7 @@ final class PackageStatusStorage { } } - // Callers should be synchronized(this). + @GuardedBy("this") private int recoverFromBadData(Exception cause) { mPackageStatusFile.delete(); try { @@ -155,7 +157,7 @@ final class PackageStatusStorage { // is reset to ensure that old tokens are unlikely to work. final int initialOptimisticLockId = (int) System.currentTimeMillis(); - writePackageStatusInternal(null /* status */, initialOptimisticLockId, + writePackageStatusLocked(null /* status */, initialOptimisticLockId, null /* packageVersions */); return initialOptimisticLockId; } @@ -243,7 +245,7 @@ final class PackageStatusStorage { } } - // Caller should be synchronized(this). + @GuardedBy("this") private int getCurrentOptimisticLockId() throws ParseException { try (FileInputStream fis = mPackageStatusFile.openRead()) { XmlPullParser parser = parseToPackageStatusTag(fis); @@ -278,7 +280,7 @@ final class PackageStatusStorage { } } - // Caller should be synchronized(this). + @GuardedBy("this") private boolean writePackageStatusWithOptimisticLockCheck(int optimisticLockId, int newOptimisticLockId, Integer status, PackageVersions packageVersions) throws IOException { @@ -294,12 +296,12 @@ final class PackageStatusStorage { return false; } - writePackageStatusInternal(status, newOptimisticLockId, packageVersions); + writePackageStatusLocked(status, newOptimisticLockId, packageVersions); return true; } - // Caller should be synchronized(this). - private void writePackageStatusInternal(Integer status, int optimisticLockId, + @GuardedBy("this") + private void writePackageStatusLocked(Integer status, int optimisticLockId, PackageVersions packageVersions) throws IOException { if ((status == null) != (packageVersions == null)) { throw new IllegalArgumentException( diff --git a/services/core/java/com/android/server/timezone/RulesManagerServiceHelperImpl.java b/services/core/java/com/android/server/timezone/RulesManagerServiceHelperImpl.java index 767f0e0993ef..b89ce1cd0f89 100644 --- a/services/core/java/com/android/server/timezone/RulesManagerServiceHelperImpl.java +++ b/services/core/java/com/android/server/timezone/RulesManagerServiceHelperImpl.java @@ -18,6 +18,7 @@ package com.android.server.timezone; import android.content.Context; import android.content.pm.PackageManager; +import android.os.AsyncTask; import android.os.Binder; import android.os.ParcelFileDescriptor; @@ -56,10 +57,9 @@ final class RulesManagerServiceHelperImpl implements PermissionHelper, Executor return true; } - // TODO Wake lock required? + // TODO(nfuller): Wake lock required while running in background thread? @Override public void execute(Runnable runnable) { - // TODO Is there a better way? - new Thread(runnable).start(); + AsyncTask.execute(runnable); } } diff --git a/services/core/jni/com_android_server_lights_LightsService.cpp b/services/core/jni/com_android_server_lights_LightsService.cpp index bf91fe3fd0b4..dc6bc2ee42cf 100644 --- a/services/core/jni/com_android_server_lights_LightsService.cpp +++ b/services/core/jni/com_android_server_lights_LightsService.cpp @@ -20,6 +20,7 @@ #include "JNIHelp.h" #include "android_runtime/AndroidRuntime.h" +#include <android-base/chrono_utils.h> #include <utils/misc.h> #include <utils/Log.h> #include <hardware/hardware.h> @@ -137,8 +138,9 @@ static void setLight_native(JNIEnv* /* env */, jobject /* clazz */, jlong ptr, state.brightnessMode = brightnessMode; { - ALOGD_IF_SLOW(50, "Excessive delay setting light"); + android::base::Timer t; devices->lights[light]->set_light(devices->lights[light], &state); + if (t.duration() > 50ms) ALOGD("Excessive delay setting light"); } } diff --git a/services/core/jni/com_android_server_power_PowerManagerService.cpp b/services/core/jni/com_android_server_power_PowerManagerService.cpp index 048ef76ed426..4bd7b63f8a27 100644 --- a/services/core/jni/com_android_server_power_PowerManagerService.cpp +++ b/services/core/jni/com_android_server_power_PowerManagerService.cpp @@ -25,6 +25,7 @@ #include <limits.h> +#include <android-base/chrono_utils.h> #include <android_runtime/AndroidRuntime.h> #include <android_runtime/Log.h> #include <utils/Timers.h> @@ -125,22 +126,34 @@ static void nativeReleaseSuspendBlocker(JNIEnv *env, jclass /* clazz */, jstring static void nativeSetInteractive(JNIEnv* /* env */, jclass /* clazz */, jboolean enable) { if (gPowerModule) { if (enable) { - ALOGD_IF_SLOW(20, "Excessive delay in setInteractive(true) while turning screen on"); + android::base::Timer t; gPowerModule->setInteractive(gPowerModule, true); + if (t.duration() > 20ms) { + ALOGD("Excessive delay in setInteractive(true) while turning screen on"); + } } else { - ALOGD_IF_SLOW(20, "Excessive delay in setInteractive(false) while turning screen off"); + android::base::Timer t; gPowerModule->setInteractive(gPowerModule, false); + if (t.duration() > 20ms) { + ALOGD("Excessive delay in setInteractive(false) while turning screen off"); + } } } } static void nativeSetAutoSuspend(JNIEnv* /* env */, jclass /* clazz */, jboolean enable) { if (enable) { - ALOGD_IF_SLOW(100, "Excessive delay in autosuspend_enable() while turning screen off"); + android::base::Timer t; autosuspend_enable(); + if (t.duration() > 100ms) { + ALOGD("Excessive delay in autosuspend_enable() while turning screen off"); + } } else { - ALOGD_IF_SLOW(100, "Excessive delay in autosuspend_disable() while turning screen on"); + android::base::Timer t; autosuspend_disable(); + if (t.duration() > 100ms) { + ALOGD("Excessive delay in autosuspend_disable() while turning screen on"); + } } } |