| /* |
| * Copyright (C) 2014 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| package com.android.camera.app; |
| |
| import android.app.ActivityManager; |
| import android.os.Debug; |
| import android.os.Process; |
| import android.os.SystemClock; |
| |
| import com.android.camera.debug.Log; |
| |
| import java.util.HashMap; |
| |
| /** |
| * Queries the current memory consumption of the app. |
| */ |
| public class MemoryQuery { |
| private static final Log.Tag TAG = new Log.Tag("MemoryQuery"); |
| private final long BYTES_IN_KILOBYTE = 1024; |
| private final long BYTES_IN_MEGABYTE = BYTES_IN_KILOBYTE * BYTES_IN_KILOBYTE; |
| |
| public static final String KEY_TIMESTAMP = "timestamp"; |
| public static final String KEY_MEMORY_AVAILABLE = "availMem"; |
| public static final String KEY_TOTAL_MEMORY = "totalMem"; |
| public static final String KEY_TOTAL_PSS = "totalPSS"; |
| public static final String KEY_NATIVE_PSS = "nativePSS"; |
| public static final String KEY_DALVIK_PSS = "dalvikPSS"; |
| public static final String KEY_OTHER_PSS = "otherPSS"; |
| public static final String KEY_THRESHOLD = "threshold"; |
| public static final String KEY_LOW_MEMORY = "lowMemory"; |
| public static final String KEY_LAST_TRIM_LEVEL = "lastTrimLevel"; |
| public static final String KEY_TOTAL_PRIVATE_DIRTY = "totalPrivateDirty"; |
| public static final String KEY_TOTAL_SHARED_DIRTY = "totalSharedDirty"; |
| public static final String KEY_MEMORY_CLASS = "memoryClass"; |
| public static final String KEY_LARGE_MEMORY_CLASS = "largeMemoryClass"; |
| |
| public static final String REPORT_LABEL_LAUNCH = "launch"; |
| |
| private ActivityManager mActivityManager; |
| |
| public MemoryQuery(ActivityManager activityManager) { |
| mActivityManager = activityManager; |
| } |
| |
| /** |
| * Measures the current memory consumption and thresholds of the app, from |
| * the ActivityManager and Debug.MemoryInfo, |
| * |
| * @return HashMap of memory metrics keyed by string labels. |
| */ |
| public HashMap queryMemory() { |
| // Get ActivityManager.MemoryInfo. |
| int memoryClass = mActivityManager.getMemoryClass(); |
| int largeMemoryClass = mActivityManager.getLargeMemoryClass(); |
| ActivityManager.MemoryInfo memoryInfo = new ActivityManager.MemoryInfo(); |
| mActivityManager.getMemoryInfo(memoryInfo); |
| long availMem = memoryInfo.availMem / BYTES_IN_MEGABYTE; |
| long totalMem = memoryInfo.totalMem / BYTES_IN_MEGABYTE; |
| long threshold = memoryInfo.threshold / BYTES_IN_MEGABYTE; |
| boolean lowMemory = memoryInfo.lowMemory; |
| |
| // Get ActivityManager.RunningAppProcessInfo. |
| ActivityManager.RunningAppProcessInfo info = new ActivityManager.RunningAppProcessInfo(); |
| ActivityManager.getMyMemoryState(info); |
| |
| // Retrieve a list of all running processes. Get the app PID. |
| int appPID = Process.myPid(); |
| |
| // Get ActivityManager.getProcessMemoryInfo for the app PID. |
| long timestamp = SystemClock.elapsedRealtime(); |
| long totalPrivateDirty = 0L; |
| long totalSharedDirty = 0L; |
| long totalPSS = 0L; |
| long nativePSS = 0L; |
| long dalvikPSS = 0L; |
| long otherPSS = 0L; |
| |
| if (appPID != 0) { |
| int pids[] = new int[1]; |
| pids[0] = appPID; |
| Debug.MemoryInfo[] memoryInfoArray = mActivityManager.getProcessMemoryInfo(pids); |
| totalPrivateDirty = memoryInfoArray[0].getTotalPrivateDirty() / BYTES_IN_KILOBYTE; |
| totalSharedDirty = memoryInfoArray[0].getTotalSharedDirty() / BYTES_IN_KILOBYTE; |
| totalPSS = memoryInfoArray[0].getTotalPss() / BYTES_IN_KILOBYTE; |
| nativePSS = memoryInfoArray[0].nativePss / BYTES_IN_KILOBYTE; |
| dalvikPSS = memoryInfoArray[0].dalvikPss / BYTES_IN_KILOBYTE; |
| otherPSS = memoryInfoArray[0].otherPss / BYTES_IN_KILOBYTE; |
| } |
| |
| HashMap outputData = new HashMap(); |
| outputData.put(KEY_TIMESTAMP, new Long(timestamp)); |
| outputData.put(KEY_MEMORY_AVAILABLE, new Long(availMem)); |
| outputData.put(KEY_TOTAL_MEMORY, new Long(totalMem)); |
| outputData.put(KEY_TOTAL_PSS, new Long(totalPSS)); |
| outputData.put(KEY_LAST_TRIM_LEVEL, new Integer(info.lastTrimLevel)); |
| outputData.put(KEY_TOTAL_PRIVATE_DIRTY, new Long(totalPrivateDirty)); |
| outputData.put(KEY_TOTAL_SHARED_DIRTY, new Long(totalSharedDirty)); |
| outputData.put(KEY_MEMORY_CLASS, new Long(memoryClass)); |
| outputData.put(KEY_LARGE_MEMORY_CLASS, new Long(largeMemoryClass)); |
| outputData.put(KEY_NATIVE_PSS, new Long(nativePSS)); |
| outputData.put(KEY_DALVIK_PSS, new Long(dalvikPSS)); |
| outputData.put(KEY_OTHER_PSS, new Long(otherPSS)); |
| outputData.put(KEY_THRESHOLD, new Long(threshold)); |
| outputData.put(KEY_LOW_MEMORY, new Boolean(lowMemory)); |
| |
| Log.d(TAG, String.format("timestamp=%d, availMem=%d, totalMem=%d, totalPSS=%d, " + |
| "lastTrimLevel=%d, largeMemoryClass=%d, nativePSS=%d, dalvikPSS=%d, otherPSS=%d," + |
| "threshold=%d, lowMemory=%s", timestamp, availMem, totalMem, totalPSS, |
| info.lastTrimLevel, largeMemoryClass, nativePSS, dalvikPSS, otherPSS, |
| threshold, lowMemory)); |
| |
| return outputData; |
| } |
| } |