diff options
Diffstat (limited to 'services/java')
10 files changed, 655 insertions, 227 deletions
diff --git a/services/java/com/android/server/EventLogTags.logtags b/services/java/com/android/server/EventLogTags.logtags index a7eff93..5408436 100644 --- a/services/java/com/android/server/EventLogTags.logtags +++ b/services/java/com/android/server/EventLogTags.logtags @@ -142,5 +142,5 @@ option java_package com.android.server # --------------------------- # NetworkStatsService.java # --------------------------- -51100 netstats_mobile_sample (dev_rx_bytes|2|2),(dev_tx_bytes|2|2),(dev_rx_pkts|2|1),(dev_tx_pkts|2|1),(xt_rx_bytes|2|2),(xt_tx_bytes|2|2),(xt_rx_pkts|2|1),(xt_tx_pkts|2|1),(uid_rx_bytes|2|2),(uid_tx_bytes|2|2),(uid_rx_pkts|2|1),(uid_tx_pkts|2|1),(trusted_time|2|3) -51101 netstats_wifi_sample (dev_rx_bytes|2|2),(dev_tx_bytes|2|2),(dev_rx_pkts|2|1),(dev_tx_pkts|2|1),(xt_rx_bytes|2|2),(xt_tx_bytes|2|2),(xt_rx_pkts|2|1),(xt_tx_pkts|2|1),(uid_rx_bytes|2|2),(uid_tx_bytes|2|2),(uid_rx_pkts|2|1),(uid_tx_pkts|2|1),(trusted_time|2|3) +51100 netstats_mobile_sample (dev_rx_bytes|2|2),(dev_tx_bytes|2|2),(dev_rx_pkts|2|1),(dev_tx_pkts|2|1),(xt_rx_bytes|2|2),(xt_tx_bytes|2|2),(xt_rx_pkts|2|1),(xt_tx_pkts|2|1),(uid_rx_bytes|2|2),(uid_tx_bytes|2|2),(uid_rx_pkts|2|1),(uid_tx_pkts|2|1),(trusted_time|2|3),(dev_history_start|2|3) +51101 netstats_wifi_sample (dev_rx_bytes|2|2),(dev_tx_bytes|2|2),(dev_rx_pkts|2|1),(dev_tx_pkts|2|1),(xt_rx_bytes|2|2),(xt_tx_bytes|2|2),(xt_rx_pkts|2|1),(xt_tx_pkts|2|1),(uid_rx_bytes|2|2),(uid_tx_bytes|2|2),(uid_rx_pkts|2|1),(uid_tx_pkts|2|1),(trusted_time|2|3),(dev_history_start|2|3) diff --git a/services/java/com/android/server/TextServicesManagerService.java b/services/java/com/android/server/TextServicesManagerService.java index af9152d..d04b440 100644 --- a/services/java/com/android/server/TextServicesManagerService.java +++ b/services/java/com/android/server/TextServicesManagerService.java @@ -360,7 +360,7 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { } final String sciId = info.getId(); final InternalServiceConnection connection = new InternalServiceConnection( - sciId, locale, scListener, bundle); + sciId, locale, bundle); final Intent serviceIntent = new Intent(SpellCheckerService.SERVICE_INTERFACE); serviceIntent.setComponent(info.getComponent()); if (DBG) { @@ -704,15 +704,13 @@ public class TextServicesManagerService extends ITextServicesManager.Stub { } private class InternalServiceConnection implements ServiceConnection { - private final ISpellCheckerSessionListener mListener; private final String mSciId; private final String mLocale; private final Bundle mBundle; public InternalServiceConnection( - String id, String locale, ISpellCheckerSessionListener listener, Bundle bundle) { + String id, String locale, Bundle bundle) { mSciId = id; mLocale = locale; - mListener = listener; mBundle = bundle; } diff --git a/services/java/com/android/server/UiModeManagerService.java b/services/java/com/android/server/UiModeManagerService.java index 280b329..e6392d7 100644 --- a/services/java/com/android/server/UiModeManagerService.java +++ b/services/java/com/android/server/UiModeManagerService.java @@ -63,6 +63,10 @@ class UiModeManagerService extends IUiModeManager.Stub { private static final String KEY_LAST_UPDATE_INTERVAL = "LAST_UPDATE_INTERVAL"; + // Enable launching of applications when entering the dock. + private static final boolean ENABLE_LAUNCH_CAR_DOCK_APP = true; + private static final boolean ENABLE_LAUNCH_DESK_DOCK_APP = false; + private static final int MSG_UPDATE_TWILIGHT = 0; private static final int MSG_ENABLE_LOCATION_UPDATES = 1; private static final int MSG_GET_NEW_LOCATION_UPDATE = 2; @@ -139,14 +143,16 @@ class UiModeManagerService extends IUiModeManager.Stub { if (UiModeManager.ACTION_ENTER_CAR_MODE.equals(intent.getAction())) { // Only launch car home when car mode is enabled and the caller // has asked us to switch to it. - if ((enableFlags&UiModeManager.ENABLE_CAR_MODE_GO_CAR_HOME) != 0) { + if (ENABLE_LAUNCH_CAR_DOCK_APP + && (enableFlags&UiModeManager.ENABLE_CAR_MODE_GO_CAR_HOME) != 0) { category = Intent.CATEGORY_CAR_DOCK; } } else if (UiModeManager.ACTION_ENTER_DESK_MODE.equals(intent.getAction())) { // Only launch car home when desk mode is enabled and the caller // has asked us to switch to it. Currently re-using the car // mode flag since we don't have a formal API for "desk mode". - if ((enableFlags&UiModeManager.ENABLE_CAR_MODE_GO_CAR_HOME) != 0) { + if (ENABLE_LAUNCH_DESK_DOCK_APP + && (enableFlags&UiModeManager.ENABLE_CAR_MODE_GO_CAR_HOME) != 0) { category = Intent.CATEGORY_DESK_DOCK; } } else { @@ -550,11 +556,13 @@ class UiModeManagerService extends IUiModeManager.Stub { } else { Intent homeIntent = null; if (mCarModeEnabled) { - if ((enableFlags&UiModeManager.ENABLE_CAR_MODE_GO_CAR_HOME) != 0) { + if (ENABLE_LAUNCH_CAR_DOCK_APP + && (enableFlags&UiModeManager.ENABLE_CAR_MODE_GO_CAR_HOME) != 0) { homeIntent = buildHomeIntent(Intent.CATEGORY_CAR_DOCK); } } else if (isDeskDockState(mDockState)) { - if ((enableFlags&UiModeManager.ENABLE_CAR_MODE_GO_CAR_HOME) != 0) { + if (ENABLE_LAUNCH_DESK_DOCK_APP + && (enableFlags&UiModeManager.ENABLE_CAR_MODE_GO_CAR_HOME) != 0) { homeIntent = buildHomeIntent(Intent.CATEGORY_DESK_DOCK); } } else { diff --git a/services/java/com/android/server/am/ActivityManagerService.java b/services/java/com/android/server/am/ActivityManagerService.java index cd63090..8023477 100644 --- a/services/java/com/android/server/am/ActivityManagerService.java +++ b/services/java/com/android/server/am/ActivityManagerService.java @@ -1211,8 +1211,8 @@ public final class ActivityManagerService extends ActivityManagerNative } synchronized (ActivityManagerService.this) { long now = SystemClock.uptimeMillis(); - if (now < (mLastMemUsageReportTime+10000)) { - // Don't report more than every 10 seconds to somewhat + if (now < (mLastMemUsageReportTime+5*60*1000)) { + // Don't report more than every 5 minutes to somewhat // avoid spamming. return; } @@ -1248,15 +1248,25 @@ public final class ActivityManagerService extends ActivityManagerNative PrintWriter pw = new PrintWriter(sw); StringWriter catSw = new StringWriter(); PrintWriter catPw = new PrintWriter(catSw); - dumpApplicationMemoryUsage(null, pw, " ", new String[] { }, true, catPw); + String[] emptyArgs = new String[] { }; + StringBuilder tag = new StringBuilder(128); + synchronized (ActivityManagerService.this) { + dumpProcessesLocked(null, catPw, emptyArgs, 0, false, null); + catPw.println(); + dumpServicesLocked(null, catPw, emptyArgs, 0, false, false, null); + catPw.println(); + dumpActivitiesLocked(null, catPw, emptyArgs, 0, false, false, null); + catPw.println(); + } + tag.append("Low on memory -- "); + dumpApplicationMemoryUsage(null, pw, " ", emptyArgs, true, catPw, tag); String memUsage = sw.toString(); dropBuilder.append('\n'); dropBuilder.append(memUsage); dropBuilder.append(catSw.toString()); logBuilder.append(memUsage); - addErrorToDropBox("watchdog", null, "system_server", null, - null, "Low on memory -- no more background processes", - dropBuilder.toString(), null, null); + addErrorToDropBox("lowmem", null, "system_server", null, + null, tag.toString(), dropBuilder.toString(), null, null); Slog.i(TAG, logBuilder.toString()); synchronized (ActivityManagerService.this) { long now = SystemClock.uptimeMillis(); @@ -1409,7 +1419,8 @@ public final class ActivityManagerService extends ActivityManagerNative return; } - mActivityManagerService.dumpApplicationMemoryUsage(fd, pw, " ", args, false, null); + mActivityManagerService.dumpApplicationMemoryUsage(fd, pw, " ", args, + false, null, null); } } @@ -1479,6 +1490,7 @@ public final class ActivityManagerService extends ActivityManagerNative mConfiguration.setToDefaults(); mConfiguration.locale = Locale.getDefault(); + mConfigurationSeq = mConfiguration.seq = 1; mProcessStats.init(); mCompatModePackages = new CompatModePackages(this, systemDir); @@ -1669,7 +1681,9 @@ public final class ActivityManagerService extends ActivityManagerNative final void setFocusedActivityLocked(ActivityRecord r) { if (mFocusedActivity != r) { mFocusedActivity = r; - mWindowManager.setFocusedApp(r.appToken, true); + if (r != null) { + mWindowManager.setFocusedApp(r.appToken, true); + } } } @@ -2436,7 +2450,7 @@ public final class ActivityManagerService extends ActivityManagerNative r.mayFreezeScreenLocked(r.app) ? r.appToken : null); if (config != null) { r.frozenBeforeDestroy = true; - if (!updateConfigurationLocked(config, r, false)) { + if (!updateConfigurationLocked(config, r, false, false)) { mMainStack.resumeTopActivityLocked(null); } } @@ -3797,7 +3811,7 @@ public final class ActivityManagerService extends ActivityManagerNative app.instrumentationClass, profileFile, profileFd, profileAutoStop, app.instrumentationArguments, app.instrumentationWatcher, testMode, isRestrictedBackupMode || !normalMode, app.persistent, - mConfiguration, app.compat, getCommonServicesLocked(), + new Configuration(mConfiguration), app.compat, getCommonServicesLocked(), mCoreSettingsObserver.getCoreSettingsLocked()); updateLruProcessLocked(app, false, true); app.lastRequestedGc = app.lastLowMemory = SystemClock.uptimeMillis(); @@ -6707,8 +6721,7 @@ public final class ActivityManagerService extends ActivityManagerNative mAlwaysFinishActivities = alwaysFinishActivities; // This happens before any activities are started, so we can // change mConfiguration in-place. - mConfiguration.updateFrom(configuration); - mConfigurationSeq = mConfiguration.seq = 1; + updateConfigurationLocked(configuration, null, false, true); if (DEBUG_CONFIGURATION) Slog.v(TAG, "Initial config: " + mConfiguration); } } @@ -7896,6 +7909,7 @@ public final class ActivityManagerService extends ActivityManagerNative boolean dumpAll = false; boolean dumpClient = false; + String dumpPackage = null; int opti = 0; while (opti < args.length) { @@ -7913,13 +7927,14 @@ public final class ActivityManagerService extends ActivityManagerNative pw.println(" [-a] [-c] [-h] [cmd] ..."); pw.println(" cmd may be one of:"); pw.println(" a[ctivities]: activity stack state"); - pw.println(" b[roadcasts]: broadcast state"); - pw.println(" i[ntents]: pending intent state"); - pw.println(" p[rocesses]: process state"); + pw.println(" b[roadcasts] [PACKAGE_NAME]: broadcast state"); + pw.println(" i[ntents] [PACKAGE_NAME]: pending intent state"); + pw.println(" p[rocesses] [PACKAGE_NAME]: process state"); pw.println(" o[om]: out of memory management"); pw.println(" prov[iders] [COMP_SPEC ...]: content provider state"); pw.println(" s[ervices] [COMP_SPEC ...]: service state"); pw.println(" service [COMP_SPEC]: service client-side state"); + pw.println(" package [PACKAGE_NAME]: all state related to given package"); pw.println(" all: dump all activities"); pw.println(" top: dump the top activity"); pw.println(" cmd may also be a COMP_SPEC to dump activities."); @@ -7940,22 +7955,58 @@ public final class ActivityManagerService extends ActivityManagerNative opti++; if ("activities".equals(cmd) || "a".equals(cmd)) { synchronized (this) { - dumpActivitiesLocked(fd, pw, args, opti, true, dumpClient); + dumpActivitiesLocked(fd, pw, args, opti, true, dumpClient, null); } return; } else if ("broadcasts".equals(cmd) || "b".equals(cmd)) { + String[] newArgs; + String name; + if (opti >= args.length) { + name = null; + newArgs = EMPTY_STRING_ARRAY; + } else { + name = args[opti]; + opti++; + newArgs = new String[args.length - opti]; + if (args.length > 2) System.arraycopy(args, opti, newArgs, 0, + args.length - opti); + } synchronized (this) { - dumpBroadcastsLocked(fd, pw, args, opti, true); + dumpBroadcastsLocked(fd, pw, args, opti, true, name); } return; } else if ("intents".equals(cmd) || "i".equals(cmd)) { + String[] newArgs; + String name; + if (opti >= args.length) { + name = null; + newArgs = EMPTY_STRING_ARRAY; + } else { + name = args[opti]; + opti++; + newArgs = new String[args.length - opti]; + if (args.length > 2) System.arraycopy(args, opti, newArgs, 0, + args.length - opti); + } synchronized (this) { - dumpPendingIntentsLocked(fd, pw, args, opti, true); + dumpPendingIntentsLocked(fd, pw, args, opti, true, name); } return; } else if ("processes".equals(cmd) || "p".equals(cmd)) { + String[] newArgs; + String name; + if (opti >= args.length) { + name = null; + newArgs = EMPTY_STRING_ARRAY; + } else { + name = args[opti]; + opti++; + newArgs = new String[args.length - opti]; + if (args.length > 2) System.arraycopy(args, opti, newArgs, 0, + args.length - opti); + } synchronized (this) { - dumpProcessesLocked(fd, pw, args, opti, true); + dumpProcessesLocked(fd, pw, args, opti, true, name); } return; } else if ("oom".equals(cmd) || "o".equals(cmd)) { @@ -7965,7 +8016,7 @@ public final class ActivityManagerService extends ActivityManagerNative return; } else if ("providers".equals(cmd) || "prov".equals(cmd)) { synchronized (this) { - dumpProvidersLocked(fd, pw, args, opti, true); + dumpProvidersLocked(fd, pw, args, opti, true, null); } return; } else if ("service".equals(cmd)) { @@ -7978,16 +8029,32 @@ public final class ActivityManagerService extends ActivityManagerNative name = args[opti]; opti++; newArgs = new String[args.length - opti]; - if (args.length > 2) System.arraycopy(args, opti, newArgs, 0, args.length - opti); + if (args.length > 2) System.arraycopy(args, opti, newArgs, 0, + args.length - opti); } if (!dumpService(fd, pw, name, newArgs, 0, dumpAll)) { pw.println("No services match: " + name); pw.println("Use -h for help."); } return; + } else if ("package".equals(cmd)) { + String[] newArgs; + if (opti >= args.length) { + pw.println("package: no package name specified"); + pw.println("Use -h for help."); + return; + } else { + dumpPackage = args[opti]; + opti++; + newArgs = new String[args.length - opti]; + if (args.length > 2) System.arraycopy(args, opti, newArgs, 0, + args.length - opti); + args = newArgs; + opti = 0; + } } else if ("services".equals(cmd) || "s".equals(cmd)) { synchronized (this) { - dumpServicesLocked(fd, pw, args, opti, true, dumpClient); + dumpServicesLocked(fd, pw, args, opti, true, dumpClient, null); } return; } else { @@ -8003,76 +8070,78 @@ public final class ActivityManagerService extends ActivityManagerNative // No piece of data specified, dump everything. synchronized (this) { boolean needSep; - needSep = dumpPendingIntentsLocked(fd, pw, args, opti, dumpAll); + needSep = dumpPendingIntentsLocked(fd, pw, args, opti, dumpAll, dumpPackage); if (needSep) { pw.println(" "); } if (dumpAll) { pw.println("-------------------------------------------------------------------------------"); } - needSep = dumpBroadcastsLocked(fd, pw, args, opti, dumpAll); + needSep = dumpBroadcastsLocked(fd, pw, args, opti, dumpAll, dumpPackage); if (needSep) { pw.println(" "); } if (dumpAll) { pw.println("-------------------------------------------------------------------------------"); } - needSep = dumpProvidersLocked(fd, pw, args, opti, dumpAll); + needSep = dumpProvidersLocked(fd, pw, args, opti, dumpAll, dumpPackage); if (needSep) { pw.println(" "); } if (dumpAll) { pw.println("-------------------------------------------------------------------------------"); } - needSep = dumpServicesLocked(fd, pw, args, opti, dumpAll, dumpClient); + needSep = dumpServicesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); if (needSep) { pw.println(" "); } if (dumpAll) { pw.println("-------------------------------------------------------------------------------"); } - needSep = dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient); + needSep = dumpActivitiesLocked(fd, pw, args, opti, dumpAll, dumpClient, dumpPackage); if (needSep) { pw.println(" "); } if (dumpAll) { pw.println("-------------------------------------------------------------------------------"); } - dumpProcessesLocked(fd, pw, args, opti, dumpAll); + dumpProcessesLocked(fd, pw, args, opti, dumpAll, dumpPackage); } } boolean dumpActivitiesLocked(FileDescriptor fd, PrintWriter pw, String[] args, - int opti, boolean dumpAll, boolean dumpClient) { + int opti, boolean dumpAll, boolean dumpClient, String dumpPackage) { pw.println("ACTIVITY MANAGER ACTIVITIES (dumpsys activity activities)"); pw.println(" Main stack:"); - dumpHistoryList(fd, pw, mMainStack.mHistory, " ", "Hist", true, !dumpAll, dumpClient); + dumpHistoryList(fd, pw, mMainStack.mHistory, " ", "Hist", true, !dumpAll, dumpClient, + dumpPackage); pw.println(" "); pw.println(" Running activities (most recent first):"); - dumpHistoryList(fd, pw, mMainStack.mLRUActivities, " ", "Run", false, !dumpAll, false); + dumpHistoryList(fd, pw, mMainStack.mLRUActivities, " ", "Run", false, !dumpAll, false, + dumpPackage); if (mMainStack.mWaitingVisibleActivities.size() > 0) { pw.println(" "); pw.println(" Activities waiting for another to become visible:"); dumpHistoryList(fd, pw, mMainStack.mWaitingVisibleActivities, " ", "Wait", false, - !dumpAll, false); + !dumpAll, false, dumpPackage); } if (mMainStack.mStoppingActivities.size() > 0) { pw.println(" "); pw.println(" Activities waiting to stop:"); dumpHistoryList(fd, pw, mMainStack.mStoppingActivities, " ", "Stop", false, - !dumpAll, false); + !dumpAll, false, dumpPackage); } if (mMainStack.mGoingToSleepActivities.size() > 0) { pw.println(" "); pw.println(" Activities waiting to sleep:"); dumpHistoryList(fd, pw, mMainStack.mGoingToSleepActivities, " ", "Sleep", false, - !dumpAll, false); + !dumpAll, false, dumpPackage); } if (mMainStack.mFinishingActivities.size() > 0) { pw.println(" "); pw.println(" Activities waiting to finish:"); dumpHistoryList(fd, pw, mMainStack.mFinishingActivities, " ", "Fin", false, - !dumpAll, false); + !dumpAll, false, dumpPackage); } pw.println(" "); @@ -8095,6 +8164,12 @@ public final class ActivityManagerService extends ActivityManagerNative final int N = mRecentTasks.size(); for (int i=0; i<N; i++) { TaskRecord tr = mRecentTasks.get(i); + if (dumpPackage != null) { + if (tr.realActivity == null || + !dumpPackage.equals(tr.realActivity)) { + continue; + } + } pw.print(" * Recent #"); pw.print(i); pw.print(": "); pw.println(tr); if (dumpAll) { @@ -8112,7 +8187,7 @@ public final class ActivityManagerService extends ActivityManagerNative } boolean dumpProcessesLocked(FileDescriptor fd, PrintWriter pw, String[] args, - int opti, boolean dumpAll) { + int opti, boolean dumpAll, String dumpPackage) { boolean needSep = false; int numPers = 0; @@ -8122,11 +8197,14 @@ public final class ActivityManagerService extends ActivityManagerNative for (SparseArray<ProcessRecord> procs : mProcessNames.getMap().values()) { final int NA = procs.size(); for (int ia=0; ia<NA; ia++) { + ProcessRecord r = procs.valueAt(ia); + if (dumpPackage != null && !dumpPackage.equals(r.info.packageName)) { + continue; + } if (!needSep) { pw.println(" All known processes:"); needSep = true; } - ProcessRecord r = procs.valueAt(ia); pw.print(r.persistent ? " *PERS*" : " *APP*"); pw.print(" UID "); pw.print(procs.keyAt(ia)); pw.print(" "); pw.println(r); @@ -8143,31 +8221,49 @@ public final class ActivityManagerService extends ActivityManagerNative needSep = true; pw.println(" Process LRU list (sorted by oom_adj):"); dumpProcessOomList(pw, this, mLruProcesses, " ", - "Proc", "PERS", false); + "Proc", "PERS", false, dumpPackage); needSep = true; } if (dumpAll) { synchronized (mPidsSelfLocked) { - if (mPidsSelfLocked.size() > 0) { - if (needSep) pw.println(" "); - needSep = true; - pw.println(" PID mappings:"); - for (int i=0; i<mPidsSelfLocked.size(); i++) { - pw.print(" PID #"); pw.print(mPidsSelfLocked.keyAt(i)); - pw.print(": "); pw.println(mPidsSelfLocked.valueAt(i)); + boolean printed = false; + for (int i=0; i<mPidsSelfLocked.size(); i++) { + ProcessRecord r = mPidsSelfLocked.valueAt(i); + if (dumpPackage != null && !dumpPackage.equals(r.info.packageName)) { + continue; + } + if (!printed) { + if (needSep) pw.println(" "); + needSep = true; + pw.println(" PID mappings:"); + printed = true; } + pw.print(" PID #"); pw.print(mPidsSelfLocked.keyAt(i)); + pw.print(": "); pw.println(mPidsSelfLocked.valueAt(i)); } } } if (mForegroundProcesses.size() > 0) { - if (needSep) pw.println(" "); - needSep = true; - pw.println(" Foreground Processes:"); - for (int i=0; i<mForegroundProcesses.size(); i++) { - pw.print(" PID #"); pw.print(mForegroundProcesses.keyAt(i)); - pw.print(": "); pw.println(mForegroundProcesses.valueAt(i)); + synchronized (mPidsSelfLocked) { + boolean printed = false; + for (int i=0; i<mForegroundProcesses.size(); i++) { + ProcessRecord r = mPidsSelfLocked.get( + mForegroundProcesses.valueAt(i).pid); + if (dumpPackage != null && (r == null + || !dumpPackage.equals(r.info.packageName))) { + continue; + } + if (!printed) { + if (needSep) pw.println(" "); + needSep = true; + pw.println(" Foreground Processes:"); + printed = true; + } + pw.print(" PID #"); pw.print(mForegroundProcesses.keyAt(i)); + pw.print(": "); pw.println(mForegroundProcesses.valueAt(i)); + } } } @@ -8176,7 +8272,7 @@ public final class ActivityManagerService extends ActivityManagerNative needSep = true; pw.println(" Persisent processes that are starting:"); dumpProcessList(pw, this, mPersistentStartingProcesses, " ", - "Starting Norm", "Restarting PERS"); + "Starting Norm", "Restarting PERS", dumpPackage); } if (mRemovedProcesses.size() > 0) { @@ -8184,7 +8280,7 @@ public final class ActivityManagerService extends ActivityManagerNative needSep = true; pw.println(" Processes that are being removed:"); dumpProcessList(pw, this, mRemovedProcesses, " ", - "Removed Norm", "Removed PERS"); + "Removed Norm", "Removed PERS", dumpPackage); } if (mProcessesOnHold.size() > 0) { @@ -8192,23 +8288,34 @@ public final class ActivityManagerService extends ActivityManagerNative needSep = true; pw.println(" Processes that are on old until the system is ready:"); dumpProcessList(pw, this, mProcessesOnHold, " ", - "OnHold Norm", "OnHold PERS"); + "OnHold Norm", "OnHold PERS", dumpPackage); } - needSep = dumpProcessesToGc(fd, pw, args, opti, needSep, dumpAll); + needSep = dumpProcessesToGc(fd, pw, args, opti, needSep, dumpAll, dumpPackage); if (mProcessCrashTimes.getMap().size() > 0) { - if (needSep) pw.println(" "); - needSep = true; - pw.println(" Time since processes crashed:"); + boolean printed = false; long now = SystemClock.uptimeMillis(); for (Map.Entry<String, SparseArray<Long>> procs : mProcessCrashTimes.getMap().entrySet()) { + String pname = procs.getKey(); SparseArray<Long> uids = procs.getValue(); final int N = uids.size(); for (int i=0; i<N; i++) { - pw.print(" Process "); pw.print(procs.getKey()); - pw.print(" uid "); pw.print(uids.keyAt(i)); + int puid = uids.keyAt(i); + ProcessRecord r = mProcessNames.get(pname, puid); + if (dumpPackage != null && (r == null + || !dumpPackage.equals(r.info.packageName))) { + continue; + } + if (!printed) { + if (needSep) pw.println(" "); + needSep = true; + pw.println(" Time since processes crashed:"); + printed = true; + } + pw.print(" Process "); pw.print(pname); + pw.print(" uid "); pw.print(puid); pw.print(": last crashed "); pw.print((now-uids.valueAt(i))); pw.println(" ms ago"); @@ -8217,16 +8324,26 @@ public final class ActivityManagerService extends ActivityManagerNative } if (mBadProcesses.getMap().size() > 0) { - if (needSep) pw.println(" "); - needSep = true; - pw.println(" Bad processes:"); + boolean printed = false; for (Map.Entry<String, SparseArray<Long>> procs : mBadProcesses.getMap().entrySet()) { + String pname = procs.getKey(); SparseArray<Long> uids = procs.getValue(); final int N = uids.size(); for (int i=0; i<N; i++) { - pw.print(" Bad process "); pw.print(procs.getKey()); - pw.print(" uid "); pw.print(uids.keyAt(i)); + int puid = uids.keyAt(i); + ProcessRecord r = mProcessNames.get(pname, puid); + if (dumpPackage != null && (r == null + || !dumpPackage.equals(r.info.packageName))) { + continue; + } + if (!printed) { + if (needSep) pw.println(" "); + needSep = true; + pw.println(" Bad processes:"); + } + pw.print(" Bad process "); pw.print(pname); + pw.print(" uid "); pw.print(puid); pw.print(": crashed at time "); pw.println(uids.valueAt(i)); } @@ -8243,11 +8360,18 @@ public final class ActivityManagerService extends ActivityManagerNative if (dumpAll) { pw.println(" mConfigWillChange: " + mMainStack.mConfigWillChange); if (mCompatModePackages.getPackages().size() > 0) { - pw.println(" mScreenCompatPackages:"); + boolean printed = false; for (Map.Entry<String, Integer> entry : mCompatModePackages.getPackages().entrySet()) { String pkg = entry.getKey(); int mode = entry.getValue(); + if (dumpPackage != null && !dumpPackage.equals(pkg)) { + continue; + } + if (!printed) { + pw.println(" mScreenCompatPackages:"); + printed = true; + } pw.print(" "); pw.print(pkg); pw.print(": "); pw.print(mode); pw.println(); } @@ -8296,14 +8420,21 @@ public final class ActivityManagerService extends ActivityManagerNative } boolean dumpProcessesToGc(FileDescriptor fd, PrintWriter pw, String[] args, - int opti, boolean needSep, boolean dumpAll) { + int opti, boolean needSep, boolean dumpAll, String dumpPackage) { if (mProcessesToGc.size() > 0) { - if (needSep) pw.println(" "); - needSep = true; - pw.println(" Processes that are waiting to GC:"); + boolean printed = false; long now = SystemClock.uptimeMillis(); for (int i=0; i<mProcessesToGc.size(); i++) { ProcessRecord proc = mProcessesToGc.get(i); + if (dumpPackage != null && !dumpPackage.equals(proc.info.packageName)) { + continue; + } + if (!printed) { + if (needSep) pw.println(" "); + needSep = true; + pw.println(" Processes that are waiting to GC:"); + printed = true; + } pw.print(" Process "); pw.println(proc); pw.print(" lowMem="); pw.print(proc.reportLowMemory); pw.print(", last gced="); @@ -8343,11 +8474,11 @@ public final class ActivityManagerService extends ActivityManagerNative needSep = true; pw.println(" Process OOM control:"); dumpProcessOomList(pw, this, mLruProcesses, " ", - "Proc", "PERS", true); + "Proc", "PERS", true, null); needSep = true; } - needSep = dumpProcessesToGc(fd, pw, args, opti, needSep, dumpAll); + needSep = dumpProcessesToGc(fd, pw, args, opti, needSep, dumpAll, null); pw.println(); pw.println(" mHomeProcess: " + mHomeProcess); @@ -8647,64 +8778,103 @@ public final class ActivityManagerService extends ActivityManagerNative } boolean dumpBroadcastsLocked(FileDescriptor fd, PrintWriter pw, String[] args, - int opti, boolean dumpAll) { + int opti, boolean dumpAll, String dumpPackage) { boolean needSep = false; pw.println("ACTIVITY MANAGER BROADCAST STATE (dumpsys activity broadcasts)"); if (dumpAll) { if (mRegisteredReceivers.size() > 0) { - pw.println(" Registered Receivers:"); + boolean printed = false; Iterator it = mRegisteredReceivers.values().iterator(); while (it.hasNext()) { ReceiverList r = (ReceiverList)it.next(); + if (dumpPackage != null && (r.app == null || + !dumpPackage.equals(r.app.info.packageName))) { + continue; + } + if (!printed) { + pw.println(" Registered Receivers:"); + needSep = true; + printed = true; + } pw.print(" * "); pw.println(r); r.dump(pw, " "); } } - - pw.println(); - pw.println(" Receiver Resolver Table:"); - mReceiverResolver.dump(pw, null, " ", null, false); - needSep = true; + + if (mReceiverResolver.dump(pw, needSep ? + "\n Receiver Resolver Table:" : " Receiver Resolver Table:", + " ", dumpPackage, false)) { + needSep = true; + } } if (mParallelBroadcasts.size() > 0 || mOrderedBroadcasts.size() > 0 || mPendingBroadcast != null) { - if (mParallelBroadcasts.size() > 0) { - pw.println(); - pw.println(" Active broadcasts:"); - } + boolean printed = false; for (int i=mParallelBroadcasts.size()-1; i>=0; i--) { + BroadcastRecord br = mParallelBroadcasts.get(i); + if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) { + continue; + } + if (!printed) { + if (needSep) { + pw.println(); + } + needSep = true; + pw.println(" Active broadcasts:"); + } pw.println(" Broadcast #" + i + ":"); - mParallelBroadcasts.get(i).dump(pw, " "); - } - if (mOrderedBroadcasts.size() > 0) { - pw.println(); - pw.println(" Active ordered broadcasts:"); + br.dump(pw, " "); } + printed = false; for (int i=mOrderedBroadcasts.size()-1; i>=0; i--) { - pw.println(" Serialized Broadcast #" + i + ":"); + BroadcastRecord br = mOrderedBroadcasts.get(i); + if (dumpPackage != null && !dumpPackage.equals(br.callerPackage)) { + continue; + } + if (!printed) { + if (needSep) { + pw.println(); + } + needSep = true; + pw.println(" Active ordered broadcasts:"); + } + pw.println(" Ordered Broadcast #" + i + ":"); mOrderedBroadcasts.get(i).dump(pw, " "); } - pw.println(); - pw.println(" Pending broadcast:"); - if (mPendingBroadcast != null) { - mPendingBroadcast.dump(pw, " "); - } else { - pw.println(" (null)"); + if (dumpPackage == null || (mPendingBroadcast != null + && dumpPackage.equals(mPendingBroadcast.callerPackage))) { + if (needSep) { + pw.println(); + } + pw.println(" Pending broadcast:"); + if (mPendingBroadcast != null) { + mPendingBroadcast.dump(pw, " "); + } else { + pw.println(" (null)"); + } + needSep = true; } - needSep = true; } - if (needSep) { - pw.println(); - } - pw.println(" Historical broadcasts:"); + boolean printed = false; for (int i=0; i<MAX_BROADCAST_HISTORY; i++) { BroadcastRecord r = mBroadcastHistory[i]; if (r == null) { break; } + if (dumpPackage != null && !dumpPackage.equals(r.callerPackage)) { + continue; + } + if (!printed) { + if (needSep) { + pw.println(); + } + needSep = true; + pw.println(" Historical broadcasts:"); + printed = true; + } if (dumpAll) { pw.print(" Historical Broadcast #"); pw.print(i); pw.println(":"); r.dump(pw, " "); @@ -8718,8 +8888,11 @@ public final class ActivityManagerService extends ActivityManagerNative } needSep = true; - if (mStickyBroadcasts != null) { - pw.println(); + if (mStickyBroadcasts != null && dumpPackage == null) { + if (needSep) { + pw.println(); + } + needSep = true; pw.println(" Sticky broadcasts:"); StringBuilder sb = new StringBuilder(128); for (Map.Entry<String, ArrayList<Intent>> ent @@ -8759,7 +8932,7 @@ public final class ActivityManagerService extends ActivityManagerNative } boolean dumpServicesLocked(FileDescriptor fd, PrintWriter pw, String[] args, - int opti, boolean dumpAll, boolean dumpClient) { + int opti, boolean dumpAll, boolean dumpClient, String dumpPackage) { boolean needSep = false; ItemMatcher matcher = new ItemMatcher(); @@ -8767,7 +8940,7 @@ public final class ActivityManagerService extends ActivityManagerNative pw.println("ACTIVITY MANAGER SERVICES (dumpsys activity services)"); if (mServices.size() > 0) { - pw.println(" Active services:"); + boolean printed = false; long nowReal = SystemClock.elapsedRealtime(); Iterator<ServiceRecord> it = mServices.values().iterator(); needSep = false; @@ -8776,6 +8949,13 @@ public final class ActivityManagerService extends ActivityManagerNative if (!matcher.match(r, r.name)) { continue; } + if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { + continue; + } + if (!printed) { + pw.println(" Active services:"); + printed = true; + } if (needSep) { pw.println(); } @@ -8789,6 +8969,20 @@ public final class ActivityManagerService extends ActivityManagerNative TimeUtils.formatDuration(r.createTime, nowReal, pw); pw.print(" started="); pw.print(r.startRequested); pw.print(" connections="); pw.println(r.connections.size()); + if (r.connections.size() > 0) { + pw.println(" Connections:"); + for (ArrayList<ConnectionRecord> clist : r.connections.values()) { + for (int i=0; i<clist.size(); i++) { + ConnectionRecord conn = clist.get(i); + pw.print(" "); + pw.print(conn.binding.intent.intent.getIntent().toShortString( + false, false, false)); + pw.print(" -> "); + ProcessRecord proc = conn.binding.client; + pw.println(proc != null ? proc.toShortString() : "null"); + } + } + } } if (dumpClient && r.app != null && r.app.thread != null) { pw.println(" Client:"); @@ -8813,17 +9007,25 @@ public final class ActivityManagerService extends ActivityManagerNative needSep = true; } } - needSep = true; + needSep = printed; } if (mPendingServices.size() > 0) { - if (needSep) pw.println(" "); - pw.println(" Pending services:"); + boolean printed = false; for (int i=0; i<mPendingServices.size(); i++) { ServiceRecord r = mPendingServices.get(i); if (!matcher.match(r, r.name)) { continue; } + if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { + continue; + } + if (!printed) { + if (needSep) pw.println(" "); + needSep = true; + pw.println(" Pending services:"); + printed = true; + } pw.print(" * Pending "); pw.println(r); r.dump(pw, " "); } @@ -8831,13 +9033,21 @@ public final class ActivityManagerService extends ActivityManagerNative } if (mRestartingServices.size() > 0) { - if (needSep) pw.println(" "); - pw.println(" Restarting services:"); + boolean printed = false; for (int i=0; i<mRestartingServices.size(); i++) { ServiceRecord r = mRestartingServices.get(i); if (!matcher.match(r, r.name)) { continue; } + if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { + continue; + } + if (!printed) { + if (needSep) pw.println(" "); + needSep = true; + pw.println(" Restarting services:"); + printed = true; + } pw.print(" * Restarting "); pw.println(r); r.dump(pw, " "); } @@ -8845,13 +9055,21 @@ public final class ActivityManagerService extends ActivityManagerNative } if (mStoppingServices.size() > 0) { - if (needSep) pw.println(" "); - pw.println(" Stopping services:"); + boolean printed = false; for (int i=0; i<mStoppingServices.size(); i++) { ServiceRecord r = mStoppingServices.get(i); if (!matcher.match(r, r.name)) { continue; } + if (dumpPackage != null && !dumpPackage.equals(r.appInfo.packageName)) { + continue; + } + if (!printed) { + if (needSep) pw.println(" "); + needSep = true; + pw.println(" Stopping services:"); + printed = true; + } pw.print(" * Stopping "); pw.println(r); r.dump(pw, " "); } @@ -8860,8 +9078,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (dumpAll) { if (mServiceConnections.size() > 0) { - if (needSep) pw.println(" "); - pw.println(" Connection bindings to services:"); + boolean printed = false; Iterator<ArrayList<ConnectionRecord>> it = mServiceConnections.values().iterator(); while (it.hasNext()) { @@ -8871,6 +9088,16 @@ public final class ActivityManagerService extends ActivityManagerNative if (!matcher.match(cr.binding.service, cr.binding.service.name)) { continue; } + if (dumpPackage != null && (cr.binding.client == null + || !dumpPackage.equals(cr.binding.client.info.packageName))) { + continue; + } + if (!printed) { + if (needSep) pw.println(" "); + needSep = true; + pw.println(" Connection bindings to services:"); + printed = true; + } pw.print(" * "); pw.println(cr); cr.dump(pw, " "); } @@ -8883,7 +9110,7 @@ public final class ActivityManagerService extends ActivityManagerNative } boolean dumpProvidersLocked(FileDescriptor fd, PrintWriter pw, String[] args, - int opti, boolean dumpAll) { + int opti, boolean dumpAll, String dumpPackage) { boolean needSep = false; ItemMatcher matcher = new ItemMatcher(); @@ -8891,8 +9118,7 @@ public final class ActivityManagerService extends ActivityManagerNative pw.println("ACTIVITY MANAGER CONTENT PROVIDERS (dumpsys activity providers)"); if (mProvidersByClass.size() > 0) { - if (needSep) pw.println(" "); - pw.println(" Published content providers (by class):"); + boolean printed = false; Iterator<Map.Entry<ComponentName, ContentProviderRecord>> it = mProvidersByClass.entrySet().iterator(); while (it.hasNext()) { @@ -8907,28 +9133,38 @@ public final class ActivityManagerService extends ActivityManagerNative if (!matcher.match(r, comp)) { continue; } + if (dumpPackage != null && !dumpPackage.equals(comp.getPackageName())) { + continue; + } + if (!printed) { + if (needSep) pw.println(" "); + needSep = true; + pw.println(" Published content providers (by class):"); + printed = true; + } pw.print(" * "); pw.print(cls); pw.print(" ("); - pw.print(comp.flattenToShortString()); pw.print(")"); + pw.print(comp.flattenToShortString()); pw.println(")"); if (dumpAll) { - pw.println(); r.dump(pw, " "); } else { - pw.print(" * "); pw.print(e.getKey().flattenToShortString()); if (r.proc != null) { - pw.println(":"); pw.print(" "); pw.println(r.proc); } else { pw.println(); } + if (r.clients.size() > 0) { + pw.println(" Clients:"); + for (ProcessRecord cproc : r.clients) { + pw.print(" - "); pw.println(cproc); + } + } } } - needSep = true; } if (dumpAll) { if (mProvidersByName.size() > 0) { - pw.println(" "); - pw.println(" Authority to provider mappings:"); + boolean printed = false; Iterator<Map.Entry<String, ContentProviderRecord>> it = mProvidersByName.entrySet().iterator(); while (it.hasNext()) { @@ -8937,25 +9173,42 @@ public final class ActivityManagerService extends ActivityManagerNative if (!matcher.match(r, r.name)) { continue; } - pw.print(" "); pw.print(e.getKey()); pw.print(": "); - pw.println(r); + if (dumpPackage != null && !dumpPackage.equals(r.name.getPackageName())) { + continue; + } + if (!printed) { + if (needSep) pw.println(" "); + needSep = true; + pw.println(" Authority to provider mappings:"); + printed = true; + } + pw.print(" "); pw.print(e.getKey()); pw.println(":"); + pw.print(" "); pw.println(r); } - needSep = true; } } if (mLaunchingProviders.size() > 0) { - if (needSep) pw.println(" "); - pw.println(" Launching content providers:"); + boolean printed = false; for (int i=mLaunchingProviders.size()-1; i>=0; i--) { + ContentProviderRecord r = mLaunchingProviders.get(i); + if (dumpPackage != null && !dumpPackage.equals(r.name.getPackageName())) { + continue; + } + if (!printed) { + if (needSep) pw.println(" "); + needSep = true; + pw.println(" Launching content providers:"); + printed = true; + } pw.print(" Launching #"); pw.print(i); pw.print(": "); - pw.println(mLaunchingProviders.get(i)); + pw.println(r); } - needSep = true; } if (mGrantedUriPermissions.size() > 0) { - pw.println(); + if (needSep) pw.println(); + needSep = true; pw.println("Granted Uri Permissions:"); for (int i=0; i<mGrantedUriPermissions.size(); i++) { int uid = mGrantedUriPermissions.keyAt(i); @@ -8977,16 +9230,24 @@ public final class ActivityManagerService extends ActivityManagerNative } boolean dumpPendingIntentsLocked(FileDescriptor fd, PrintWriter pw, String[] args, - int opti, boolean dumpAll) { + int opti, boolean dumpAll, String dumpPackage) { boolean needSep = false; - if (this.mIntentSenderRecords.size() > 0) { - pw.println("ACTIVITY MANAGER PENDING INTENTS (dumpsys activity intents)"); + if (mIntentSenderRecords.size() > 0) { + boolean printed = false; Iterator<WeakReference<PendingIntentRecord>> it = mIntentSenderRecords.values().iterator(); while (it.hasNext()) { WeakReference<PendingIntentRecord> ref = it.next(); PendingIntentRecord rec = ref != null ? ref.get(): null; + if (dumpPackage != null && (rec == null + || !dumpPackage.equals(rec.key.packageName))) { + continue; + } + if (!printed) { + pw.println("ACTIVITY MANAGER PENDING INTENTS (dumpsys activity intents)"); + printed = true; + } needSep = true; if (rec != null) { pw.print(" * "); pw.println(rec); @@ -9003,13 +9264,17 @@ public final class ActivityManagerService extends ActivityManagerNative } private static final void dumpHistoryList(FileDescriptor fd, PrintWriter pw, List list, - String prefix, String label, boolean complete, boolean brief, boolean client) { + String prefix, String label, boolean complete, boolean brief, boolean client, + String dumpPackage) { TaskRecord lastTask = null; boolean needNL = false; final String innerPrefix = prefix + " "; final String[] args = new String[0]; for (int i=list.size()-1; i>=0; i--) { final ActivityRecord r = (ActivityRecord)list.get(i); + if (dumpPackage != null && !dumpPackage.equals(r.packageName)) { + continue; + } final boolean full = !brief && (complete || !r.isInHistory()); if (needNL) { pw.println(" "); @@ -9077,11 +9342,15 @@ public final class ActivityManagerService extends ActivityManagerNative private static final int dumpProcessList(PrintWriter pw, ActivityManagerService service, List list, - String prefix, String normalLabel, String persistentLabel) { + String prefix, String normalLabel, String persistentLabel, + String dumpPackage) { int numPers = 0; final int N = list.size()-1; for (int i=N; i>=0; i--) { ProcessRecord r = (ProcessRecord)list.get(i); + if (dumpPackage != null && !dumpPackage.equals(r.info.packageName)) { + continue; + } pw.println(String.format("%s%s #%2d: %s", prefix, (r.persistent ? persistentLabel : normalLabel), i, r.toString())); @@ -9092,17 +9361,25 @@ public final class ActivityManagerService extends ActivityManagerNative return numPers; } - private static final void dumpProcessOomList(PrintWriter pw, + private static final boolean dumpProcessOomList(PrintWriter pw, ActivityManagerService service, List<ProcessRecord> origList, String prefix, String normalLabel, String persistentLabel, - boolean inclDetails) { + boolean inclDetails, String dumpPackage) { ArrayList<Pair<ProcessRecord, Integer>> list = new ArrayList<Pair<ProcessRecord, Integer>>(origList.size()); for (int i=0; i<origList.size(); i++) { + ProcessRecord r = origList.get(i); + if (dumpPackage != null && !dumpPackage.equals(r.info.packageName)) { + continue; + } list.add(new Pair<ProcessRecord, Integer>(origList.get(i), i)); } + if (list.size() <= 0) { + return false; + } + Comparator<Pair<ProcessRecord, Integer>> comparator = new Comparator<Pair<ProcessRecord, Integer>>() { @Override @@ -9125,8 +9402,7 @@ public final class ActivityManagerService extends ActivityManagerNative final long curUptime = SystemClock.uptimeMillis(); final long uptimeSince = curUptime - service.mLastPowerCheckUptime; - final int N = list.size()-1; - for (int i=N; i>=0; i--) { + for (int i=list.size()-1; i>=0; i--) { ProcessRecord r = list.get(i).first; String oomAdj; if (r.setAdj >= ProcessList.HIDDEN_APP_MIN_ADJ) { @@ -9178,8 +9454,8 @@ public final class ActivityManagerService extends ActivityManagerNative } pw.println(String.format("%s%s #%2d: adj=%s/%s%s trm=%2d %s (%s)", prefix, (r.persistent ? persistentLabel : normalLabel), - N-list.get(i).second, oomAdj, schedGroup, foreground, r.trimMemoryLevel, - r.toShortString(), r.adjType)); + (origList.size()-1)-list.get(i).second, oomAdj, schedGroup, + foreground, r.trimMemoryLevel, r.toShortString(), r.adjType)); if (r.adjSource != null || r.adjTarget != null) { pw.print(prefix); pw.print(" "); @@ -9251,6 +9527,7 @@ public final class ActivityManagerService extends ActivityManagerNative } } } + return true; } ArrayList<ProcessRecord> collectProcesses(PrintWriter pw, int start, String[] args) { @@ -9322,16 +9599,20 @@ public final class ActivityManagerService extends ActivityManagerNative final static class MemItem { final String label; + final String shortLabel; final long pss; + final int id; ArrayList<MemItem> subitems; - public MemItem(String _label, long _pss) { + public MemItem(String _label, String _shortLabel, long _pss, int _id) { label = _label; + shortLabel = _shortLabel; pss = _pss; + id = _id; } } - final void dumpMemItems(PrintWriter pw, String prefix, ArrayList<MemItem> items, + static final void dumpMemItems(PrintWriter pw, String prefix, ArrayList<MemItem> items, boolean sort) { if (sort) { Collections.sort(items, new Comparator<MemItem>() { @@ -9349,16 +9630,56 @@ public final class ActivityManagerService extends ActivityManagerNative for (int i=0; i<items.size(); i++) { MemItem mi = items.get(i); - pw.print(prefix); pw.printf("%7d Kb: ", mi.pss); pw.println(mi.label); + pw.print(prefix); pw.printf("%7d kB: ", mi.pss); pw.println(mi.label); if (mi.subitems != null) { dumpMemItems(pw, prefix + " ", mi.subitems, true); } } } + // These are in KB. + static final long[] DUMP_MEM_BUCKETS = new long[] { + 5*1024, 7*1024, 10*1024, 15*1024, 20*1024, 30*1024, 40*1024, 80*1024, + 120*1024, 160*1024, 200*1024, + 250*1024, 300*1024, 350*1024, 400*1024, 500*1024, 600*1024, 800*1024, + 1*1024*1024, 2*1024*1024, 5*1024*1024, 10*1024*1024, 20*1024*1024 + }; + + static final void appendMemBucket(StringBuilder out, long memKB, String label) { + int start = label.lastIndexOf('.'); + if (start >= 0) start++; + else start = 0; + int end = label.length(); + for (int i=0; i<DUMP_MEM_BUCKETS.length; i++) { + if (DUMP_MEM_BUCKETS[i] >= memKB) { + long bucket = DUMP_MEM_BUCKETS[i]/1024; + out.append(bucket); + out.append("MB "); + out.append(label, start, end); + return; + } + } + out.append(memKB/1024); + out.append("MB "); + out.append(label, start, end); + } + + static final int[] DUMP_MEM_OOM_ADJ = new int[] { + ProcessList.SYSTEM_ADJ, ProcessList.PERSISTENT_PROC_ADJ, ProcessList.FOREGROUND_APP_ADJ, + ProcessList.VISIBLE_APP_ADJ, ProcessList.PERCEPTIBLE_APP_ADJ, ProcessList.HEAVY_WEIGHT_APP_ADJ, + ProcessList.BACKUP_APP_ADJ, ProcessList.SERVICE_ADJ, ProcessList.HOME_APP_ADJ, + ProcessList.PREVIOUS_APP_ADJ, ProcessList.SERVICE_B_ADJ, ProcessList.HIDDEN_APP_MAX_ADJ + }; + static final String[] DUMP_MEM_OOM_LABEL = new String[] { + "System", "Persistent", "Foreground", + "Visible", "Perceptible", "Heavy Weight", + "Backup", "A Services", "Home", "Previous", + "B Services", "Background" + }; + final void dumpApplicationMemoryUsage(FileDescriptor fd, PrintWriter pw, String prefix, String[] args, boolean brief, - PrintWriter categoryPw) { + PrintWriter categoryPw, StringBuilder outTag) { boolean dumpAll = false; boolean oomOnly = false; @@ -9414,20 +9735,9 @@ public final class ActivityManagerService extends ActivityManagerNative long nativePss=0, dalvikPss=0, otherPss=0; long[] miscPss = new long[Debug.MemoryInfo.NUM_OTHER_STATS]; - final int[] oomAdj = new int[] { - ProcessList.SYSTEM_ADJ, ProcessList.PERSISTENT_PROC_ADJ, ProcessList.FOREGROUND_APP_ADJ, - ProcessList.VISIBLE_APP_ADJ, ProcessList.PERCEPTIBLE_APP_ADJ, ProcessList.HEAVY_WEIGHT_APP_ADJ, - ProcessList.BACKUP_APP_ADJ, ProcessList.SERVICE_ADJ, ProcessList.HOME_APP_ADJ, - ProcessList.PREVIOUS_APP_ADJ, ProcessList.SERVICE_B_ADJ, ProcessList.HIDDEN_APP_MAX_ADJ - }; - final String[] oomLabel = new String[] { - "System", "Persistent", "Foreground", - "Visible", "Perceptible", "Heavy Weight", - "Backup", "A Services", "Home", "Previous", - "B Services", "Background" - }; - long oomPss[] = new long[oomLabel.length]; - ArrayList<MemItem>[] oomProcs = (ArrayList<MemItem>[])new ArrayList[oomLabel.length]; + long oomPss[] = new long[DUMP_MEM_OOM_LABEL.length]; + ArrayList<MemItem>[] oomProcs = (ArrayList<MemItem>[]) + new ArrayList[DUMP_MEM_OOM_LABEL.length]; long totalPss = 0; @@ -9457,7 +9767,7 @@ public final class ActivityManagerService extends ActivityManagerNative long myTotalPss = mi.getTotalPss(); totalPss += myTotalPss; MemItem pssItem = new MemItem(r.processName + " (pid " + r.pid + ")", - myTotalPss); + r.processName, myTotalPss, 0); procMems.add(pssItem); nativePss += mi.nativePss; @@ -9470,7 +9780,8 @@ public final class ActivityManagerService extends ActivityManagerNative } for (int oomIndex=0; oomIndex<oomPss.length; oomIndex++) { - if (r.setAdj <= oomAdj[oomIndex] || oomIndex == (oomPss.length-1)) { + if (r.setAdj <= DUMP_MEM_OOM_ADJ[oomIndex] + || oomIndex == (oomPss.length-1)) { oomPss[oomIndex] += myTotalPss; if (oomProcs[oomIndex] == null) { oomProcs[oomIndex] = new ArrayList<MemItem>(); @@ -9486,22 +9797,47 @@ public final class ActivityManagerService extends ActivityManagerNative if (!isCheckinRequest && procs.size() > 1) { ArrayList<MemItem> catMems = new ArrayList<MemItem>(); - catMems.add(new MemItem("Native", nativePss)); - catMems.add(new MemItem("Dalvik", dalvikPss)); - catMems.add(new MemItem("Unknown", otherPss)); + catMems.add(new MemItem("Native", "Native", nativePss, -1)); + catMems.add(new MemItem("Dalvik", "Dalvik", dalvikPss, -2)); + catMems.add(new MemItem("Unknown", "Unknown", otherPss, -3)); for (int j=0; j<Debug.MemoryInfo.NUM_OTHER_STATS; j++) { - catMems.add(new MemItem(Debug.MemoryInfo.getOtherLabel(j), miscPss[j])); + String label = Debug.MemoryInfo.getOtherLabel(j); + catMems.add(new MemItem(label, label, miscPss[j], j)); } ArrayList<MemItem> oomMems = new ArrayList<MemItem>(); for (int j=0; j<oomPss.length; j++) { if (oomPss[j] != 0) { - MemItem item = new MemItem(oomLabel[j], oomPss[j]); + String label = DUMP_MEM_OOM_LABEL[j]; + MemItem item = new MemItem(label, label, oomPss[j], + DUMP_MEM_OOM_ADJ[j]); item.subitems = oomProcs[j]; oomMems.add(item); } } + if (outTag != null) { + appendMemBucket(outTag, totalPss, "total"); + for (int i=0; i<oomMems.size(); i++) { + MemItem miCat = oomMems.get(i); + if (miCat.subitems == null || miCat.subitems.size() < 1) { + continue; + } + if (miCat.id < ProcessList.SERVICE_ADJ + || miCat.id == ProcessList.HOME_APP_ADJ + || miCat.id == ProcessList.PREVIOUS_APP_ADJ) { + outTag.append(" / "); + for (int j=0; j<miCat.subitems.size(); j++) { + MemItem mi = miCat.subitems.get(j); + if (j > 0) { + outTag.append(" "); + } + appendMemBucket(outTag, mi.pss, mi.shortLabel); + } + } + } + } + if (!brief && !oomOnly) { pw.println(); pw.println("Total PSS by process:"); @@ -9517,7 +9853,7 @@ public final class ActivityManagerService extends ActivityManagerNative dumpMemItems(out, " ", catMems, true); } pw.println(); - pw.print("Total PSS: "); pw.print(totalPss); pw.println(" Kb"); + pw.print("Total PSS: "); pw.print(totalPss); pw.println(" kB"); } } @@ -12934,7 +13270,7 @@ public final class ActivityManagerService extends ActivityManagerNative synchronized(this) { final long origId = Binder.clearCallingIdentity(); - updateConfigurationLocked(values, null, true); + updateConfigurationLocked(values, null, true, false); Binder.restoreCallingIdentity(origId); } } @@ -12957,7 +13293,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (values != null) { Settings.System.clearConfiguration(values); } - updateConfigurationLocked(values, null, false); + updateConfigurationLocked(values, null, false, false); Binder.restoreCallingIdentity(origId); } } @@ -12971,7 +13307,7 @@ public final class ActivityManagerService extends ActivityManagerNative * @param persistent TODO */ public boolean updateConfigurationLocked(Configuration values, - ActivityRecord starting, boolean persistent) { + ActivityRecord starting, boolean persistent, boolean initLocale) { int changes = 0; boolean kept = true; @@ -12986,7 +13322,7 @@ public final class ActivityManagerService extends ActivityManagerNative EventLog.writeEvent(EventLogTags.CONFIGURATION_CHANGED, changes); - if (values.locale != null) { + if (values.locale != null && !initLocale) { saveLocaleLocked(values.locale, !values.locale.equals(mConfiguration.locale), values.userSetLocale); @@ -12999,10 +13335,12 @@ public final class ActivityManagerService extends ActivityManagerNative newConfig.seq = mConfigurationSeq; mConfiguration = newConfig; Slog.i(TAG, "Config changed: " + newConfig); - + + final Configuration configCopy = new Configuration(mConfiguration); + AttributeCache ac = AttributeCache.instance(); if (ac != null) { - ac.updateConfiguration(mConfiguration); + ac.updateConfiguration(configCopy); } // Make sure all resources in our process are updated @@ -13012,11 +13350,11 @@ public final class ActivityManagerService extends ActivityManagerNative // boot, where the first config change needs to guarantee // all resources have that config before following boot // code is executed. - mSystemThread.applyConfigurationToResources(newConfig); + mSystemThread.applyConfigurationToResources(configCopy); if (persistent && Settings.System.hasInterestingConfigurationChanges(changes)) { Message msg = mHandler.obtainMessage(UPDATE_CONFIGURATION_MSG); - msg.obj = new Configuration(mConfiguration); + msg.obj = new Configuration(configCopy); mHandler.sendMessage(msg); } @@ -13026,7 +13364,7 @@ public final class ActivityManagerService extends ActivityManagerNative if (app.thread != null) { if (DEBUG_CONFIGURATION) Slog.v(TAG, "Sending to proc " + app.processName + " new config " + mConfiguration); - app.thread.scheduleConfigurationChanged(mConfiguration); + app.thread.scheduleConfigurationChanged(configCopy); } } catch (Exception e) { } @@ -13965,7 +14303,6 @@ public final class ActivityManagerService extends ActivityManagerNative // application processes based on their current state. int i = mLruProcesses.size(); int curHiddenAdj = ProcessList.HIDDEN_APP_MIN_ADJ; - int numBg = 0; while (i > 0) { i--; ProcessRecord app = mLruProcesses.get(i); @@ -13989,12 +14326,7 @@ public final class ActivityManagerService extends ActivityManagerNative app.processName, app.setAdj, "too many background"); app.killedBackground = true; Process.killProcessQuiet(app.pid); - } else { - numBg++; } - } else if (app.curAdj >= ProcessList.HOME_APP_ADJ - && app.curAdj != ProcessList.SERVICE_B_ADJ) { - numBg++; } } } @@ -14009,12 +14341,18 @@ public final class ActivityManagerService extends ActivityManagerNative // memory they want. if (numHidden <= (ProcessList.MAX_HIDDEN_APPS/2)) { final int N = mLruProcesses.size(); - factor = numBg/3; + factor = numHidden/3; + int minFactor = 2; + if (mHomeProcess != null) minFactor++; + if (mPreviousProcess != null) minFactor++; + if (factor < minFactor) factor = minFactor; step = 0; int curLevel = ComponentCallbacks2.TRIM_MEMORY_COMPLETE; for (i=0; i<N; i++) { ProcessRecord app = mLruProcesses.get(i); - if (app.curAdj >= ProcessList.HIDDEN_APP_MIN_ADJ && !app.killedBackground) { + if (app.curAdj >= ProcessList.HOME_APP_ADJ + && app.curAdj != ProcessList.SERVICE_B_ADJ + && !app.killedBackground) { if (app.trimMemoryLevel < curLevel && app.thread != null) { try { app.thread.scheduleTrimMemory(curLevel); diff --git a/services/java/com/android/server/am/ActivityStack.java b/services/java/com/android/server/am/ActivityStack.java index c892cb1..c7ce3c3 100644 --- a/services/java/com/android/server/am/ActivityStack.java +++ b/services/java/com/android/server/am/ActivityStack.java @@ -528,7 +528,7 @@ final class ActivityStack { Configuration config = mService.mWindowManager.updateOrientationFromAppTokens( mService.mConfiguration, r.mayFreezeScreenLocked(app) ? r.appToken : null); - mService.updateConfigurationLocked(config, r, false); + mService.updateConfigurationLocked(config, r, false, false); } r.app = app; @@ -590,7 +590,8 @@ final class ActivityStack { } } app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken, - System.identityHashCode(r), r.info, mService.mConfiguration, + System.identityHashCode(r), r.info, + new Configuration(mService.mConfiguration), r.compat, r.icicle, results, newIntents, !andResume, mService.isNextTransitionForward(), profileFile, profileFd, profileAutoStop); @@ -1460,7 +1461,7 @@ final class ActivityStack { if (config != null) { next.frozenBeforeDestroy = true; } - updated = mService.updateConfigurationLocked(config, next, false); + updated = mService.updateConfigurationLocked(config, next, false, false); } } if (!updated) { @@ -2917,7 +2918,7 @@ final class ActivityStack { mConfigWillChange = false; if (DEBUG_CONFIGURATION) Slog.v(TAG, "Updating to new configuration after starting activity."); - mService.updateConfigurationLocked(config, null, false); + mService.updateConfigurationLocked(config, null, false, false); } Binder.restoreCallingIdentity(origId); @@ -4190,7 +4191,7 @@ final class ActivityStack { if (DEBUG_SWITCH) Slog.i(TAG, "Switch is restarting resumed " + r); r.forceNewConfig = false; r.app.thread.scheduleRelaunchActivity(r.appToken, results, newIntents, - changes, !andResume, mService.mConfiguration); + changes, !andResume, new Configuration(mService.mConfiguration)); // Note: don't need to call pauseIfSleepingLocked() here, because // the caller will only pass in 'andResume' if this activity is // currently resumed, which implies we aren't sleeping. diff --git a/services/java/com/android/server/am/ContentProviderRecord.java b/services/java/com/android/server/am/ContentProviderRecord.java index 9c55597..3835553 100644 --- a/services/java/com/android/server/am/ContentProviderRecord.java +++ b/services/java/com/android/server/am/ContentProviderRecord.java @@ -73,12 +73,15 @@ class ContentProviderRecord extends ContentProviderHolder { pw.print("multiprocess="); pw.print(info.multiprocess); pw.print(" initOrder="); pw.println(info.initOrder); } - if (clients.size() > 0) { - pw.print(prefix); pw.print("clients="); pw.println(clients); - } if (externals != 0) { pw.print(prefix); pw.print("externals="); pw.println(externals); } + if (clients.size() > 0) { + pw.print(prefix); pw.println("Clients:"); + for (ProcessRecord cproc : clients) { + pw.print(prefix); pw.print(" - "); pw.println(cproc.toShortString()); + } + } } public String toString() { diff --git a/services/java/com/android/server/net/NetworkPolicyManagerService.java b/services/java/com/android/server/net/NetworkPolicyManagerService.java index 2a1b1db..8c0f1e0 100644 --- a/services/java/com/android/server/net/NetworkPolicyManagerService.java +++ b/services/java/com/android/server/net/NetworkPolicyManagerService.java @@ -393,6 +393,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // on background handler thread, and verified // READ_NETWORK_USAGE_HISTORY permission above. + maybeRefreshTrustedTime(); synchronized (mRulesLock) { updateNetworkEnabledLocked(); updateNotificationsLocked(); @@ -445,7 +446,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // cycle boundary to recompute notifications. // examine stats for each active policy - final long currentTime = currentTimeMillis(true); + final long currentTime = currentTimeMillis(); for (NetworkPolicy policy : mNetworkPolicy.values()) { // ignore policies that aren't relevant to user if (!isTemplateRelevant(policy.template)) continue; @@ -683,6 +684,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { public void onReceive(Context context, Intent intent) { // on background handler thread, and verified CONNECTIVITY_INTERNAL // permission above. + + maybeRefreshTrustedTime(); synchronized (mRulesLock) { ensureActiveMobilePolicyLocked(); updateNetworkEnabledLocked(); @@ -702,7 +705,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // TODO: reset any policy-disabled networks when any policy is removed // completely, which is currently rare case. - final long currentTime = currentTimeMillis(true); + final long currentTime = currentTimeMillis(); for (NetworkPolicy policy : mNetworkPolicy.values()) { // shortcut when policy has no limit if (policy.limitBytes == LIMIT_DISABLED) { @@ -802,7 +805,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { // apply each policy that we found ifaces for; compute remaining data // based on current cycle and historical stats, and push to kernel. - final long currentTime = currentTimeMillis(true); + final long currentTime = currentTimeMillis(); for (NetworkPolicy policy : mNetworkRules.keySet()) { final String[] ifaces = mNetworkRules.get(policy); @@ -1092,6 +1095,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { public void setNetworkPolicies(NetworkPolicy[] policies) { mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); + maybeRefreshTrustedTime(); synchronized (mRulesLock) { mNetworkPolicy.clear(); for (NetworkPolicy policy : policies) { @@ -1119,7 +1123,8 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { public void snoozePolicy(NetworkTemplate template) { mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); - final long currentTime = currentTimeMillis(true); + maybeRefreshTrustedTime(); + final long currentTime = currentTimeMillis(); synchronized (mRulesLock) { // find and snooze local policy that matches final NetworkPolicy policy = mNetworkPolicy.get(template); @@ -1140,6 +1145,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { public void setRestrictBackground(boolean restrictBackground) { mContext.enforceCallingOrSelfPermission(MANAGE_NETWORK_POLICY, TAG); + maybeRefreshTrustedTime(); synchronized (mRulesLock) { mRestrictBackground = restrictBackground; updateRulesForRestrictBackgroundLocked(); @@ -1193,7 +1199,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { return null; } - final long currentTime = currentTimeMillis(false); + final long currentTime = currentTimeMillis(); // find total bytes used under policy final long start = computeLastCycleBoundary(currentTime, policy); @@ -1472,6 +1478,7 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { case MSG_LIMIT_REACHED: { final String iface = (String) msg.obj; + maybeRefreshTrustedTime(); synchronized (mRulesLock) { if (mMeteredIfaces.contains(iface)) { try { @@ -1551,12 +1558,16 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub { } } - private long currentTimeMillis(boolean allowRefresh) { - // try refreshing time source when stale - if (mTime.getCacheAge() > TIME_CACHE_MAX_AGE && allowRefresh) { + /** + * Try refreshing {@link #mTime} when stale. + */ + private void maybeRefreshTrustedTime() { + if (mTime.getCacheAge() > TIME_CACHE_MAX_AGE) { mTime.forceRefresh(); } + } + private long currentTimeMillis() { return mTime.hasCache() ? mTime.currentTimeMillis() : System.currentTimeMillis(); } diff --git a/services/java/com/android/server/net/NetworkStatsService.java b/services/java/com/android/server/net/NetworkStatsService.java index 6365525..871ed68 100644 --- a/services/java/com/android/server/net/NetworkStatsService.java +++ b/services/java/com/android/server/net/NetworkStatsService.java @@ -203,6 +203,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub { /** Set of historical {@code xtables} stats for known UIDs. */ private HashMap<UidStatsKey, NetworkStatsHistory> mUidStats = Maps.newHashMap(); + /** Flag if {@link #mNetworkDevStats} have been loaded from disk. */ + private boolean mNetworkStatsLoaded = false; /** Flag if {@link #mUidStats} have been loaded from disk. */ private boolean mUidStatsLoaded = false; @@ -272,6 +274,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // until actually needed. readNetworkDevStatsLocked(); readNetworkXtStatsLocked(); + mNetworkStatsLoaded = true; } // bootstrap initial stats to prevent double-counting later @@ -322,14 +325,17 @@ public class NetworkStatsService extends INetworkStatsService.Stub { mTeleManager.listen(mPhoneListener, LISTEN_NONE); - writeNetworkDevStatsLocked(); - writeNetworkXtStatsLocked(); + if (mNetworkStatsLoaded) { + writeNetworkDevStatsLocked(); + writeNetworkXtStatsLocked(); + } if (mUidStatsLoaded) { writeUidStatsLocked(); } mNetworkDevStats.clear(); mNetworkXtStats.clear(); mUidStats.clear(); + mNetworkStatsLoaded = false; mUidStatsLoaded = false; } @@ -472,6 +478,18 @@ public class NetworkStatsService extends INetworkStatsService.Stub { } } + private long getHistoryStartLocked( + NetworkTemplate template, HashMap<NetworkIdentitySet, NetworkStatsHistory> source) { + long start = Long.MAX_VALUE; + for (NetworkIdentitySet ident : source.keySet()) { + if (templateMatches(template, ident)) { + final NetworkStatsHistory history = source.get(ident); + start = Math.min(start, history.getStart()); + } + } + return start; + } + @Override public NetworkStats getSummaryForAllUid( NetworkTemplate template, long start, long end, boolean includeTags) { @@ -771,6 +789,12 @@ public class NetworkStatsService extends INetworkStatsService.Stub { private void performPoll(int flags) { synchronized (mStatsLock) { mWakeLock.acquire(); + + // try refreshing time source when stale + if (mTime.getCacheAge() > mSettings.getTimeCacheMaxAge()) { + mTime.forceRefresh(); + } + try { performPollLocked(flags); } finally { @@ -791,11 +815,6 @@ public class NetworkStatsService extends INetworkStatsService.Stub { final boolean persistUid = (flags & FLAG_PERSIST_UID) != 0; final boolean persistForce = (flags & FLAG_PERSIST_FORCE) != 0; - // try refreshing time source when stale - if (mTime.getCacheAge() > mSettings.getTimeCacheMaxAge()) { - mTime.forceRefresh(); - } - // TODO: consider marking "untrusted" times in historical stats final long currentTime = mTime.hasCache() ? mTime.currentTimeMillis() : System.currentTimeMillis(); @@ -981,6 +1000,7 @@ public class NetworkStatsService extends INetworkStatsService.Stub { final long start = end - largestBucketSize; final long trustedTime = mTime.hasCache() ? mTime.currentTimeMillis() : -1; + long devHistoryStart = Long.MAX_VALUE; NetworkTemplate template = null; NetworkStats.Entry devTotal = null; @@ -990,24 +1010,27 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // collect mobile sample template = buildTemplateMobileAll(getActiveSubscriberId(mContext)); devTotal = getSummaryForNetworkDev(template, start, end).getTotal(devTotal); + devHistoryStart = getHistoryStartLocked(template, mNetworkDevStats); xtTotal = getSummaryForNetworkXt(template, start, end).getTotal(xtTotal); uidTotal = getSummaryForAllUid(template, start, end, false).getTotal(uidTotal); + EventLogTags.writeNetstatsMobileSample( devTotal.rxBytes, devTotal.rxPackets, devTotal.txBytes, devTotal.txPackets, xtTotal.rxBytes, xtTotal.rxPackets, xtTotal.txBytes, xtTotal.txPackets, uidTotal.rxBytes, uidTotal.rxPackets, uidTotal.txBytes, uidTotal.txPackets, - trustedTime); + trustedTime, devHistoryStart); // collect wifi sample template = buildTemplateWifi(); devTotal = getSummaryForNetworkDev(template, start, end).getTotal(devTotal); + devHistoryStart = getHistoryStartLocked(template, mNetworkDevStats); xtTotal = getSummaryForNetworkXt(template, start, end).getTotal(xtTotal); uidTotal = getSummaryForAllUid(template, start, end, false).getTotal(uidTotal); EventLogTags.writeNetstatsWifiSample( devTotal.rxBytes, devTotal.rxPackets, devTotal.txBytes, devTotal.txPackets, xtTotal.rxBytes, xtTotal.rxPackets, xtTotal.txBytes, xtTotal.txPackets, uidTotal.rxBytes, uidTotal.rxPackets, uidTotal.txBytes, uidTotal.txPackets, - trustedTime); + trustedTime, devHistoryStart); } /** @@ -1243,10 +1266,28 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // trim any history beyond max if (mTime.hasCache()) { - final long currentTime = mTime.currentTimeMillis(); + final long systemCurrentTime = System.currentTimeMillis(); + final long trustedCurrentTime = mTime.currentTimeMillis(); + + final long currentTime = Math.min(systemCurrentTime, trustedCurrentTime); final long maxHistory = mSettings.getNetworkMaxHistory(); + for (NetworkStatsHistory history : input.values()) { + final int beforeSize = history.size(); history.removeBucketsBefore(currentTime - maxHistory); + final int afterSize = history.size(); + + if (beforeSize > 24 && afterSize < beforeSize / 2) { + // yikes, dropping more than half of significant history + final StringBuilder builder = new StringBuilder(); + builder.append("yikes, dropping more than half of history").append('\n'); + builder.append("systemCurrentTime=").append(systemCurrentTime).append('\n'); + builder.append("trustedCurrentTime=").append(trustedCurrentTime).append('\n'); + builder.append("maxHistory=").append(maxHistory).append('\n'); + builder.append("beforeSize=").append(beforeSize).append('\n'); + builder.append("afterSize=").append(afterSize).append('\n'); + mDropBox.addText(TAG_NETSTATS_ERROR, builder.toString()); + } } } @@ -1287,7 +1328,8 @@ public class NetworkStatsService extends INetworkStatsService.Stub { // trim any history beyond max if (mTime.hasCache()) { - final long currentTime = mTime.currentTimeMillis(); + final long currentTime = Math.min( + System.currentTimeMillis(), mTime.currentTimeMillis()); final long maxUidHistory = mSettings.getUidMaxHistory(); final long maxTagHistory = mSettings.getTagMaxHistory(); for (UidStatsKey key : mUidStats.keySet()) { diff --git a/services/java/com/android/server/pm/PackageManagerService.java b/services/java/com/android/server/pm/PackageManagerService.java index 0e9f64c..7005541 100644 --- a/services/java/com/android/server/pm/PackageManagerService.java +++ b/services/java/com/android/server/pm/PackageManagerService.java @@ -7947,7 +7947,7 @@ public class PackageManagerService extends IPackageManager.Stub { if (dumpState.isDumping(DumpState.DUMP_PROVIDERS)) { boolean printedSomething = false; - for (PackageParser.Provider p : mProviders.values()) { + for (PackageParser.Provider p : mProvidersByComponent.values()) { if (packageName != null && !packageName.equals(p.info.packageName)) { continue; } @@ -7957,8 +7957,23 @@ public class PackageManagerService extends IPackageManager.Stub { pw.println("Registered ContentProviders:"); printedSomething = true; } - pw.print(" ["); pw.print(p.info.authority); pw.print("]: "); - pw.println(p.toString()); + pw.print(" "); pw.print(p.getComponentShortName()); pw.println(":"); + pw.print(" "); pw.println(p.toString()); + } + printedSomething = false; + for (Map.Entry<String, PackageParser.Provider> entry : mProviders.entrySet()) { + PackageParser.Provider p = entry.getValue(); + if (packageName != null && !packageName.equals(p.info.packageName)) { + continue; + } + if (!printedSomething) { + if (dumpState.onTitlePrinted()) + pw.println(" "); + pw.println("ContentProvider Authorities:"); + printedSomething = true; + } + pw.print(" ["); pw.print(entry.getKey()); pw.println("]:"); + pw.print(" "); pw.println(p.toString()); } } diff --git a/services/java/com/android/server/wm/WindowManagerService.java b/services/java/com/android/server/wm/WindowManagerService.java index 50321b3..ebb13d5 100644 --- a/services/java/com/android/server/wm/WindowManagerService.java +++ b/services/java/com/android/server/wm/WindowManagerService.java @@ -5090,10 +5090,22 @@ public class WindowManagerService extends IWindowManager.Stub // Constrain thumbnail to smaller of screen width or height. Assumes aspect // of thumbnail is the same as the screen (in landscape) or square. + float targetWidthScale = width / (float) fw; + float targetHeightScale = height / (float) fh; if (dw <= dh) { - scale = width / (float) fw; // portrait + scale = targetWidthScale; + // If aspect of thumbnail is the same as the screen (in landscape), + // select the slightly larger value so we fill the entire bitmap + if (targetHeightScale > scale && (int) (targetHeightScale * fw) == width) { + scale = targetHeightScale; + } } else { - scale = height / (float) fh; // landscape + scale = targetHeightScale; + // If aspect of thumbnail is the same as the screen (in landscape), + // select the slightly larger value so we fill the entire bitmap + if (targetWidthScale > scale && (int) (targetWidthScale * fh) == height) { + scale = targetWidthScale; + } } // The screen shot will contain the entire screen. |
