diff options
Diffstat (limited to 'core')
| -rw-r--r-- | core/java/android/app/ActivityThread.java | 23 | ||||
| -rw-r--r-- | core/java/android/app/ApplicationThreadNative.java | 34 | ||||
| -rw-r--r-- | core/java/android/app/IApplicationThread.java | 5 | ||||
| -rw-r--r-- | core/java/com/android/internal/app/ProcessStats.java | 91 |
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 |
