1f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff/* 2f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * Copyright (C) 2007 The Android Open Source Project 3f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * 4f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * Licensed under the Apache License, Version 2.0 (the "License"); 5f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * you may not use this file except in compliance with the License. 6f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * You may obtain a copy of the License at 7f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * 8f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * http://www.apache.org/licenses/LICENSE-2.0 9f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * 10f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * Unless required by applicable law or agreed to in writing, software 11f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * distributed under the License is distributed on an "AS IS" BASIS, 12f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * See the License for the specific language governing permissions and 14f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * limitations under the License. 15f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff */ 16f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff 17f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriffpackage android.net; 18f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff 19a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tateimport android.annotation.SystemApi; 204414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport android.app.DownloadManager; 214414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport android.app.backup.BackupManager; 22eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkeyimport android.content.Context; 234414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport android.media.MediaPlayer; 24eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkeyimport android.os.RemoteException; 25eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkeyimport android.os.ServiceManager; 26eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey 278568db534118fc14cc28100306d51626464ff319Jesse Wilsonimport com.android.server.NetworkManagementSocketTagger; 28f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff 298568db534118fc14cc28100306d51626464ff319Jesse Wilsonimport dalvik.system.SocketTagger; 30a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 3143be174888684ef3404a43d8434015193c656cceJeff Sharkeyimport java.net.Socket; 3243be174888684ef3404a43d8434015193c656cceJeff Sharkeyimport java.net.SocketException; 33f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff 34f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff/** 352b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * Class that provides network traffic statistics. These statistics include 362b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * bytes transmitted and received and network packets transmitted and received, 372b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * over all interfaces, over the mobile interface, and on a per-UID basis. 38f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * <p> 392b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * These statistics may not be available on all platforms. If the statistics 402b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * are not supported by this device, {@link #UNSUPPORTED} will be returned. 41f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff */ 42f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriffpublic class TrafficStats { 43f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff /** 44f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * The return value to indicate that the device does not support the statistic. 45f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff */ 46f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff public final static int UNSUPPORTED = -1; 47f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff 48241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkey /** @hide */ 49241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkey public static final long KB_IN_BYTES = 1024; 50241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkey /** @hide */ 51241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkey public static final long MB_IN_BYTES = KB_IN_BYTES * 1024; 52241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkey /** @hide */ 53241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkey public static final long GB_IN_BYTES = MB_IN_BYTES * 1024; 544887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey /** @hide */ 554887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey public static final long TB_IN_BYTES = GB_IN_BYTES * 1024; 56b521feaed410b6862baca9b42d5fd7c398e07b2fJeff Sharkey /** @hide */ 57b521feaed410b6862baca9b42d5fd7c398e07b2fJeff Sharkey public static final long PB_IN_BYTES = TB_IN_BYTES * 1024; 58241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkey 59d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey /** 60b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey * Special UID value used when collecting {@link NetworkStatsHistory} for 61b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey * removed applications. 62b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey * 63b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey * @hide 64b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey */ 65b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey public static final int UID_REMOVED = -4; 66b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 67b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey /** 68cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey * Special UID value used when collecting {@link NetworkStatsHistory} for 69cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey * tethering traffic. 70cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey * 71cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey * @hide 72cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey */ 73cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey public static final int UID_TETHERING = -5; 74cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey 75cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey /** 764414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey * Default tag value for {@link DownloadManager} traffic. 774414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey * 784414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey * @hide 794414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey */ 80cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey public static final int TAG_SYSTEM_DOWNLOAD = 0xFFFFFF01; 814414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey 824414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey /** 834414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey * Default tag value for {@link MediaPlayer} traffic. 844414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey * 854414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey * @hide 864414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey */ 87cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey public static final int TAG_SYSTEM_MEDIA = 0xFFFFFF02; 884414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey 894414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey /** 904414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey * Default tag value for {@link BackupManager} traffic. 914414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey * 924414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey * @hide 934414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey */ 94cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey public static final int TAG_SYSTEM_BACKUP = 0xFFFFFF03; 954414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey 96234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey private static INetworkStatsService sStatsService; 97234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey 98234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey private synchronized static INetworkStatsService getStatsService() { 99234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey if (sStatsService == null) { 100234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey sStatsService = INetworkStatsService.Stub.asInterface( 101234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey ServiceManager.getService(Context.NETWORK_STATS_SERVICE)); 102234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 103234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return sStatsService; 104234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 105234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey 1064414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey /** 107eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * Snapshot of {@link NetworkStats} when the currently active profiling 108eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * session started, or {@code null} if no session active. 109eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * 110eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * @see #startDataProfiling(Context) 111eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * @see #stopDataProfiling(Context) 112eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey */ 113eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey private static NetworkStats sActiveProfilingStart; 114eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey 115eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey private static Object sProfilingLock = new Object(); 116eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey 117eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey /** 11843be174888684ef3404a43d8434015193c656cceJeff Sharkey * Set active tag to use when accounting {@link Socket} traffic originating 11943be174888684ef3404a43d8434015193c656cceJeff Sharkey * from the current thread. Only one active tag per thread is supported. 12043be174888684ef3404a43d8434015193c656cceJeff Sharkey * <p> 12143be174888684ef3404a43d8434015193c656cceJeff Sharkey * Changes only take effect during subsequent calls to 12243be174888684ef3404a43d8434015193c656cceJeff Sharkey * {@link #tagSocket(Socket)}. 123cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey * <p> 124cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey * Tags between {@code 0xFFFFFF00} and {@code 0xFFFFFFFF} are reserved and 125cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey * used internally by system services like {@link DownloadManager} when 126cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey * performing traffic on behalf of an application. 127dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * 128dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * @see #clearThreadStatsTag() 12943be174888684ef3404a43d8434015193c656cceJeff Sharkey */ 1304414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey public static void setThreadStatsTag(int tag) { 1318568db534118fc14cc28100306d51626464ff319Jesse Wilson NetworkManagementSocketTagger.setThreadSocketStatsTag(tag); 13243be174888684ef3404a43d8434015193c656cceJeff Sharkey } 13343be174888684ef3404a43d8434015193c656cceJeff Sharkey 1344414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey /** 135a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate * System API for backup-related support components to tag network traffic 136a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate * appropriately. 137a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate * @hide 138a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate */ 139a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate @SystemApi 140a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate public static void setThreadStatsTagBackup() { 141a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate setThreadStatsTag(TAG_SYSTEM_BACKUP); 142a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate } 143a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate 144a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate /** 145eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert * Get the active tag used when accounting {@link Socket} traffic originating 146eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert * from the current thread. Only one active tag per thread is supported. 147eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert * {@link #tagSocket(Socket)}. 148dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * 149dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * @see #setThreadStatsTag(int) 150eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert */ 151eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert public static int getThreadStatsTag() { 152eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert return NetworkManagementSocketTagger.getThreadSocketStatsTag(); 153eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert } 154eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert 155dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey /** 156dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Clear any active tag set to account {@link Socket} traffic originating 157dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * from the current thread. 158dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * 159dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * @see #setThreadStatsTag(int) 160dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey */ 16143be174888684ef3404a43d8434015193c656cceJeff Sharkey public static void clearThreadStatsTag() { 1628568db534118fc14cc28100306d51626464ff319Jesse Wilson NetworkManagementSocketTagger.setThreadSocketStatsTag(-1); 16343be174888684ef3404a43d8434015193c656cceJeff Sharkey } 16443be174888684ef3404a43d8434015193c656cceJeff Sharkey 16543be174888684ef3404a43d8434015193c656cceJeff Sharkey /** 16643be174888684ef3404a43d8434015193c656cceJeff Sharkey * Set specific UID to use when accounting {@link Socket} traffic 16743be174888684ef3404a43d8434015193c656cceJeff Sharkey * originating from the current thread. Designed for use when performing an 16843be174888684ef3404a43d8434015193c656cceJeff Sharkey * operation on behalf of another application. 16943be174888684ef3404a43d8434015193c656cceJeff Sharkey * <p> 17043be174888684ef3404a43d8434015193c656cceJeff Sharkey * Changes only take effect during subsequent calls to 17143be174888684ef3404a43d8434015193c656cceJeff Sharkey * {@link #tagSocket(Socket)}. 17243be174888684ef3404a43d8434015193c656cceJeff Sharkey * <p> 17343be174888684ef3404a43d8434015193c656cceJeff Sharkey * To take effect, caller must hold 17443be174888684ef3404a43d8434015193c656cceJeff Sharkey * {@link android.Manifest.permission#UPDATE_DEVICE_STATS} permission. 17543be174888684ef3404a43d8434015193c656cceJeff Sharkey * 176dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * @hide 17743be174888684ef3404a43d8434015193c656cceJeff Sharkey */ 178a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate @SystemApi 17943be174888684ef3404a43d8434015193c656cceJeff Sharkey public static void setThreadStatsUid(int uid) { 1808568db534118fc14cc28100306d51626464ff319Jesse Wilson NetworkManagementSocketTagger.setThreadSocketStatsUid(uid); 18143be174888684ef3404a43d8434015193c656cceJeff Sharkey } 18243be174888684ef3404a43d8434015193c656cceJeff Sharkey 18343be174888684ef3404a43d8434015193c656cceJeff Sharkey /** {@hide} */ 184a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate @SystemApi 18543be174888684ef3404a43d8434015193c656cceJeff Sharkey public static void clearThreadStatsUid() { 1868568db534118fc14cc28100306d51626464ff319Jesse Wilson NetworkManagementSocketTagger.setThreadSocketStatsUid(-1); 18743be174888684ef3404a43d8434015193c656cceJeff Sharkey } 18843be174888684ef3404a43d8434015193c656cceJeff Sharkey 18943be174888684ef3404a43d8434015193c656cceJeff Sharkey /** 19043be174888684ef3404a43d8434015193c656cceJeff Sharkey * Tag the given {@link Socket} with any statistics parameters active for 19143be174888684ef3404a43d8434015193c656cceJeff Sharkey * the current thread. Subsequent calls always replace any existing 19243be174888684ef3404a43d8434015193c656cceJeff Sharkey * parameters. When finished, call {@link #untagSocket(Socket)} to remove 19343be174888684ef3404a43d8434015193c656cceJeff Sharkey * statistics parameters. 19443be174888684ef3404a43d8434015193c656cceJeff Sharkey * 1954414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey * @see #setThreadStatsTag(int) 19643be174888684ef3404a43d8434015193c656cceJeff Sharkey * @see #setThreadStatsUid(int) 19743be174888684ef3404a43d8434015193c656cceJeff Sharkey */ 19843be174888684ef3404a43d8434015193c656cceJeff Sharkey public static void tagSocket(Socket socket) throws SocketException { 1998568db534118fc14cc28100306d51626464ff319Jesse Wilson SocketTagger.get().tag(socket); 20043be174888684ef3404a43d8434015193c656cceJeff Sharkey } 20143be174888684ef3404a43d8434015193c656cceJeff Sharkey 20243be174888684ef3404a43d8434015193c656cceJeff Sharkey /** 20343be174888684ef3404a43d8434015193c656cceJeff Sharkey * Remove any statistics parameters from the given {@link Socket}. 20443be174888684ef3404a43d8434015193c656cceJeff Sharkey */ 20543be174888684ef3404a43d8434015193c656cceJeff Sharkey public static void untagSocket(Socket socket) throws SocketException { 2068568db534118fc14cc28100306d51626464ff319Jesse Wilson SocketTagger.get().untag(socket); 20743be174888684ef3404a43d8434015193c656cceJeff Sharkey } 20843be174888684ef3404a43d8434015193c656cceJeff Sharkey 20943be174888684ef3404a43d8434015193c656cceJeff Sharkey /** 210eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * Start profiling data usage for current UID. Only one profiling session 211eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * can be active at a time. 212eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * 213eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * @hide 214eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey */ 215eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey public static void startDataProfiling(Context context) { 216eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey synchronized (sProfilingLock) { 217eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey if (sActiveProfilingStart != null) { 218eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey throw new IllegalStateException("already profiling data"); 219eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey } 220eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey 221eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey // take snapshot in time; we calculate delta later 222a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey sActiveProfilingStart = getDataLayerSnapshotForUid(context); 223eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey } 224eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey } 225eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey 226eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey /** 227eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * Stop profiling data usage for current UID. 228eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * 229eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * @return Detailed {@link NetworkStats} of data that occurred since last 230eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * {@link #startDataProfiling(Context)} call. 231eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * @hide 232eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey */ 233eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey public static NetworkStats stopDataProfiling(Context context) { 234eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey synchronized (sProfilingLock) { 235eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey if (sActiveProfilingStart == null) { 236eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey throw new IllegalStateException("not profiling data"); 237eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey } 238eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey 2395a7bcf31a44d9875ca5fc010dc213aa2bd5b1168Jeff Sharkey // subtract starting values and return delta 2405a7bcf31a44d9875ca5fc010dc213aa2bd5b1168Jeff Sharkey final NetworkStats profilingStop = getDataLayerSnapshotForUid(context); 2415a7bcf31a44d9875ca5fc010dc213aa2bd5b1168Jeff Sharkey final NetworkStats profilingDelta = NetworkStats.subtract( 24263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey profilingStop, sActiveProfilingStart, null, null); 2435a7bcf31a44d9875ca5fc010dc213aa2bd5b1168Jeff Sharkey sActiveProfilingStart = null; 2445a7bcf31a44d9875ca5fc010dc213aa2bd5b1168Jeff Sharkey return profilingDelta; 245eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey } 246eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey } 247eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey 248eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey /** 249558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey * Increment count of network operations performed under the accounting tag 250558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey * currently active on the calling thread. This can be used to derive 251558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey * bytes-per-operation. 252558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey * 253558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey * @param operationCount Number of operations to increment count by. 254558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey */ 255558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey public static void incrementOperationCount(int operationCount) { 256558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey final int tag = getThreadStatsTag(); 257558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey incrementOperationCount(tag, operationCount); 258558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey } 259558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey 260558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey /** 261a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey * Increment count of network operations performed under the given 262a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey * accounting tag. This can be used to derive bytes-per-operation. 263a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey * 264a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey * @param tag Accounting tag used in {@link #setThreadStatsTag(int)}. 265a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey * @param operationCount Number of operations to increment count by. 266a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey */ 267a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey public static void incrementOperationCount(int tag, int operationCount) { 268a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey final int uid = android.os.Process.myUid(); 269a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey try { 270234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey getStatsService().incrementOperationCount(uid, tag, operationCount); 271a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey } catch (RemoteException e) { 272a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey throw new RuntimeException(e); 273a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey } 274a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey } 275a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 276b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey /** {@hide} */ 277b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey public static void closeQuietly(INetworkStatsSession session) { 278b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey // TODO: move to NetworkStatsService once it exists 279b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey if (session != null) { 280b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey try { 281b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey session.close(); 282b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } catch (RuntimeException rethrown) { 283b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey throw rethrown; 284b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } catch (Exception ignored) { 285b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } 286b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } 287b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } 288b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey 289a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey /** 290dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Return number of packets transmitted across mobile networks since device 291dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * boot. Counts packets across all mobile network interfaces, and always 292dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * increases monotonically since device boot. Statistics are measured at the 293dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * network layer, so they include both TCP and UDP usage. 294dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * <p> 295dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may 296dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * return {@link #UNSUPPORTED} on devices where statistics aren't available. 297f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff */ 298234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey public static long getMobileTxPackets() { 299234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey long total = 0; 300234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey for (String iface : getMobileIfaces()) { 301234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey total += getTxPackets(iface); 302234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 303234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return total; 304234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 305f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff 306f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff /** 307dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Return number of packets received across mobile networks since device 308dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * boot. Counts packets across all mobile network interfaces, and always 309dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * increases monotonically since device boot. Statistics are measured at the 310dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * network layer, so they include both TCP and UDP usage. 311dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * <p> 312dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may 313dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * return {@link #UNSUPPORTED} on devices where statistics aren't available. 314f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff */ 315234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey public static long getMobileRxPackets() { 316234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey long total = 0; 317234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey for (String iface : getMobileIfaces()) { 318234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey total += getRxPackets(iface); 319234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 320234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return total; 321234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 322f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff 323f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff /** 324dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Return number of bytes transmitted across mobile networks since device 325dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * boot. Counts packets across all mobile network interfaces, and always 326dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * increases monotonically since device boot. Statistics are measured at the 327dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * network layer, so they include both TCP and UDP usage. 328dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * <p> 329dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may 330dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * return {@link #UNSUPPORTED} on devices where statistics aren't available. 331f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff */ 332234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey public static long getMobileTxBytes() { 333234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey long total = 0; 334234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey for (String iface : getMobileIfaces()) { 335234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey total += getTxBytes(iface); 336234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 337234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return total; 338234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 339f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff 340f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff /** 341dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Return number of bytes received across mobile networks since device boot. 342dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Counts packets across all mobile network interfaces, and always increases 343dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * monotonically since device boot. Statistics are measured at the network 344dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * layer, so they include both TCP and UDP usage. 345dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * <p> 346dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may 347dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * return {@link #UNSUPPORTED} on devices where statistics aren't available. 348f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff */ 349234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey public static long getMobileRxBytes() { 350234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey long total = 0; 351234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey for (String iface : getMobileIfaces()) { 352234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey total += getRxBytes(iface); 353234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 354234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return total; 355234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 356f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff 3574b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey /** {@hide} */ 3584b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey public static long getMobileTcpRxPackets() { 3594b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey long total = 0; 3604b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey for (String iface : getMobileIfaces()) { 3614b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey final long stat = nativeGetIfaceStat(iface, TYPE_TCP_RX_PACKETS); 3624b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey if (stat != UNSUPPORTED) { 3634b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey total += stat; 3644b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey } 3654b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey } 3664b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return total; 3674b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey } 3684b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey 3694b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey /** {@hide} */ 3704b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey public static long getMobileTcpTxPackets() { 3714b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey long total = 0; 3724b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey for (String iface : getMobileIfaces()) { 3734b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey final long stat = nativeGetIfaceStat(iface, TYPE_TCP_TX_PACKETS); 3744b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey if (stat != UNSUPPORTED) { 3754b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey total += stat; 3764b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey } 3774b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey } 3784b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey return total; 3794b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey } 3804b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey 381dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey /** {@hide} */ 382234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey public static long getTxPackets(String iface) { 383234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return nativeGetIfaceStat(iface, TYPE_TX_PACKETS); 384234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 385227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 386dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey /** {@hide} */ 387234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey public static long getRxPackets(String iface) { 388234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return nativeGetIfaceStat(iface, TYPE_RX_PACKETS); 389234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 390227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 391dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey /** {@hide} */ 392234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey public static long getTxBytes(String iface) { 393234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return nativeGetIfaceStat(iface, TYPE_TX_BYTES); 394234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 395227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 396dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey /** {@hide} */ 397234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey public static long getRxBytes(String iface) { 398234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return nativeGetIfaceStat(iface, TYPE_RX_BYTES); 399234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 400227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff 401227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff /** 402dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Return number of packets transmitted since device boot. Counts packets 403dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * across all network interfaces, and always increases monotonically since 404dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * device boot. Statistics are measured at the network layer, so they 405dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * include both TCP and UDP usage. 406dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * <p> 407dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may 408dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * return {@link #UNSUPPORTED} on devices where statistics aren't available. 409f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff */ 410234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey public static long getTotalTxPackets() { 411234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return nativeGetTotalStat(TYPE_TX_PACKETS); 412234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 413f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff 414f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff /** 415dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Return number of packets received since device boot. Counts packets 416dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * across all network interfaces, and always increases monotonically since 417dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * device boot. Statistics are measured at the network layer, so they 418dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * include both TCP and UDP usage. 419dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * <p> 420dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may 421dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * return {@link #UNSUPPORTED} on devices where statistics aren't available. 422f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff */ 423234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey public static long getTotalRxPackets() { 424234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return nativeGetTotalStat(TYPE_RX_PACKETS); 425234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 426f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff 427f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff /** 428dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Return number of bytes transmitted since device boot. Counts packets 429dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * across all network interfaces, and always increases monotonically since 430dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * device boot. Statistics are measured at the network layer, so they 431dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * include both TCP and UDP usage. 432dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * <p> 433dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may 434dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * return {@link #UNSUPPORTED} on devices where statistics aren't available. 435f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff */ 436234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey public static long getTotalTxBytes() { 437234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return nativeGetTotalStat(TYPE_TX_BYTES); 438234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 439f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff 440f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff /** 441dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Return number of bytes received since device boot. Counts packets across 442dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * all network interfaces, and always increases monotonically since device 443dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * boot. Statistics are measured at the network layer, so they include both 444dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * TCP and UDP usage. 445dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * <p> 446dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may 447dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey * return {@link #UNSUPPORTED} on devices where statistics aren't available. 448f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff */ 449234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey public static long getTotalRxBytes() { 450234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return nativeGetTotalStat(TYPE_RX_BYTES); 451234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 452f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff 453f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff /** 45492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * Return number of bytes transmitted by the given UID since device boot. 45592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * Counts packets across all network interfaces, and always increases 45692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * monotonically since device boot. Statistics are measured at the network 45792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * layer, so they include both TCP and UDP usage. 45892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * <p> 45945e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return 46092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * {@link #UNSUPPORTED} on devices where statistics aren't available. 461f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * 46292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see android.os.Process#myUid() 46392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see android.content.pm.ApplicationInfo#uid 464f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff */ 46592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey public static long getUidTxBytes(int uid) { 46692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return nativeGetUidStat(uid, TYPE_TX_BYTES); 46792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 468f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff 469f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff /** 47092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * Return number of bytes received by the given UID since device boot. 47192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * Counts packets across all network interfaces, and always increases 47292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * monotonically since device boot. Statistics are measured at the network 47392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * layer, so they include both TCP and UDP usage. 47492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * <p> 47545e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return 47692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * {@link #UNSUPPORTED} on devices where statistics aren't available. 477f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * 47892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see android.os.Process#myUid() 47992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see android.content.pm.ApplicationInfo#uid 480f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff */ 48192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey public static long getUidRxBytes(int uid) { 48292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return nativeGetUidStat(uid, TYPE_RX_BYTES); 48392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 484c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma 485c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma /** 48692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * Return number of packets transmitted by the given UID since device boot. 48792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * Counts packets across all network interfaces, and always increases 48892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * monotonically since device boot. Statistics are measured at the network 48992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * layer, so they include both TCP and UDP usage. 49092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * <p> 49145e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return 49292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * {@link #UNSUPPORTED} on devices where statistics aren't available. 493c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma * 49492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see android.os.Process#myUid() 49592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see android.content.pm.ApplicationInfo#uid 496c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma */ 49792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey public static long getUidTxPackets(int uid) { 49892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return nativeGetUidStat(uid, TYPE_TX_PACKETS); 49992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 500c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma 501c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma /** 50292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * Return number of packets received by the given UID since device boot. 50392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * Counts packets across all network interfaces, and always increases 50492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * monotonically since device boot. Statistics are measured at the network 50592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * layer, so they include both TCP and UDP usage. 50692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * <p> 50745e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return 50892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * {@link #UNSUPPORTED} on devices where statistics aren't available. 509c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma * 51092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see android.os.Process#myUid() 51192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see android.content.pm.ApplicationInfo#uid 512c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma */ 51392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey public static long getUidRxPackets(int uid) { 51492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return nativeGetUidStat(uid, TYPE_RX_PACKETS); 51592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 516c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma 517c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma /** 51845e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, 51992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * transport layer statistics are no longer available, and will 52092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * always return {@link #UNSUPPORTED}. 52192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see #getUidTxBytes(int) 522c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma */ 52392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey @Deprecated 52492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey public static long getUidTcpTxBytes(int uid) { 52592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return UNSUPPORTED; 52692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 527c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma 528c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma /** 52945e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, 53092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * transport layer statistics are no longer available, and will 53192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * always return {@link #UNSUPPORTED}. 53292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see #getUidRxBytes(int) 533c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma */ 53492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey @Deprecated 53592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey public static long getUidTcpRxBytes(int uid) { 53692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return UNSUPPORTED; 53792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 538c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma 539c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma /** 54045e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, 54192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * transport layer statistics are no longer available, and will 54292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * always return {@link #UNSUPPORTED}. 54392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see #getUidTxBytes(int) 544c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma */ 54592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey @Deprecated 54692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey public static long getUidUdpTxBytes(int uid) { 54792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return UNSUPPORTED; 54892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 549c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma 550c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma /** 55145e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, 55292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * transport layer statistics are no longer available, and will 55392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * always return {@link #UNSUPPORTED}. 55492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see #getUidRxBytes(int) 555c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma */ 55692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey @Deprecated 55792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey public static long getUidUdpRxBytes(int uid) { 55892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return UNSUPPORTED; 55992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 560c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma 561c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma /** 56245e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, 56392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * transport layer statistics are no longer available, and will 56492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * always return {@link #UNSUPPORTED}. 56592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see #getUidTxPackets(int) 566c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma */ 56792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey @Deprecated 56892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey public static long getUidTcpTxSegments(int uid) { 56992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return UNSUPPORTED; 57092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 571c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma 572c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma /** 57345e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, 57492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * transport layer statistics are no longer available, and will 57592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * always return {@link #UNSUPPORTED}. 57692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see #getUidRxPackets(int) 577c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma */ 57892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey @Deprecated 57992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey public static long getUidTcpRxSegments(int uid) { 58092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return UNSUPPORTED; 58192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 582c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma 583c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma /** 58445e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, 58592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * transport layer statistics are no longer available, and will 58692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * always return {@link #UNSUPPORTED}. 58792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see #getUidTxPackets(int) 588c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma */ 58992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey @Deprecated 59092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey public static long getUidUdpTxPackets(int uid) { 59192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return UNSUPPORTED; 59292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 593c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma 594c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma /** 59545e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, 59692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * transport layer statistics are no longer available, and will 59792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * always return {@link #UNSUPPORTED}. 59892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey * @see #getUidRxPackets(int) 599c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma */ 60092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey @Deprecated 60192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey public static long getUidUdpRxPackets(int uid) { 60292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey return UNSUPPORTED; 60392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey } 604eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey 605eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey /** 606eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * Return detailed {@link NetworkStats} for the current UID. Requires no 607eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey * special permission. 608eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey */ 609a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey private static NetworkStats getDataLayerSnapshotForUid(Context context) { 610dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey // TODO: take snapshot locally, since proc file is now visible 611eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey final int uid = android.os.Process.myUid(); 612eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey try { 613234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return getStatsService().getDataLayerSnapshotForUid(uid); 614234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } catch (RemoteException e) { 615234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey throw new RuntimeException(e); 616234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 617234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 618234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey 619234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey /** 620234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey * Return set of any ifaces associated with mobile networks since boot. 621234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey * Interfaces are never removed from this list, so counters should always be 622234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey * monotonic. 623234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey */ 624234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey private static String[] getMobileIfaces() { 625234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey try { 626234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return getStatsService().getMobileIfaces(); 627eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey } catch (RemoteException e) { 628eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey throw new RuntimeException(e); 629eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey } 630eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey } 631234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey 632234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey // NOTE: keep these in sync with android_net_TrafficStats.cpp 633234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey private static final int TYPE_RX_BYTES = 0; 634234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey private static final int TYPE_RX_PACKETS = 1; 635234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey private static final int TYPE_TX_BYTES = 2; 636234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey private static final int TYPE_TX_PACKETS = 3; 6374b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey private static final int TYPE_TCP_RX_PACKETS = 4; 6384b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey private static final int TYPE_TCP_TX_PACKETS = 5; 639234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey 640234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey private static native long nativeGetTotalStat(int type); 641234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey private static native long nativeGetIfaceStat(String iface, int type); 64292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey private static native long nativeGetUidStat(int uid, int type); 643f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff} 644