RunningState.java revision 728ac35373028b79205a788c526ef4b495518ec1
1728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn/* 2728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * Copyright (C) 2010 The Android Open Source Project 3728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * 4728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * Licensed under the Apache License, Version 2.0 (the "License"); 5728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * you may not use this file except in compliance with the License. 6728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * You may obtain a copy of the License at 7728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * 8728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * http://www.apache.org/licenses/LICENSE-2.0 9728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * 10728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * Unless required by applicable law or agreed to in writing, software 11728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * distributed under the License is distributed on an "AS IS" BASIS, 12728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * See the License for the specific language governing permissions and 14728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * limitations under the License. 15728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn */ 16728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 17728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpackage com.android.settings.applications; 18728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 19728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport com.android.settings.R; 20728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 21728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.ActivityManager; 22728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.app.ActivityManagerNative; 23728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.ComponentName; 24728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.Context; 25728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ApplicationInfo; 26728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageInfo; 27728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageItemInfo; 28728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.PackageManager; 29728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.pm.ServiceInfo; 30728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.content.res.Resources; 31728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.Debug; 32728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.os.RemoteException; 33728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.text.format.Formatter; 34728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.util.Log; 35728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport android.util.SparseArray; 36728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 37728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.ArrayList; 38728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.Collections; 39728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.Comparator; 40728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.HashMap; 41728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.Iterator; 42728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornimport java.util.List; 43728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 44728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn/** 45728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * Singleton for retrieving and monitoring the state about all running 46728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn * applications/processes/services. 47728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn */ 48728ac35373028b79205a788c526ef4b495518ec1Dianne Hackbornpublic class RunningState { 49728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 50728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final SparseArray<HashMap<String, ProcessItem>> mProcesses 51728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn = new SparseArray<HashMap<String, ProcessItem>>(); 52728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final SparseArray<ProcessItem> mActiveProcesses 53728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn = new SparseArray<ProcessItem>(); 54728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final ServiceProcessComparator mServiceProcessComparator 55728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn = new ServiceProcessComparator(); 56728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 57728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Temporary for finding process dependencies. 58728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final SparseArray<ProcessItem> mRunningProcesses 59728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn = new SparseArray<ProcessItem>(); 60728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 61728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final ArrayList<ProcessItem> mProcessItems = new ArrayList<ProcessItem>(); 62728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final ArrayList<ProcessItem> mAllProcessItems = new ArrayList<ProcessItem>(); 63728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 64728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int mSequence = 0; 65728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 66728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // ----- following protected by mLock ----- 67728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 68728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Lock for protecting the state that will be shared between the 69728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // background update thread and the UI thread. 70728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final Object mLock = new Object(); 71728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 72728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ArrayList<BaseItem> mItems = new ArrayList<BaseItem>(); 73728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ArrayList<MergedItem> mMergedItems = new ArrayList<MergedItem>(); 74728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 75728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int mNumBackgroundProcesses; 76728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn long mBackgroundProcessMemory; 77728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int mNumForegroundProcesses; 78728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn long mForegroundProcessMemory; 79728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int mNumServiceProcesses; 80728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn long mServiceProcessMemory; 81728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 82728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn static class BaseItem { 83728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final boolean mIsProcess; 84728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 85728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn PackageItemInfo mPackageInfo; 86728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn CharSequence mDisplayLabel; 87728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn String mLabel; 88728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn String mDescription; 89728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 90728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int mCurSeq; 91728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 92728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn long mActiveSince; 93728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn long mSize; 94728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn String mSizeStr; 95728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn String mCurSizeStr; 96728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean mNeedDivider; 97728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 98728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public BaseItem(boolean isProcess) { 99728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mIsProcess = isProcess; 100728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 101728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 102728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 103728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn static class ServiceItem extends BaseItem { 104728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ActivityManager.RunningServiceInfo mRunningService; 105728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ServiceInfo mServiceInfo; 106728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean mShownAsStarted; 107728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 108728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn MergedItem mMergedItem; 109728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 110728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public ServiceItem() { 111728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super(false); 112728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 113728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 114728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 115728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn static class ProcessItem extends BaseItem { 116728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final HashMap<ComponentName, ServiceItem> mServices 117728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn = new HashMap<ComponentName, ServiceItem>(); 118728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final SparseArray<ProcessItem> mDependentProcesses 119728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn = new SparseArray<ProcessItem>(); 120728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 121728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final int mUid; 122728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final String mProcessName; 123728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int mPid; 124728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 125728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ProcessItem mClient; 126728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int mLastNumDependentProcesses; 127728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 128728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int mRunningSeq; 129728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ActivityManager.RunningAppProcessInfo mRunningProcessInfo; 130728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 131728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Purely for sorting. 132728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean mIsSystem; 133728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean mIsStarted; 134728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn long mActiveSince; 135728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 136728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public ProcessItem(Context context, int uid, String processName) { 137728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super(true); 138728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mDescription = context.getResources().getString( 139728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn R.string.service_process_name, processName); 140728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mUid = uid; 141728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mProcessName = processName; 142728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 143728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 144728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn void ensureLabel(PackageManager pm) { 145728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mLabel != null) { 146728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return; 147728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 148728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 149728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn try { 150728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ApplicationInfo ai = pm.getApplicationInfo(mProcessName, 0); 151728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (ai.uid == mUid) { 152728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mDisplayLabel = ai.loadLabel(pm); 153728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mLabel = mDisplayLabel.toString(); 154728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mPackageInfo = ai; 155728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return; 156728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 157728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 158728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 159728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 160728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // If we couldn't get information about the overall 161728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // process, try to find something about the uid. 162728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn String[] pkgs = pm.getPackagesForUid(mUid); 163728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 164728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // If there is one package with this uid, that is what we want. 165728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (pkgs.length == 1) { 166728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn try { 167728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], 0); 168728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mDisplayLabel = ai.loadLabel(pm); 169728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mLabel = mDisplayLabel.toString(); 170728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mPackageInfo = ai; 171728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return; 172728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 173728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 174728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 175728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 176728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // If there are multiple, see if one gives us the official name 177728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // for this uid. 178728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (String name : pkgs) { 179728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn try { 180728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn PackageInfo pi = pm.getPackageInfo(name, 0); 181728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (pi.sharedUserLabel != 0) { 182728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn CharSequence nm = pm.getText(name, 183728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn pi.sharedUserLabel, pi.applicationInfo); 184728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (nm != null) { 185728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mDisplayLabel = nm; 186728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mLabel = nm.toString(); 187728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mPackageInfo = pi.applicationInfo; 188728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return; 189728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 190728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 191728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 192728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 193728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 194728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 195728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // If still don't have anything to display, just use the 196728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // service info. 197728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mServices.size() > 0) { 198728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mPackageInfo = mServices.values().iterator().next() 199728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn .mServiceInfo.applicationInfo; 200728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mDisplayLabel = mPackageInfo.loadLabel(pm); 201728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mLabel = mDisplayLabel.toString(); 202728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return; 203728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 204728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 205728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Finally... whatever, just pick the first package's name. 206728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn try { 207728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ApplicationInfo ai = pm.getApplicationInfo(pkgs[0], 0); 208728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mDisplayLabel = ai.loadLabel(pm); 209728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mLabel = mDisplayLabel.toString(); 210728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mPackageInfo = ai; 211728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return; 212728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 213728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 214728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 215728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 216728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean updateService(Context context, 217728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ActivityManager.RunningServiceInfo service) { 218728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final PackageManager pm = context.getPackageManager(); 219728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 220728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean changed = false; 221728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ServiceItem si = mServices.get(service.service); 222728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (si == null) { 223728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn changed = true; 224728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si = new ServiceItem(); 225728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si.mRunningService = service; 226728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn try { 227728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si.mServiceInfo = pm.getServiceInfo(service.service, 0); 228728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 229728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 230728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si.mDisplayLabel = makeLabel(pm, 231728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si.mRunningService.service.getClassName(), si.mServiceInfo); 232728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mLabel = mDisplayLabel != null ? mDisplayLabel.toString() : null; 233728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si.mPackageInfo = si.mServiceInfo.applicationInfo; 234728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mServices.put(service.service, si); 235728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 236728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si.mCurSeq = mCurSeq; 237728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si.mRunningService = service; 238728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn long activeSince = service.restarting == 0 ? service.activeSince : -1; 239728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (si.mActiveSince != activeSince) { 240728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si.mActiveSince = activeSince; 241728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn changed = true; 242728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 243728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (service.clientPackage != null && service.clientLabel != 0) { 244728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (si.mShownAsStarted) { 245728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si.mShownAsStarted = false; 246728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn changed = true; 247728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 248728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn try { 249728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Resources clientr = pm.getResourcesForApplication(service.clientPackage); 250728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn String label = clientr.getString(service.clientLabel); 251728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si.mDescription = context.getResources().getString( 252728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn R.string.service_client_name, label); 253728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (PackageManager.NameNotFoundException e) { 254728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si.mDescription = null; 255728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 256728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else { 257728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (!si.mShownAsStarted) { 258728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si.mShownAsStarted = true; 259728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn changed = true; 260728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 261728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si.mDescription = context.getResources().getString( 262728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn R.string.service_started_by_app); 263728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 264728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 265728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return changed; 266728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 267728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 268728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean updateSize(Context context, Debug.MemoryInfo mem, int curSeq) { 269728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSize = ((long)mem.getTotalPss()) * 1024; 270728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mCurSeq == curSeq) { 271728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn String sizeStr = Formatter.formatShortFileSize( 272728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn context, mSize); 273728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (!sizeStr.equals(mSizeStr)){ 274728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSizeStr = sizeStr; 275728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // We update this on the second tick where we update just 276728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // the text in the current items, so no need to say we 277728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // changed here. 278728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return false; 279728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 280728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 281728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return false; 282728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 283728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 284728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean buildDependencyChain(Context context, PackageManager pm, int curSeq) { 285728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final int NP = mDependentProcesses.size(); 286728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean changed = false; 287728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<NP; i++) { 288728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ProcessItem proc = mDependentProcesses.valueAt(i); 289728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (proc.mClient != this) { 290728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn changed = true; 291728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn proc.mClient = this; 292728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 293728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn proc.mCurSeq = curSeq; 294728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn proc.ensureLabel(pm); 295728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn changed |= proc.buildDependencyChain(context, pm, curSeq); 296728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 297728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 298728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mLastNumDependentProcesses != mDependentProcesses.size()) { 299728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn changed = true; 300728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mLastNumDependentProcesses = mDependentProcesses.size(); 301728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 302728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 303728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return changed; 304728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 305728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 306728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn void addDependentProcesses(ArrayList<BaseItem> dest, 307728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ArrayList<ProcessItem> destProc) { 308728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final int NP = mDependentProcesses.size(); 309728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<NP; i++) { 310728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ProcessItem proc = mDependentProcesses.valueAt(i); 311728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn proc.addDependentProcesses(dest, destProc); 312728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn dest.add(proc); 313728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (proc.mPid > 0) { 314728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn destProc.add(proc); 315728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 316728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 317728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 318728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 319728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 320728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn static class MergedItem extends BaseItem { 321728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ProcessItem mProcess; 322728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final ArrayList<ProcessItem> mOtherProcesses = new ArrayList<ProcessItem>(); 323728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final ArrayList<ServiceItem> mServices = new ArrayList<ServiceItem>(); 324728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 325728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn MergedItem() { 326728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn super(false); 327728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 328728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 329728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean update(Context context) { 330728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mPackageInfo = mProcess.mPackageInfo; 331728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mDisplayLabel = mProcess.mDisplayLabel; 332728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mLabel = mProcess.mLabel; 333728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 334728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int numProcesses = (mProcess.mPid > 0 ? 1 : 0) + mOtherProcesses.size(); 335728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int numServices = mServices.size(); 336728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int resid = R.string.running_processes_item_description_s_s; 337728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (numProcesses != 1) { 338728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn resid = numServices != 1 339728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ? R.string.running_processes_item_description_p_p 340728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn : R.string.running_processes_item_description_p_s; 341728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else if (numServices != 1) { 342728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn resid = R.string.running_processes_item_description_s_p; 343728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 344728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mDescription = context.getResources().getString(resid, numProcesses, numServices); 345728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 346728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActiveSince = -1; 347728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<mServices.size(); i++) { 348728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ServiceItem si = mServices.get(i); 349728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (si.mActiveSince >= 0 && mActiveSince < si.mActiveSince) { 350728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActiveSince = si.mActiveSince; 351728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 352728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 353728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 354728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return false; 355728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 356728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 357728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean updateSize(Context context) { 358728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSize = mProcess.mSize; 359728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<mOtherProcesses.size(); i++) { 360728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSize += mOtherProcesses.get(i).mSize; 361728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 362728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 363728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn String sizeStr = Formatter.formatShortFileSize( 364728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn context, mSize); 365728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (!sizeStr.equals(mSizeStr)){ 366728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSizeStr = sizeStr; 367728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // We update this on the second tick where we update just 368728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // the text in the current items, so no need to say we 369728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // changed here. 370728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return false; 371728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 372728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return false; 373728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 374728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 375728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 376728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn static class ServiceProcessComparator implements Comparator<ProcessItem> { 377728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn public int compare(ProcessItem object1, ProcessItem object2) { 378728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (object1.mIsStarted != object2.mIsStarted) { 379728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Non-started processes go last. 380728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return object1.mIsStarted ? -1 : 1; 381728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 382728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (object1.mIsSystem != object2.mIsSystem) { 383728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // System processes go below non-system. 384728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return object1.mIsSystem ? 1 : -1; 385728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 386728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (object1.mActiveSince != object2.mActiveSince) { 387728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Remaining ones are sorted with the longest running 388728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // services last. 389728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return (object1.mActiveSince > object2.mActiveSince) ? -1 : 1; 390728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 391728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return 0; 392728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 393728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 394728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 395728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn static CharSequence makeLabel(PackageManager pm, 396728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn String className, PackageItemInfo item) { 397728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (item != null && (item.labelRes != 0 398728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn || item.nonLocalizedLabel != null)) { 399728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn CharSequence label = item.loadLabel(pm); 400728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (label != null) { 401728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return label; 402728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 403728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 404728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 405728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn String label = className; 406728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int tail = label.lastIndexOf('.'); 407728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (tail >= 0) { 408728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn label = label.substring(tail+1, label.length()); 409728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 410728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return label; 411728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 412728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 413728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean update(Context context, ActivityManager am) { 414728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final PackageManager pm = context.getPackageManager(); 415728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 416728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mSequence++; 417728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 418728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean changed = false; 419728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 420728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn List<ActivityManager.RunningServiceInfo> services 421728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn = am.getRunningServices(RunningServices.MAX_SERVICES); 422728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final int NS = services != null ? services.size() : 0; 423728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<NS; i++) { 424728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ActivityManager.RunningServiceInfo si = services.get(i); 425728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // We are not interested in services that have not been started 426728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // and don't have a known client, because 427728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // there is nothing the user can do about them. 428728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (!si.started && si.clientLabel == 0) { 429728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn continue; 430728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 431728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // We likewise don't care about services running in a 432728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // persistent process like the system or phone. 433728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if ((si.flags&ActivityManager.RunningServiceInfo.FLAG_PERSISTENT_PROCESS) 434728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn != 0) { 435728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn continue; 436728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 437728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 438728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn HashMap<String, ProcessItem> procs = mProcesses.get(si.uid); 439728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (procs == null) { 440728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn procs = new HashMap<String, ProcessItem>(); 441728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mProcesses.put(si.uid, procs); 442728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 443728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ProcessItem proc = procs.get(si.process); 444728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (proc == null) { 445728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn changed = true; 446728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn proc = new ProcessItem(context, si.uid, si.process); 447728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn procs.put(si.process, proc); 448728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 449728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 450728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (proc.mCurSeq != mSequence) { 451728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int pid = si.restarting == 0 ? si.pid : 0; 452728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (pid != proc.mPid) { 453728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn changed = true; 454728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (proc.mPid != pid) { 455728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (proc.mPid != 0) { 456728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActiveProcesses.remove(proc.mPid); 457728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 458728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (pid != 0) { 459728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActiveProcesses.put(pid, proc); 460728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 461728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn proc.mPid = pid; 462728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 463728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 464728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn proc.mDependentProcesses.clear(); 465728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn proc.mCurSeq = mSequence; 466728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 467728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn changed |= proc.updateService(context, si); 468728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 469728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 470728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Now update the map of other processes that are running (but 471728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // don't have services actively running inside them). 472728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn List<ActivityManager.RunningAppProcessInfo> processes 473728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn = am.getRunningAppProcesses(); 474728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final int NP = processes != null ? processes.size() : 0; 475728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<NP; i++) { 476728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ActivityManager.RunningAppProcessInfo pi = processes.get(i); 477728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ProcessItem proc = mActiveProcesses.get(pi.pid); 478728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (proc == null) { 479728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // This process is not one that is a direct container 480728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // of a service, so look for it in the secondary 481728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // running list. 482728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn proc = mRunningProcesses.get(pi.pid); 483728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (proc == null) { 484728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn proc = new ProcessItem(context, pi.uid, pi.processName); 485728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn proc.mPid = pi.pid; 486728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mRunningProcesses.put(pi.pid, proc); 487728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 488728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn proc.mDependentProcesses.clear(); 489728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 490728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn proc.mRunningSeq = mSequence; 491728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn proc.mRunningProcessInfo = pi; 492728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 493728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 494728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Build the chains from client processes to the process they are 495728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // dependent on; also remove any old running processes. 496728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int NRP = mRunningProcesses.size(); 497728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<NRP; i++) { 498728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ProcessItem proc = mRunningProcesses.valueAt(i); 499728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (proc.mRunningSeq == mSequence) { 500728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int clientPid = proc.mRunningProcessInfo.importanceReasonPid; 501728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (clientPid != 0) { 502728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ProcessItem client = mActiveProcesses.get(clientPid); 503728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (client == null) { 504728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn client = mRunningProcesses.get(clientPid); 505728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 506728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (client != null) { 507728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn client.mDependentProcesses.put(proc.mPid, proc); 508728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 509728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else { 510728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // In this pass the process doesn't have a client. 511728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Clear to make sure if it later gets the same one 512728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // that we will detect the change. 513728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn proc.mClient = null; 514728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 515728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else { 516728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mRunningProcesses.remove(mRunningProcesses.keyAt(i)); 517728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 518728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 519728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 520728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Follow the tree from all primary service processes to all 521728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // processes they are dependent on, marking these processes as 522728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // still being active and determining if anything has changed. 523728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final int NAP = mActiveProcesses.size(); 524728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<NAP; i++) { 525728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ProcessItem proc = mActiveProcesses.valueAt(i); 526728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (proc.mCurSeq == mSequence) { 527728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn changed |= proc.buildDependencyChain(context, pm, mSequence); 528728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 529728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 530728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 531728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Look for services and their primary processes that no longer exist... 532728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<mProcesses.size(); i++) { 533728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn HashMap<String, ProcessItem> procs = mProcesses.valueAt(i); 534728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Iterator<ProcessItem> pit = procs.values().iterator(); 535728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn while (pit.hasNext()) { 536728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ProcessItem pi = pit.next(); 537728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (pi.mCurSeq == mSequence) { 538728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn pi.ensureLabel(pm); 539728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (pi.mPid == 0) { 540728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Sanity: a non-process can't be dependent on 541728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // anything. 542728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn pi.mDependentProcesses.clear(); 543728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 544728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else { 545728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn changed = true; 546728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn pit.remove(); 547728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (procs.size() == 0) { 548728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mProcesses.remove(mProcesses.keyAt(i)); 549728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 550728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (pi.mPid != 0) { 551728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mActiveProcesses.remove(pi.mPid); 552728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 553728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn continue; 554728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 555728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Iterator<ServiceItem> sit = pi.mServices.values().iterator(); 556728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn while (sit.hasNext()) { 557728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ServiceItem si = sit.next(); 558728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (si.mCurSeq != mSequence) { 559728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn changed = true; 560728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn sit.remove(); 561728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 562728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 563728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 564728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 565728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 566728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (changed) { 567728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // First determine an order for the services. 568728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ArrayList<ProcessItem> sortedProcesses = new ArrayList<ProcessItem>(); 569728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<mProcesses.size(); i++) { 570728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (ProcessItem pi : mProcesses.valueAt(i).values()) { 571728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn pi.mIsSystem = false; 572728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn pi.mIsStarted = true; 573728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn pi.mActiveSince = Long.MAX_VALUE; 574728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (ServiceItem si : pi.mServices.values()) { 575728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (si.mServiceInfo != null 576728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn && (si.mServiceInfo.applicationInfo.flags 577728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn & ApplicationInfo.FLAG_SYSTEM) != 0) { 578728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn pi.mIsSystem = true; 579728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 580728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (si.mRunningService != null 581728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn && si.mRunningService.clientLabel != 0) { 582728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn pi.mIsStarted = false; 583728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (pi.mActiveSince > si.mRunningService.activeSince) { 584728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn pi.mActiveSince = si.mRunningService.activeSince; 585728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 586728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 587728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 588728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn sortedProcesses.add(pi); 589728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 590728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 591728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 592728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Collections.sort(sortedProcesses, mServiceProcessComparator); 593728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 594728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ArrayList<BaseItem> newItems = new ArrayList<BaseItem>(); 595728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ArrayList<MergedItem> newMergedItems = new ArrayList<MergedItem>(); 596728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mProcessItems.clear(); 597728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<sortedProcesses.size(); i++) { 598728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ProcessItem pi = sortedProcesses.get(i); 599728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn pi.mNeedDivider = false; 600728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 601728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int firstProc = mProcessItems.size(); 602728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // First add processes we are dependent on. 603728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn pi.addDependentProcesses(newItems, mProcessItems); 604728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // And add the process itself. 605728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn newItems.add(pi); 606728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (pi.mPid > 0) { 607728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mProcessItems.add(pi); 608728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 609728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 610728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Now add the services running in it. 611728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn MergedItem mergedItem = null; 612728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean haveAllMerged = false; 613728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn boolean needDivider = false; 614728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (ServiceItem si : pi.mServices.values()) { 615728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si.mNeedDivider = needDivider; 616728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn needDivider = true; 617728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn newItems.add(si); 618728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (si.mMergedItem != null) { 619728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (mergedItem != null && mergedItem != si.mMergedItem) { 620728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn haveAllMerged = false; 621728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 622728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mergedItem = si.mMergedItem; 623728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else { 624728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn haveAllMerged = false; 625728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 626728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 627728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 628728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (!haveAllMerged || mergedItem == null 629728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn || mergedItem.mServices.size() != pi.mServices.size()) { 630728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Whoops, we need to build a new MergedItem! 631728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mergedItem = new MergedItem(); 632728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (ServiceItem si : pi.mServices.values()) { 633728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mergedItem.mServices.add(si); 634728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn si.mMergedItem = mergedItem; 635728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 636728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mergedItem.mProcess = pi; 637728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mergedItem.mOtherProcesses.clear(); 638728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int mpi=firstProc; mpi<(mProcessItems.size()-1); mpi++) { 639728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mergedItem.mOtherProcesses.add(mProcessItems.get(mpi)); 640728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 641728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 642728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 643728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mergedItem.update(context); 644728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn newMergedItems.add(mergedItem); 645728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 646728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn synchronized (mLock) { 647728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mItems = newItems; 648728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mMergedItems = newMergedItems; 649728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 650728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 651728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 652728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // Count number of interesting other (non-active) processes, and 653728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // build a list of all processes we will retrieve memory for. 654728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mAllProcessItems.clear(); 655728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mAllProcessItems.addAll(mProcessItems); 656728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int numBackgroundProcesses = 0; 657728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int numForegroundProcesses = 0; 658728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int numServiceProcesses = 0; 659728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn NRP = mRunningProcesses.size(); 660728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<NRP; i++) { 661728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ProcessItem proc = mRunningProcesses.valueAt(i); 662728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (proc.mCurSeq != mSequence) { 663728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // We didn't hit this process as a dependency on one 664728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn // of our active ones, so add it up if needed. 665728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (proc.mRunningProcessInfo.importance >= 666728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) { 667728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn numBackgroundProcesses++; 668728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mAllProcessItems.add(proc); 669728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else if (proc.mRunningProcessInfo.importance <= 670728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) { 671728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn numForegroundProcesses++; 672728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mAllProcessItems.add(proc); 673728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else { 674728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Log.i(RunningServices.TAG, "Unknown non-service process: " 675728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn + proc.mProcessName + " #" + proc.mPid); 676728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 677728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else { 678728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn numServiceProcesses++; 679728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 680728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 681728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 682728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn long backgroundProcessMemory = 0; 683728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn long foregroundProcessMemory = 0; 684728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn long serviceProcessMemory = 0; 685728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn try { 686728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn final int numProc = mAllProcessItems.size(); 687728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn int[] pids = new int[numProc]; 688728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<numProc; i++) { 689728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn pids[i] = mAllProcessItems.get(i).mPid; 690728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 691728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn Debug.MemoryInfo[] mem = ActivityManagerNative.getDefault() 692728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn .getProcessMemoryInfo(pids); 693728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=pids.length-1; i>=0; i--) { 694728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ProcessItem proc = mAllProcessItems.get(i); 695728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn changed |= proc.updateSize(context, mem[i], mSequence); 696728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn if (proc.mCurSeq == mSequence) { 697728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn serviceProcessMemory += proc.mSize; 698728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else if (proc.mRunningProcessInfo.importance >= 699728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ActivityManager.RunningAppProcessInfo.IMPORTANCE_BACKGROUND) { 700728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn backgroundProcessMemory += proc.mSize; 701728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } else if (proc.mRunningProcessInfo.importance <= 702728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE) { 703728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn foregroundProcessMemory += proc.mSize; 704728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 705728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 706728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } catch (RemoteException e) { 707728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 708728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 709728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn for (int i=0; i<mMergedItems.size(); i++) { 710728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mMergedItems.get(i).updateSize(context); 711728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 712728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 713728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn synchronized (mLock) { 714728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mNumBackgroundProcesses = numBackgroundProcesses; 715728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mNumForegroundProcesses = numForegroundProcesses; 716728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mNumServiceProcesses = numServiceProcesses; 717728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mBackgroundProcessMemory = backgroundProcessMemory; 718728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mForegroundProcessMemory = foregroundProcessMemory; 719728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn mServiceProcessMemory = serviceProcessMemory; 720728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 721728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 722728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return changed; 723728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 724728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 725728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ArrayList<BaseItem> getCurrentItems() { 726728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn synchronized (mLock) { 727728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return mItems; 728728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 729728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 730728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn 731728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn ArrayList<MergedItem> getCurrentMergedItems() { 732728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn synchronized (mLock) { 733728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn return mMergedItems; 734728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 735728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn } 736728ac35373028b79205a788c526ef4b495518ec1Dianne Hackborn} 737