summaryrefslogtreecommitdiffstats
path: root/core
diff options
context:
space:
mode:
Diffstat (limited to 'core')
-rw-r--r--core/java/android/app/ActivityThread.java23
-rw-r--r--core/java/android/app/ApplicationThreadNative.java34
-rw-r--r--core/java/android/app/IApplicationThread.java5
-rw-r--r--core/java/com/android/internal/app/ProcessStats.java91
4 files changed, 100 insertions, 53 deletions
diff --git a/core/java/android/app/ActivityThread.java b/core/java/android/app/ActivityThread.java
index 209514a..3e20f1f 100644
--- a/core/java/android/app/ActivityThread.java
+++ b/core/java/android/app/ActivityThread.java
@@ -855,10 +855,6 @@ public final class ActivityThread {
}
}
- public void getMemoryInfo(Debug.MemoryInfo outInfo) {
- Debug.getMemoryInfo(outInfo);
- }
-
public void dispatchPackageBroadcast(int cmd, String[] packages) {
queueOrSendMessage(H.DISPATCH_PACKAGE_BROADCAST, packages, cmd);
}
@@ -895,30 +891,23 @@ public final class ActivityThread {
}
@Override
- public Debug.MemoryInfo dumpMemInfo(FileDescriptor fd, boolean checkin,
+ public void dumpMemInfo(FileDescriptor fd, Debug.MemoryInfo mem, boolean checkin,
boolean dumpInfo, boolean dumpDalvik, String[] args) {
FileOutputStream fout = new FileOutputStream(fd);
PrintWriter pw = new FastPrintWriter(fout);
try {
- return dumpMemInfo(pw, checkin, dumpInfo, dumpDalvik);
+ dumpMemInfo(pw, mem, checkin, dumpInfo, dumpDalvik);
} finally {
pw.flush();
}
}
- private Debug.MemoryInfo dumpMemInfo(PrintWriter pw, boolean checkin, boolean dumpInfo,
- boolean dumpDalvik) {
+ private void dumpMemInfo(PrintWriter pw, Debug.MemoryInfo memInfo, boolean checkin,
+ boolean dumpInfo, boolean dumpDalvik) {
long nativeMax = Debug.getNativeHeapSize() / 1024;
long nativeAllocated = Debug.getNativeHeapAllocatedSize() / 1024;
long nativeFree = Debug.getNativeHeapFreeSize() / 1024;
- Debug.MemoryInfo memInfo = new Debug.MemoryInfo();
- Debug.getMemoryInfo(memInfo);
-
- if (!dumpInfo) {
- return memInfo;
- }
-
Runtime runtime = Runtime.getRuntime();
long dalvikMax = runtime.totalMemory() / 1024;
@@ -1043,7 +1032,7 @@ public final class ActivityThread {
}
pw.println();
- return memInfo;
+ return;
}
// otherwise, show human-readable format
@@ -1168,8 +1157,6 @@ public final class ActivityThread {
pw.println(" Asset Allocations");
pw.print(assetAlloc);
}
-
- return memInfo;
}
@Override
diff --git a/core/java/android/app/ApplicationThreadNative.java b/core/java/android/app/ApplicationThreadNative.java
index a4e80e5..876bf78 100644
--- a/core/java/android/app/ApplicationThreadNative.java
+++ b/core/java/android/app/ApplicationThreadNative.java
@@ -450,16 +450,6 @@ public abstract class ApplicationThreadNative extends Binder
return true;
}
- case GET_MEMORY_INFO_TRANSACTION:
- {
- data.enforceInterface(IApplicationThread.descriptor);
- Debug.MemoryInfo mi = new Debug.MemoryInfo();
- getMemoryInfo(mi);
- reply.writeNoException();
- mi.writeToParcel(reply, 0);
- return true;
- }
-
case DISPATCH_PACKAGE_BROADCAST_TRANSACTION:
{
data.enforceInterface(IApplicationThread.descriptor);
@@ -530,14 +520,14 @@ public abstract class ApplicationThreadNative extends Binder
{
data.enforceInterface(IApplicationThread.descriptor);
ParcelFileDescriptor fd = data.readFileDescriptor();
+ Debug.MemoryInfo mi = Debug.MemoryInfo.CREATOR.createFromParcel(data);
boolean checkin = data.readInt() != 0;
boolean dumpInfo = data.readInt() != 0;
boolean dumpDalvik = data.readInt() != 0;
String[] args = data.readStringArray();
- Debug.MemoryInfo mi = null;
if (fd != null) {
try {
- mi = dumpMemInfo(fd.getFileDescriptor(), checkin, dumpInfo, dumpDalvik, args);
+ dumpMemInfo(fd.getFileDescriptor(), mi, checkin, dumpInfo, dumpDalvik, args);
} finally {
try {
fd.close();
@@ -547,7 +537,6 @@ public abstract class ApplicationThreadNative extends Binder
}
}
reply.writeNoException();
- mi.writeToParcel(reply, 0);
return true;
}
@@ -1108,17 +1097,6 @@ class ApplicationThreadProxy implements IApplicationThread {
data.recycle();
}
- public void getMemoryInfo(Debug.MemoryInfo outInfo) throws RemoteException {
- Parcel data = Parcel.obtain();
- Parcel reply = Parcel.obtain();
- data.writeInterfaceToken(IApplicationThread.descriptor);
- mRemote.transact(GET_MEMORY_INFO_TRANSACTION, data, reply, 0);
- reply.readException();
- outInfo.readFromParcel(reply);
- data.recycle();
- reply.recycle();
- }
-
public void dispatchPackageBroadcast(int cmd, String[] packages) throws RemoteException {
Parcel data = Parcel.obtain();
data.writeInterfaceToken(IApplicationThread.descriptor);
@@ -1194,23 +1172,21 @@ class ApplicationThreadProxy implements IApplicationThread {
IBinder.FLAG_ONEWAY);
}
- public Debug.MemoryInfo dumpMemInfo(FileDescriptor fd, boolean checkin, boolean dumpInfo,
- boolean dumpDalvik, String[] args) throws RemoteException {
+ public void dumpMemInfo(FileDescriptor fd, Debug.MemoryInfo mem, boolean checkin,
+ boolean dumpInfo, boolean dumpDalvik, String[] args) throws RemoteException {
Parcel data = Parcel.obtain();
Parcel reply = Parcel.obtain();
data.writeInterfaceToken(IApplicationThread.descriptor);
data.writeFileDescriptor(fd);
+ mem.writeToParcel(data, 0);
data.writeInt(checkin ? 1 : 0);
data.writeInt(dumpInfo ? 1 : 0);
data.writeInt(dumpDalvik ? 1 : 0);
data.writeStringArray(args);
mRemote.transact(DUMP_MEM_INFO_TRANSACTION, data, reply, 0);
reply.readException();
- Debug.MemoryInfo info = new Debug.MemoryInfo();
- info.readFromParcel(reply);
data.recycle();
reply.recycle();
- return info;
}
public void dumpGfxInfo(FileDescriptor fd, String[] args) throws RemoteException {
diff --git a/core/java/android/app/IApplicationThread.java b/core/java/android/app/IApplicationThread.java
index 058b975..43a5fbd 100644
--- a/core/java/android/app/IApplicationThread.java
+++ b/core/java/android/app/IApplicationThread.java
@@ -118,7 +118,6 @@ public interface IApplicationThread extends IInterface {
void dumpHeap(boolean managed, String path, ParcelFileDescriptor fd)
throws RemoteException;
void setSchedulingGroup(int group) throws RemoteException;
- void getMemoryInfo(Debug.MemoryInfo outInfo) throws RemoteException;
static final int PACKAGE_REMOVED = 0;
static final int EXTERNAL_STORAGE_UNAVAILABLE = 1;
void dispatchPackageBroadcast(int cmd, String[] packages) throws RemoteException;
@@ -128,7 +127,7 @@ public interface IApplicationThread extends IInterface {
void setCoreSettings(Bundle coreSettings) throws RemoteException;
void updatePackageCompatibilityInfo(String pkg, CompatibilityInfo info) throws RemoteException;
void scheduleTrimMemory(int level) throws RemoteException;
- Debug.MemoryInfo dumpMemInfo(FileDescriptor fd, boolean checkin, boolean dumpInfo,
+ void dumpMemInfo(FileDescriptor fd, Debug.MemoryInfo mem, boolean checkin, boolean dumpInfo,
boolean dumpDalvik, String[] args) throws RemoteException;
void dumpGfxInfo(FileDescriptor fd, String[] args) throws RemoteException;
void dumpDbInfo(FileDescriptor fd, String[] args) throws RemoteException;
@@ -171,7 +170,7 @@ public interface IApplicationThread extends IInterface {
int SET_SCHEDULING_GROUP_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+28;
int SCHEDULE_CREATE_BACKUP_AGENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+29;
int SCHEDULE_DESTROY_BACKUP_AGENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+30;
- int GET_MEMORY_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+31;
+
int SCHEDULE_SUICIDE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+32;
int DISPATCH_PACKAGE_BROADCAST_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+33;
int SCHEDULE_CRASH_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+34;
diff --git a/core/java/com/android/internal/app/ProcessStats.java b/core/java/com/android/internal/app/ProcessStats.java
index 1475e2c..a281f7c 100644
--- a/core/java/com/android/internal/app/ProcessStats.java
+++ b/core/java/com/android/internal/app/ProcessStats.java
@@ -166,7 +166,7 @@ public final class ProcessStats implements Parcelable {
static final String CSV_SEP = "\t";
// Current version of the parcel format.
- private static final int PARCEL_VERSION = 12;
+ private static final int PARCEL_VERSION = 13;
// In-memory Parcel magic number, used to detect attempts to unmarshall bad data
private static final int MAGIC = 0x50535453;
@@ -646,6 +646,13 @@ public final class ProcessStats implements Parcelable {
pw.print(prefix); pw.print("Killed for excessive CPU use: ");
pw.print(proc.mNumExcessiveCpu); pw.println(" times");
}
+ if (proc.mNumCachedKill != 0) {
+ pw.print(prefix); pw.print("Killed from cached state: ");
+ pw.print(proc.mNumCachedKill); pw.print(" times from pss ");
+ printSizeValue(pw, proc.mMinCachedKillPss * 1024); pw.print("-");
+ printSizeValue(pw, proc.mAvgCachedKillPss * 1024); pw.print("-");
+ printSizeValue(pw, proc.mMaxCachedKillPss * 1024); pw.println();
+ }
}
static void dumpStateHeadersCsv(PrintWriter pw, String sep, int[] screenStates,
@@ -2033,7 +2040,8 @@ public final class ProcessStats implements Parcelable {
dumpAllProcessPssCheckin(pw, proc);
pw.println();
}
- if (proc.mNumExcessiveWake > 0 || proc.mNumExcessiveCpu > 0) {
+ if (proc.mNumExcessiveWake > 0 || proc.mNumExcessiveCpu > 0
+ || proc.mNumCachedKill > 0) {
pw.print("pkgkills,");
pw.print(pkgName);
pw.print(",");
@@ -2044,6 +2052,14 @@ public final class ProcessStats implements Parcelable {
pw.print(proc.mNumExcessiveWake);
pw.print(",");
pw.print(proc.mNumExcessiveCpu);
+ pw.print(",");
+ pw.print(proc.mNumCachedKill);
+ pw.print(",");
+ pw.print(proc.mMinCachedKillPss);
+ pw.print(":");
+ pw.print(proc.mAvgCachedKillPss);
+ pw.print(":");
+ pw.print(proc.mMaxCachedKillPss);
pw.println();
}
}
@@ -2090,7 +2106,8 @@ public final class ProcessStats implements Parcelable {
dumpAllProcessPssCheckin(pw, procState);
pw.println();
}
- if (procState.mNumExcessiveWake > 0 || procState.mNumExcessiveCpu > 0) {
+ if (procState.mNumExcessiveWake > 0 || procState.mNumExcessiveCpu > 0
+ || procState.mNumCachedKill > 0) {
pw.print("kills,");
pw.print(procName);
pw.print(",");
@@ -2099,6 +2116,14 @@ public final class ProcessStats implements Parcelable {
pw.print(procState.mNumExcessiveWake);
pw.print(",");
pw.print(procState.mNumExcessiveCpu);
+ pw.print(",");
+ pw.print(procState.mNumCachedKill);
+ pw.print(",");
+ pw.print(procState.mMinCachedKillPss);
+ pw.print(":");
+ pw.print(procState.mAvgCachedKillPss);
+ pw.print(":");
+ pw.print(procState.mMaxCachedKillPss);
pw.println();
}
}
@@ -2135,6 +2160,11 @@ public final class ProcessStats implements Parcelable {
int mNumExcessiveWake;
int mNumExcessiveCpu;
+ int mNumCachedKill;
+ long mMinCachedKillPss;
+ long mAvgCachedKillPss;
+ long mMaxCachedKillPss;
+
boolean mMultiPackage;
boolean mDead;
@@ -2200,6 +2230,10 @@ public final class ProcessStats implements Parcelable {
}
pnew.mNumExcessiveWake = mNumExcessiveWake;
pnew.mNumExcessiveCpu = mNumExcessiveCpu;
+ pnew.mNumCachedKill = mNumCachedKill;
+ pnew.mMinCachedKillPss = mMinCachedKillPss;
+ pnew.mAvgCachedKillPss = mAvgCachedKillPss;
+ pnew.mMaxCachedKillPss = mMaxCachedKillPss;
pnew.mActive = mActive;
pnew.mNumStartedServices = mNumStartedServices;
return pnew;
@@ -2226,6 +2260,10 @@ public final class ProcessStats implements Parcelable {
}
mNumExcessiveWake += other.mNumExcessiveWake;
mNumExcessiveCpu += other.mNumExcessiveCpu;
+ if (other.mNumCachedKill > 0) {
+ addCachedKill(other.mNumCachedKill, other.mMinCachedKillPss,
+ other.mAvgCachedKillPss, other.mMaxCachedKillPss);
+ }
}
void resetSafely(long now) {
@@ -2238,6 +2276,8 @@ public final class ProcessStats implements Parcelable {
mPssTableSize = 0;
mNumExcessiveWake = 0;
mNumExcessiveCpu = 0;
+ mNumCachedKill = 0;
+ mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0;
}
void makeDead() {
@@ -2268,6 +2308,12 @@ public final class ProcessStats implements Parcelable {
}
out.writeInt(mNumExcessiveWake);
out.writeInt(mNumExcessiveCpu);
+ out.writeInt(mNumCachedKill);
+ if (mNumCachedKill > 0) {
+ out.writeLong(mMinCachedKillPss);
+ out.writeLong(mAvgCachedKillPss);
+ out.writeLong(mMaxCachedKillPss);
+ }
}
boolean readFromParcel(Parcel in, boolean fully) {
@@ -2289,6 +2335,14 @@ public final class ProcessStats implements Parcelable {
mPssTableSize = mPssTable != null ? mPssTable.length : 0;
mNumExcessiveWake = in.readInt();
mNumExcessiveCpu = in.readInt();
+ mNumCachedKill = in.readInt();
+ if (mNumCachedKill > 0) {
+ mMinCachedKillPss = in.readLong();
+ mAvgCachedKillPss = in.readLong();
+ mMaxCachedKillPss = in.readLong();
+ } else {
+ mMinCachedKillPss = mAvgCachedKillPss = mMaxCachedKillPss = 0;
+ }
return true;
}
@@ -2502,6 +2556,37 @@ public final class ProcessStats implements Parcelable {
}
}
+ private void addCachedKill(int num, long minPss, long avgPss, long maxPss) {
+ if (mNumCachedKill <= 0) {
+ mNumCachedKill = num;
+ mMinCachedKillPss = minPss;
+ mAvgCachedKillPss = avgPss;
+ mMaxCachedKillPss = maxPss;
+ } else {
+ if (minPss < mMinCachedKillPss) {
+ mMinCachedKillPss = minPss;
+ }
+ if (maxPss > mMaxCachedKillPss) {
+ mMaxCachedKillPss = maxPss;
+ }
+ mAvgCachedKillPss = (long)( ((mAvgCachedKillPss*(double)mNumCachedKill) + avgPss)
+ / (mNumCachedKill+num) );
+ mNumCachedKill += num;
+ }
+ }
+
+ public void reportCachedKill(ArrayMap<String, ProcessState> pkgList, long pss) {
+ ensureNotDead();
+ mCommonProcess.addCachedKill(1, pss, pss, pss);
+ if (!mCommonProcess.mMultiPackage) {
+ return;
+ }
+
+ for (int ip=pkgList.size()-1; ip>=0; ip--) {
+ pullFixedProc(pkgList, ip).addCachedKill(1, pss, pss, pss);
+ }
+ }
+
ProcessState pullFixedProc(String pkgName) {
if (mMultiPackage) {
// The array map is still pointing to a common process state