175279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey/* 2d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Copyright (C) 2011 The Android Open Source Project 375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * 475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * Licensed under the Apache License, Version 2.0 (the "License"); 575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * you may not use this file except in compliance with the License. 675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * You may obtain a copy of the License at 775279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * 875279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * http://www.apache.org/licenses/LICENSE-2.0 975279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * 1075279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * Unless required by applicable law or agreed to in writing, software 1175279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * distributed under the License is distributed on an "AS IS" BASIS, 1275279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * See the License for the specific language governing permissions and 1475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * limitations under the License. 1575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey */ 1675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 1775279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeypackage com.android.server.net; 1875279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 19a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkeyimport static android.Manifest.permission.ACCESS_NETWORK_STATE; 2063d27a9233fed934340231f438493746084a681dJeff Sharkeyimport static android.Manifest.permission.CONNECTIVITY_INTERNAL; 2175279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport static android.Manifest.permission.DUMP; 2263d27a9233fed934340231f438493746084a681dJeff Sharkeyimport static android.Manifest.permission.MODIFY_NETWORK_ACCOUNTING; 2321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkeyimport static android.Manifest.permission.READ_NETWORK_USAGE_HISTORY; 24b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport static android.content.Intent.ACTION_SHUTDOWN; 25b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport static android.content.Intent.ACTION_UID_REMOVED; 26daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkeyimport static android.content.Intent.ACTION_USER_REMOVED; 27b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkeyimport static android.content.Intent.EXTRA_UID; 28cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkeyimport static android.net.ConnectivityManager.ACTION_TETHER_STATE_CHANGED; 29367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkeyimport static android.net.ConnectivityManager.CONNECTIVITY_ACTION_IMMEDIATE; 30234766a36af6214644fa8205202287084ca9cf93Jeff Sharkeyimport static android.net.ConnectivityManager.isNetworkTypeMobile; 31d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkeyimport static android.net.NetworkIdentity.COMBINE_SUBTYPE_ENABLED; 3261ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkeyimport static android.net.NetworkStats.IFACE_ALL; 33b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.SET_ALL; 34b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.SET_DEFAULT; 35b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static android.net.NetworkStats.SET_FOREGROUND; 361b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport static android.net.NetworkStats.TAG_NONE; 3775279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport static android.net.NetworkStats.UID_ALL; 38234766a36af6214644fa8205202287084ca9cf93Jeff Sharkeyimport static android.net.NetworkTemplate.buildTemplateMobileWildcard; 398fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkeyimport static android.net.NetworkTemplate.buildTemplateWifiWildcard; 40ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkeyimport static android.net.TrafficStats.KB_IN_BYTES; 41241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkeyimport static android.net.TrafficStats.MB_IN_BYTES; 42023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_DEV_BUCKET_DURATION; 43023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_DEV_DELETE_AGE; 44023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_DEV_PERSIST_BYTES; 45023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_DEV_ROTATE_AGE; 46023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_GLOBAL_ALERT_BYTES; 47023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_POLL_INTERVAL; 48023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_REPORT_XT_OVER_DEV; 49023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_SAMPLE_ENABLED; 50023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_TIME_CACHE_MAX_AGE; 51023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_UID_BUCKET_DURATION; 52023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_UID_DELETE_AGE; 53023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_UID_PERSIST_BYTES; 54023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_UID_ROTATE_AGE; 55023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_UID_TAG_BUCKET_DURATION; 56023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_UID_TAG_DELETE_AGE; 57023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_UID_TAG_PERSIST_BYTES; 58023c05a341b87d0899c89bf355b6ae27d138bb03Jeff Sharkeyimport static android.provider.Settings.Global.NETSTATS_UID_TAG_ROTATE_AGE; 59367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkeyimport static android.telephony.PhoneStateListener.LISTEN_DATA_CONNECTION_STATE; 60367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkeyimport static android.telephony.PhoneStateListener.LISTEN_NONE; 6161ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkeyimport static android.text.format.DateUtils.DAY_IN_MILLIS; 6261ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkeyimport static android.text.format.DateUtils.HOUR_IN_MILLIS; 6361ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkeyimport static android.text.format.DateUtils.MINUTE_IN_MILLIS; 64367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkeyimport static android.text.format.DateUtils.SECOND_IN_MILLIS; 65234766a36af6214644fa8205202287084ca9cf93Jeff Sharkeyimport static com.android.internal.util.ArrayUtils.appendElement; 66234766a36af6214644fa8205202287084ca9cf93Jeff Sharkeyimport static com.android.internal.util.ArrayUtils.contains; 67d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkeyimport static com.android.internal.util.Preconditions.checkNotNull; 688e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport static com.android.server.NetworkManagementService.LIMIT_GLOBAL_ALERT; 69b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static com.android.server.NetworkManagementSocketTagger.resetKernelUidStats; 70b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport static com.android.server.NetworkManagementSocketTagger.setKernelCounterSet; 7175279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 7275279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.app.AlarmManager; 7375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.app.IAlarmManager; 7475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.app.PendingIntent; 7575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.content.BroadcastReceiver; 7639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkeyimport android.content.ContentResolver; 7775279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.content.Context; 7875279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.content.Intent; 7975279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.content.IntentFilter; 80daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkeyimport android.content.pm.ApplicationInfo; 81daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkeyimport android.content.pm.PackageManager; 82d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkeyimport android.net.IConnectivityManager; 838e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkeyimport android.net.INetworkManagementEventObserver; 8475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.net.INetworkStatsService; 85b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkeyimport android.net.INetworkStatsSession; 8663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport android.net.LinkProperties; 871b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport android.net.NetworkIdentity; 88d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkeyimport android.net.NetworkInfo; 89d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkeyimport android.net.NetworkState; 9075279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.net.NetworkStats; 915a7bcf31a44d9875ca5fc010dc213aa2bd5b1168Jeff Sharkeyimport android.net.NetworkStats.NonMonotonicObserver; 9275279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.net.NetworkStatsHistory; 931b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkeyimport android.net.NetworkTemplate; 9463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport android.net.TrafficStats; 95a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkeyimport android.os.Binder; 96163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkeyimport android.os.DropBoxManager; 973f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport android.os.Environment; 9875279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.os.Handler; 9975279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.os.HandlerThread; 10075279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.os.INetworkManagementService; 101b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport android.os.Message; 1026248926e199dca9bde3c76c5f82c486c293cdcddJeff Sharkeyimport android.os.PowerManager; 10375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.os.RemoteException; 10475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.os.SystemClock; 1055ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackbornimport android.os.UserHandle; 10661ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkeyimport android.provider.Settings; 107625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkeyimport android.provider.Settings.Global; 108367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkeyimport android.telephony.PhoneStateListener; 10975279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.telephony.TelephonyManager; 11007b0dd9a092273f0451cd9881312cb9b22a7af3fJeff Sharkeyimport android.util.EventLog; 111b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkeyimport android.util.Log; 112ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkeyimport android.util.MathUtils; 11375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.util.NtpTrustedTime; 11475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.util.Slog; 115b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkeyimport android.util.SparseIntArray; 11675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport android.util.TrustedTime; 11775279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 118daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkeyimport com.android.internal.util.ArrayUtils; 11963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport com.android.internal.util.FileRotator; 12063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkeyimport com.android.internal.util.IndentingPrintWriter; 12107b0dd9a092273f0451cd9881312cb9b22a7af3fJeff Sharkeyimport com.android.server.EventLogTags; 122cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkeyimport com.android.server.connectivity.Tethering; 12375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport com.google.android.collect.Maps; 12475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 1253f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport java.io.File; 12675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport java.io.FileDescriptor; 1273f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkeyimport java.io.IOException; 12875279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport java.io.PrintWriter; 129daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkeyimport java.util.Arrays; 13075279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeyimport java.util.HashMap; 13161ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkeyimport java.util.HashSet; 132daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkeyimport java.util.List; 1333f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 13475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey/** 13575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * Collect and persist detailed network statistics, and provide this data to 13675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * other system services. 13775279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey */ 13875279904202357565cf5a1cb11148d01f42b4569Jeff Sharkeypublic class NetworkStatsService extends INetworkStatsService.Stub { 13921c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey private static final String TAG = "NetworkStats"; 140706498d387eaceb574cf4aa982fee3c288819dadJeff Sharkey private static final boolean LOGV = false; 141b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 142367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey private static final int MSG_PERFORM_POLL = 1; 143367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey private static final int MSG_UPDATE_IFACES = 2; 14425ce9ed57f137dc0b21045ab90fe595640ebf926Jeff Sharkey private static final int MSG_REGISTER_GLOBAL_ALERT = 3; 145b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey 146b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey /** Flags to control detail level of poll event. */ 147905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey private static final int FLAG_PERSIST_NETWORK = 0x1; 148905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey private static final int FLAG_PERSIST_UID = 0x2; 149b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey private static final int FLAG_PERSIST_ALL = FLAG_PERSIST_NETWORK | FLAG_PERSIST_UID; 1501f0b13b9d64085dd8342ba942f39b6063b6d534dJeff Sharkey private static final int FLAG_PERSIST_FORCE = 0x100; 1513f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 152163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey private static final String TAG_NETSTATS_ERROR = "netstats_error"; 153163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 15475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey private final Context mContext; 15575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey private final INetworkManagementService mNetworkManager; 15675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey private final IAlarmManager mAlarmManager; 15775279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey private final TrustedTime mTime; 158367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey private final TelephonyManager mTeleManager; 15939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey private final NetworkStatsSettings mSettings; 16075279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 16163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private final File mSystemDir; 16263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private final File mBaseDir; 16363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 1646248926e199dca9bde3c76c5f82c486c293cdcddJeff Sharkey private final PowerManager.WakeLock mWakeLock; 1656248926e199dca9bde3c76c5f82c486c293cdcddJeff Sharkey 166d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey private IConnectivityManager mConnManager; 167d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 1683f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey // @VisibleForTesting 1693f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey public static final String ACTION_NETWORK_STATS_POLL = 17075279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey "com.android.server.action.NETWORK_STATS_POLL"; 171497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey public static final String ACTION_NETWORK_STATS_UPDATED = 172497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey "com.android.server.action.NETWORK_STATS_UPDATED"; 17375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 17475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey private PendingIntent mPollIntent; 17575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 17663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private static final String PREFIX_DEV = "dev"; 177e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey private static final String PREFIX_XT = "xt"; 17863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private static final String PREFIX_UID = "uid"; 17963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private static final String PREFIX_UID_TAG = "uid_tag"; 18063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 18139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey /** 18239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey * Settings that can be changed externally. 18339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey */ 18439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey public interface NetworkStatsSettings { 18539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey public long getPollInterval(); 18639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey public long getTimeCacheMaxAge(); 18763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public boolean getSampleEnabled(); 18870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey public boolean getReportXtOverDev(); 18963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 19063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public static class Config { 19163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public final long bucketDuration; 19263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public final long rotateAgeMillis; 19363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public final long deleteAgeMillis; 19463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 195ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey public Config(long bucketDuration, long rotateAgeMillis, long deleteAgeMillis) { 19663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey this.bucketDuration = bucketDuration; 19763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey this.rotateAgeMillis = rotateAgeMillis; 19863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey this.deleteAgeMillis = deleteAgeMillis; 19963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 20063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 20163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 20263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public Config getDevConfig(); 203e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey public Config getXtConfig(); 20463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public Config getUidConfig(); 20563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public Config getUidTagConfig(); 206ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey 207ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey public long getGlobalAlertBytes(long def); 208ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey public long getDevPersistBytes(long def); 209ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey public long getXtPersistBytes(long def); 210ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey public long getUidPersistBytes(long def); 211ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey public long getUidTagPersistBytes(long def); 21239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 21375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 21475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey private final Object mStatsLock = new Object(); 21575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 2161b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey /** Set of currently active ifaces. */ 2171b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey private HashMap<String, NetworkIdentitySet> mActiveIfaces = Maps.newHashMap(); 21863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey /** Current default active iface. */ 21963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private String mActiveIface; 220234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey /** Set of any ifaces associated with mobile networks since boot. */ 221234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey private String[] mMobileIfaces = new String[0]; 22263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 22363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private final DropBoxNonMonotonicObserver mNonMonotonicObserver = 22463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey new DropBoxNonMonotonicObserver(); 22563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 22663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private NetworkStatsRecorder mDevRecorder; 227e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey private NetworkStatsRecorder mXtRecorder; 22863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private NetworkStatsRecorder mUidRecorder; 22963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private NetworkStatsRecorder mUidTagRecorder; 23063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 23163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey /** Cached {@link #mDevRecorder} stats. */ 23263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private NetworkStatsCollection mDevStatsCached; 23370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey /** Cached {@link #mXtRecorder} stats. */ 23470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey private NetworkStatsCollection mXtStatsCached; 23575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 236b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey /** Current counter sets for each UID. */ 237b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey private SparseIntArray mActiveUidCounterSet = new SparseIntArray(); 238b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 239a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey /** Data layer operation counters for splicing into other structures. */ 24063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private NetworkStats mUidOperations = new NetworkStats(0L, 10); 241a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 24275279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey private final HandlerThread mHandlerThread; 24375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey private final Handler mHandler; 24475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 2456341fcecc8826924a4bb24169aaf80fec9a20894Jeff Sharkey private boolean mSystemReady; 246ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey private long mPersistThreshold = 2 * MB_IN_BYTES; 247ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey private long mGlobalAlertBytes; 2486341fcecc8826924a4bb24169aaf80fec9a20894Jeff Sharkey 24975279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey public NetworkStatsService( 25075279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey Context context, INetworkManagementService networkManager, IAlarmManager alarmManager) { 251104344e507610be42fb70c7deda3c422c543bfcbJeff Sharkey this(context, networkManager, alarmManager, NtpTrustedTime.getInstance(context), 25263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey getDefaultSystemDir(), new DefaultNetworkStatsSettings(context)); 2533f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey } 2543f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 25563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private static File getDefaultSystemDir() { 2563f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey return new File(Environment.getDataDirectory(), "system"); 25775279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey } 25875279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 25975279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey public NetworkStatsService(Context context, INetworkManagementService networkManager, 26039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey IAlarmManager alarmManager, TrustedTime time, File systemDir, 26139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey NetworkStatsSettings settings) { 26275279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey mContext = checkNotNull(context, "missing Context"); 26375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey mNetworkManager = checkNotNull(networkManager, "missing INetworkManagementService"); 26475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey mAlarmManager = checkNotNull(alarmManager, "missing IAlarmManager"); 26575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey mTime = checkNotNull(time, "missing TrustedTime"); 266367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey mTeleManager = checkNotNull(TelephonyManager.getDefault(), "missing TelephonyManager"); 26739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey mSettings = checkNotNull(settings, "missing NetworkStatsSettings"); 26875279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 2696248926e199dca9bde3c76c5f82c486c293cdcddJeff Sharkey final PowerManager powerManager = (PowerManager) context.getSystemService( 2706248926e199dca9bde3c76c5f82c486c293cdcddJeff Sharkey Context.POWER_SERVICE); 2716248926e199dca9bde3c76c5f82c486c293cdcddJeff Sharkey mWakeLock = powerManager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); 2726248926e199dca9bde3c76c5f82c486c293cdcddJeff Sharkey 27375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey mHandlerThread = new HandlerThread(TAG); 27475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey mHandlerThread.start(); 275b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mHandler = new Handler(mHandlerThread.getLooper(), mHandlerCallback); 2763f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 27763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mSystemDir = checkNotNull(systemDir); 27863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mBaseDir = new File(systemDir, "netstats"); 27963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mBaseDir.mkdirs(); 28075279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey } 28175279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 28221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey public void bindConnectivityManager(IConnectivityManager connManager) { 28321c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey mConnManager = checkNotNull(connManager, "missing IConnectivityManager"); 28421c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey } 28521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey 28675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey public void systemReady() { 2876341fcecc8826924a4bb24169aaf80fec9a20894Jeff Sharkey mSystemReady = true; 2886341fcecc8826924a4bb24169aaf80fec9a20894Jeff Sharkey 289418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey if (!isBandwidthControlEnabled()) { 290418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey Slog.w(TAG, "bandwidth controls disabled, unable to track stats"); 291418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey return; 292418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey } 293418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey 29463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey // create data recorders along with historical rotators 29563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mDevRecorder = buildRecorder(PREFIX_DEV, mSettings.getDevConfig(), false); 296e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey mXtRecorder = buildRecorder(PREFIX_XT, mSettings.getXtConfig(), false); 29763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidRecorder = buildRecorder(PREFIX_UID, mSettings.getUidConfig(), false); 29863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidTagRecorder = buildRecorder(PREFIX_UID_TAG, mSettings.getUidTagConfig(), true); 29963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 300ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey updatePersistThresholds(); 301ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey 3023f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey synchronized (mStatsLock) { 30363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey // upgrade any legacy stats, migrating them to rotated files 30463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey maybeUpgradeLegacyStatsLocked(); 30563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 30639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey // read historical network stats from disk, since policy service 30763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey // might need them right away. 30863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mDevStatsCached = mDevRecorder.getOrLoadCompleteLocked(); 30970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey mXtStatsCached = mXtRecorder.getOrLoadCompleteLocked(); 31075279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 31163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey // bootstrap initial stats to prevent double-counting later 31263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey bootstrapStatsLocked(); 31363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 3143359aca7655a7d18615c1ada6cbabeff403947d1Jeff Sharkey 31521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey // watch for network interfaces to be claimed 316961e30458319cfd50e1892ba7dd14a1d0ebe4cc7Jeff Sharkey final IntentFilter connFilter = new IntentFilter(CONNECTIVITY_ACTION_IMMEDIATE); 317b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey mContext.registerReceiver(mConnReceiver, connFilter, CONNECTIVITY_INTERNAL, mHandler); 31875279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 319cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey // watch for tethering changes 320cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey final IntentFilter tetherFilter = new IntentFilter(ACTION_TETHER_STATE_CHANGED); 321cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey mContext.registerReceiver(mTetherReceiver, tetherFilter, CONNECTIVITY_INTERNAL, mHandler); 322cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey 32375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey // listen for periodic polling events 32475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey final IntentFilter pollFilter = new IntentFilter(ACTION_NETWORK_STATS_POLL); 32521c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey mContext.registerReceiver(mPollReceiver, pollFilter, READ_NETWORK_USAGE_HISTORY, mHandler); 32675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 327b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // listen for uid removal to clean stats 328b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey final IntentFilter removedFilter = new IntentFilter(ACTION_UID_REMOVED); 329b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey mContext.registerReceiver(mRemovedReceiver, removedFilter, null, mHandler); 330b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 331daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey // listen for user changes to clean stats 332daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey final IntentFilter userFilter = new IntentFilter(ACTION_USER_REMOVED); 333daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey mContext.registerReceiver(mUserReceiver, userFilter, null, mHandler); 334daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey 33575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey // persist stats during clean shutdown 336b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey final IntentFilter shutdownFilter = new IntentFilter(ACTION_SHUTDOWN); 337b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey mContext.registerReceiver(mShutdownReceiver, shutdownFilter); 33875279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 33975279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey try { 3408e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey mNetworkManager.registerObserver(mAlertObserver); 34175279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey } catch (RemoteException e) { 342b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey // ignored; service lives in system_server 34375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey } 344b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 345367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey // watch for networkType changes that aren't broadcast through 346367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey // CONNECTIVITY_ACTION_IMMEDIATE above. 347d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey if (!COMBINE_SUBTYPE_ENABLED) { 348d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey mTeleManager.listen(mPhoneListener, LISTEN_DATA_CONNECTION_STATE); 349d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey } 350367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey 3518e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey registerPollAlarmLocked(); 3528e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey registerGlobalAlert(); 35363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 3548e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey 35563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private NetworkStatsRecorder buildRecorder( 35663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey String prefix, NetworkStatsSettings.Config config, boolean includeTags) { 3576de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey final DropBoxManager dropBox = (DropBoxManager) mContext.getSystemService( 3586de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey Context.DROPBOX_SERVICE); 359ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey return new NetworkStatsRecorder(new FileRotator( 360ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey mBaseDir, prefix, config.rotateAgeMillis, config.deleteAgeMillis), 3616de357e4d10fa5977ab9a6c665dc858765e95d34Jeff Sharkey mNonMonotonicObserver, dropBox, prefix, config.bucketDuration, includeTags); 36275279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey } 36375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 3643f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey private void shutdownLocked() { 365b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey mContext.unregisterReceiver(mConnReceiver); 366367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey mContext.unregisterReceiver(mTetherReceiver); 3673f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mContext.unregisterReceiver(mPollReceiver); 368b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey mContext.unregisterReceiver(mRemovedReceiver); 3693f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey mContext.unregisterReceiver(mShutdownReceiver); 3703f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 371d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey if (!COMBINE_SUBTYPE_ENABLED) { 372d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey mTeleManager.listen(mPhoneListener, LISTEN_NONE); 373d4dd7716fb825f29a609c5c4cb31204eea78183aJeff Sharkey } 374367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey 37563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final long currentTime = mTime.hasCache() ? mTime.currentTimeMillis() 37663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey : System.currentTimeMillis(); 37763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 37863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey // persist any pending stats 37963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mDevRecorder.forcePersistLocked(currentTime); 380e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey mXtRecorder.forcePersistLocked(currentTime); 38163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidRecorder.forcePersistLocked(currentTime); 38263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidTagRecorder.forcePersistLocked(currentTime); 38363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 38463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mDevRecorder = null; 385e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey mXtRecorder = null; 38663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidRecorder = null; 38763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidTagRecorder = null; 38863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 38963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mDevStatsCached = null; 39070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey mXtStatsCached = null; 3916341fcecc8826924a4bb24169aaf80fec9a20894Jeff Sharkey 3926341fcecc8826924a4bb24169aaf80fec9a20894Jeff Sharkey mSystemReady = false; 39363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 39463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 39563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private void maybeUpgradeLegacyStatsLocked() { 39663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey File file; 39763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey try { 39863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey file = new File(mSystemDir, "netstats.bin"); 39963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey if (file.exists()) { 40063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mDevRecorder.importLegacyNetworkLocked(file); 40163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey file.delete(); 40263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 40363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 40463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey file = new File(mSystemDir, "netstats_xt.bin"); 40563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey if (file.exists()) { 40663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey file.delete(); 40763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 40863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 40963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey file = new File(mSystemDir, "netstats_uid.bin"); 41063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey if (file.exists()) { 41163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidRecorder.importLegacyUidLocked(file); 41263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidTagRecorder.importLegacyUidLocked(file); 41363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey file.delete(); 41463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 41563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } catch (IOException e) { 41663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey Log.wtf(TAG, "problem during legacy upgrade", e); 417af8339374fbf1e2f57b0be918c7fc772f4250f13Jeff Sharkey } 4183f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey } 4193f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 42075279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey /** 42175279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * Clear any existing {@link #ACTION_NETWORK_STATS_POLL} alarms, and 42239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey * reschedule based on current {@link NetworkStatsSettings#getPollInterval()}. 42375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey */ 4248e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey private void registerPollAlarmLocked() { 4258e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey try { 4268e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey if (mPollIntent != null) { 4278e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey mAlarmManager.remove(mPollIntent); 4288e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } 42975279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 4308e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey mPollIntent = PendingIntent.getBroadcast( 4318e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey mContext, 0, new Intent(ACTION_NETWORK_STATS_POLL), 0); 43275279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 4338e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey final long currentRealtime = SystemClock.elapsedRealtime(); 4348e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey mAlarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME, currentRealtime, 4358e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey mSettings.getPollInterval(), mPollIntent); 4368e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } catch (RemoteException e) { 437b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey // ignored; service lives in system_server 4388e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } 4398e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } 4408e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey 4418e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey /** 4428e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey * Register for a global alert that is delivered through 4438e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey * {@link INetworkManagementEventObserver} once a threshold amount of data 4448e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey * has been transferred. 4458e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey */ 4468e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey private void registerGlobalAlert() { 4478e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey try { 448ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey mNetworkManager.setGlobalAlert(mGlobalAlertBytes); 4498e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } catch (IllegalStateException e) { 4508e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey Slog.w(TAG, "problem registering for global alert: " + e); 4518e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } catch (RemoteException e) { 452b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey // ignored; service lives in system_server 4538e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } 45475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey } 45575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 45675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey @Override 457b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey public INetworkStatsSession openSession() { 458b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG); 4594190a047ca1c5eb19a1f7e5d599ef1d532da71c7Jeff Sharkey assertBandwidthControlEnabled(); 460d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 461b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey // return an IBinder which holds strong references to any loaded stats 462b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey // for its lifetime; when caller closes only weak references remain. 46375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 464b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey return new INetworkStatsSession.Stub() { 465b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey private NetworkStatsCollection mUidComplete; 466b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey private NetworkStatsCollection mUidTagComplete; 467b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey 468b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey private NetworkStatsCollection getUidComplete() { 469b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey if (mUidComplete == null) { 470ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey synchronized (mStatsLock) { 471ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey mUidComplete = mUidRecorder.getOrLoadCompleteLocked(); 472ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey } 473b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } 474b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey return mUidComplete; 475b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } 476b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey 477b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey private NetworkStatsCollection getUidTagComplete() { 478b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey if (mUidTagComplete == null) { 479ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey synchronized (mStatsLock) { 480ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey mUidTagComplete = mUidTagRecorder.getOrLoadCompleteLocked(); 481ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey } 482b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } 483b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey return mUidTagComplete; 484b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } 485b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey 486b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey @Override 487b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey public NetworkStats getSummaryForNetwork( 488b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey NetworkTemplate template, long start, long end) { 48970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey return internalGetSummaryForNetwork(template, start, end); 490b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } 491b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey 492b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey @Override 493b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey public NetworkStatsHistory getHistoryForNetwork(NetworkTemplate template, int fields) { 49470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey return internalGetHistoryForNetwork(template, fields); 495b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } 496b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey 497b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey @Override 498b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey public NetworkStats getSummaryForAllUid( 499b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey NetworkTemplate template, long start, long end, boolean includeTags) { 500b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey final NetworkStats stats = getUidComplete().getSummary(template, start, end); 501b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey if (includeTags) { 502b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey final NetworkStats tagStats = getUidTagComplete() 503b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey .getSummary(template, start, end); 504b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey stats.combineAllValues(tagStats); 505b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } 506b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey return stats; 507b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } 508b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey 509b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey @Override 510b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey public NetworkStatsHistory getHistoryForUid( 511b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey NetworkTemplate template, int uid, int set, int tag, int fields) { 512b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey if (tag == TAG_NONE) { 513b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey return getUidComplete().getHistory(template, uid, set, tag, fields); 514b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } else { 515b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey return getUidTagComplete().getHistory(template, uid, set, tag, fields); 516b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } 517b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } 518b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey 519b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey @Override 520b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey public void close() { 521b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey mUidComplete = null; 522b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey mUidTagComplete = null; 523b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey } 524b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey }; 525684c54a2eb860062f1960f4eba6bc71aa1cfa71dJeff Sharkey } 526684c54a2eb860062f1960f4eba6bc71aa1cfa71dJeff Sharkey 52770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey /** 52870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey * Return network summary, splicing between {@link #mDevStatsCached} 52970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey * and {@link #mXtStatsCached} when appropriate. 53070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey */ 53170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey private NetworkStats internalGetSummaryForNetwork( 53270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey NetworkTemplate template, long start, long end) { 53370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey if (!mSettings.getReportXtOverDev()) { 53470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // shortcut when XT reporting disabled 53570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey return mDevStatsCached.getSummary(template, start, end); 53670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey } 53770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 53870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // splice stats between DEV and XT, switching over from DEV to XT at 53970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // first atomic bucket. 54070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey final long firstAtomicBucket = mXtStatsCached.getFirstAtomicBucketMillis(); 54170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey final NetworkStats dev = mDevStatsCached.getSummary( 54270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey template, Math.min(start, firstAtomicBucket), Math.min(end, firstAtomicBucket)); 54370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey final NetworkStats xt = mXtStatsCached.getSummary( 54470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey template, Math.max(start, firstAtomicBucket), Math.max(end, firstAtomicBucket)); 54570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 54670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey xt.combineAllValues(dev); 54770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey return xt; 54870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey } 54970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 55070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey /** 55170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey * Return network history, splicing between {@link #mDevStatsCached} 55270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey * and {@link #mXtStatsCached} when appropriate. 55370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey */ 55470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey private NetworkStatsHistory internalGetHistoryForNetwork(NetworkTemplate template, int fields) { 55570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey if (!mSettings.getReportXtOverDev()) { 55670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // shortcut when XT reporting disabled 55770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey return mDevStatsCached.getHistory(template, UID_ALL, SET_ALL, TAG_NONE, fields); 55870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey } 55970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 56070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // splice stats between DEV and XT, switching over from DEV to XT at 56170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey // first atomic bucket. 56270c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey final long firstAtomicBucket = mXtStatsCached.getFirstAtomicBucketMillis(); 56370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey final NetworkStatsHistory dev = mDevStatsCached.getHistory( 56470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey template, UID_ALL, SET_ALL, TAG_NONE, fields, Long.MIN_VALUE, firstAtomicBucket); 56570c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey final NetworkStatsHistory xt = mXtStatsCached.getHistory( 56670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey template, UID_ALL, SET_ALL, TAG_NONE, fields, firstAtomicBucket, Long.MAX_VALUE); 56770c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 56870c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey xt.recordEntireHistory(dev); 56970c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey return xt; 57070c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey } 57170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey 57221c9c45e5caf62b935354b74392fb40c4bf18529Jeff Sharkey @Override 573b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey public long getNetworkTotalBytes(NetworkTemplate template, long start, long end) { 574b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG); 5754190a047ca1c5eb19a1f7e5d599ef1d532da71c7Jeff Sharkey assertBandwidthControlEnabled(); 57670c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey return internalGetSummaryForNetwork(template, start, end).getTotalBytes(); 577d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 578d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 579350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey @Override 580a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey public NetworkStats getDataLayerSnapshotForUid(int uid) throws RemoteException { 581a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey if (Binder.getCallingUid() != uid) { 582a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey mContext.enforceCallingOrSelfPermission(ACCESS_NETWORK_STATE, TAG); 583a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey } 5844190a047ca1c5eb19a1f7e5d599ef1d532da71c7Jeff Sharkey assertBandwidthControlEnabled(); 585a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 586a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey // TODO: switch to data layer stats once kernel exports 587a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey // for now, read network layer stats and flatten across all ifaces 5884529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey final long token = Binder.clearCallingIdentity(); 5894529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey final NetworkStats networkLayer; 5904529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey try { 5914529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey networkLayer = mNetworkManager.getNetworkStatsUidDetail(uid); 5924529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey } finally { 5934529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey Binder.restoreCallingIdentity(token); 5944529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey } 5954529bb66c47fd02b990ecb0810031157b4f36c2fJeff Sharkey 59621a547823de52806de48f70b8360353344a5ad88Jeff Sharkey // splice in operation counts 59721a547823de52806de48f70b8360353344a5ad88Jeff Sharkey networkLayer.spliceOperationsFrom(mUidOperations); 59821a547823de52806de48f70b8360353344a5ad88Jeff Sharkey 599a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey final NetworkStats dataLayer = new NetworkStats( 600a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey networkLayer.getElapsedRealtime(), networkLayer.size()); 601a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 602a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey NetworkStats.Entry entry = null; 603a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey for (int i = 0; i < networkLayer.size(); i++) { 604a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey entry = networkLayer.getValues(i, entry); 605a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey entry.iface = IFACE_ALL; 606a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey dataLayer.combineValues(entry); 607a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey } 608a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 609a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey return dataLayer; 610a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey } 611a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 612a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey @Override 613234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey public String[] getMobileIfaces() { 614234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey return mMobileIfaces; 615234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 616234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey 617234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey @Override 618a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey public void incrementOperationCount(int uid, int tag, int operationCount) { 619a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey if (Binder.getCallingUid() != uid) { 620a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey mContext.enforceCallingOrSelfPermission(MODIFY_NETWORK_ACCOUNTING, TAG); 621a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey } 622a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 623b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey if (operationCount < 0) { 624b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey throw new IllegalArgumentException("operation count can only be incremented"); 625b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 626b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey if (tag == TAG_NONE) { 627b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey throw new IllegalArgumentException("operation count must have specific tag"); 628b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 629b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 630a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey synchronized (mStatsLock) { 631b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey final int set = mActiveUidCounterSet.get(uid, SET_DEFAULT); 63263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidOperations.combineValues( 63363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mActiveIface, uid, set, tag, 0L, 0L, 0L, 0L, operationCount); 63463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidOperations.combineValues( 63563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mActiveIface, uid, set, TAG_NONE, 0L, 0L, 0L, 0L, operationCount); 636b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 637b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 638b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 639b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey @Override 640b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey public void setUidForeground(int uid, boolean uidForeground) { 641b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mContext.enforceCallingOrSelfPermission(MODIFY_NETWORK_ACCOUNTING, TAG); 642b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 643b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey synchronized (mStatsLock) { 644b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey final int set = uidForeground ? SET_FOREGROUND : SET_DEFAULT; 645b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey final int oldSet = mActiveUidCounterSet.get(uid, SET_DEFAULT); 646b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey if (oldSet != set) { 647b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey mActiveUidCounterSet.put(uid, set); 648b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey setKernelCounterSet(uid, set); 649b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 650a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey } 651a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey } 652a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey 653a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey @Override 654350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey public void forceUpdate() { 655350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG); 6564190a047ca1c5eb19a1f7e5d599ef1d532da71c7Jeff Sharkey assertBandwidthControlEnabled(); 657e630f7b31bb1e77a2eb4ef3102a25f2927cfd5c3Jeff Sharkey 658e630f7b31bb1e77a2eb4ef3102a25f2927cfd5c3Jeff Sharkey final long token = Binder.clearCallingIdentity(); 659e630f7b31bb1e77a2eb4ef3102a25f2927cfd5c3Jeff Sharkey try { 660e630f7b31bb1e77a2eb4ef3102a25f2927cfd5c3Jeff Sharkey performPoll(FLAG_PERSIST_ALL); 661e630f7b31bb1e77a2eb4ef3102a25f2927cfd5c3Jeff Sharkey } finally { 662e630f7b31bb1e77a2eb4ef3102a25f2927cfd5c3Jeff Sharkey Binder.restoreCallingIdentity(token); 663e630f7b31bb1e77a2eb4ef3102a25f2927cfd5c3Jeff Sharkey } 664350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey } 665350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey 666ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey @Override 667ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey public void advisePersistThreshold(long thresholdBytes) { 668ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey mContext.enforceCallingOrSelfPermission(MODIFY_NETWORK_ACCOUNTING, TAG); 669ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey assertBandwidthControlEnabled(); 670ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey 671ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey // clamp threshold into safe range 672ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey mPersistThreshold = MathUtils.constrain(thresholdBytes, 128 * KB_IN_BYTES, 2 * MB_IN_BYTES); 673ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey if (LOGV) { 674ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey Slog.v(TAG, "advisePersistThreshold() given " + thresholdBytes + ", clamped to " 675ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey + mPersistThreshold); 676ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey } 677ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey 67820f5c3d4135809ca0b72c23e0c8daf2a8e4e84b2Jeff Sharkey // update and persist if beyond new thresholds 679ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey final long currentTime = mTime.hasCache() ? mTime.currentTimeMillis() 680ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey : System.currentTimeMillis(); 6815801597a90949240e99c3980c0bb889deeec2e5cJeff Sharkey synchronized (mStatsLock) { 68220f5c3d4135809ca0b72c23e0c8daf2a8e4e84b2Jeff Sharkey if (!mSystemReady) return; 68320f5c3d4135809ca0b72c23e0c8daf2a8e4e84b2Jeff Sharkey 68420f5c3d4135809ca0b72c23e0c8daf2a8e4e84b2Jeff Sharkey updatePersistThresholds(); 68520f5c3d4135809ca0b72c23e0c8daf2a8e4e84b2Jeff Sharkey 6865801597a90949240e99c3980c0bb889deeec2e5cJeff Sharkey mDevRecorder.maybePersistLocked(currentTime); 6875801597a90949240e99c3980c0bb889deeec2e5cJeff Sharkey mXtRecorder.maybePersistLocked(currentTime); 6885801597a90949240e99c3980c0bb889deeec2e5cJeff Sharkey mUidRecorder.maybePersistLocked(currentTime); 6895801597a90949240e99c3980c0bb889deeec2e5cJeff Sharkey mUidTagRecorder.maybePersistLocked(currentTime); 6905801597a90949240e99c3980c0bb889deeec2e5cJeff Sharkey } 691ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey 692ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey // re-arm global alert 693ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey registerGlobalAlert(); 694ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey } 695ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey 696ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey /** 697ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey * Update {@link NetworkStatsRecorder} and {@link #mGlobalAlertBytes} to 698ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey * reflect current {@link #mPersistThreshold} value. Always defers to 699625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey * {@link Global} values when defined. 700ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey */ 701ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey private void updatePersistThresholds() { 702ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey mDevRecorder.setPersistThreshold(mSettings.getDevPersistBytes(mPersistThreshold)); 703ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey mXtRecorder.setPersistThreshold(mSettings.getXtPersistBytes(mPersistThreshold)); 704ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey mUidRecorder.setPersistThreshold(mSettings.getUidPersistBytes(mPersistThreshold)); 705ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey mUidTagRecorder.setPersistThreshold(mSettings.getUidTagPersistBytes(mPersistThreshold)); 706ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey mGlobalAlertBytes = mSettings.getGlobalAlertBytes(mPersistThreshold); 707ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey } 708ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey 70975279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey /** 710d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Receiver that watches for {@link IConnectivityManager} to claim network 71175279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * interfaces. Used to associate {@link TelephonyManager#getSubscriberId()} 71275279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey * with mobile interfaces. 71375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey */ 714b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey private BroadcastReceiver mConnReceiver = new BroadcastReceiver() { 71575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey @Override 71675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey public void onReceive(Context context, Intent intent) { 717d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey // on background handler thread, and verified CONNECTIVITY_INTERNAL 718d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey // permission above. 719367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey updateIfaces(); 72075279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey } 72175279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey }; 72275279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 723cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey /** 724cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey * Receiver that watches for {@link Tethering} to claim interface pairs. 725cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey */ 726cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey private BroadcastReceiver mTetherReceiver = new BroadcastReceiver() { 727cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey @Override 728cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey public void onReceive(Context context, Intent intent) { 729cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey // on background handler thread, and verified CONNECTIVITY_INTERNAL 730cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey // permission above. 7311f0b13b9d64085dd8342ba942f39b6063b6d534dJeff Sharkey performPoll(FLAG_PERSIST_NETWORK); 732cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey } 733cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey }; 734cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey 73575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey private BroadcastReceiver mPollReceiver = new BroadcastReceiver() { 73675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey @Override 73775279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey public void onReceive(Context context, Intent intent) { 738d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey // on background handler thread, and verified UPDATE_DEVICE_STATS 739d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey // permission above. 7401f0b13b9d64085dd8342ba942f39b6063b6d534dJeff Sharkey performPoll(FLAG_PERSIST_ALL); 7418e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey 7428e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey // verify that we're watching global alert 7438e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey registerGlobalAlert(); 74475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey } 74575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey }; 74675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 747b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey private BroadcastReceiver mRemovedReceiver = new BroadcastReceiver() { 748b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey @Override 749b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey public void onReceive(Context context, Intent intent) { 750b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // on background handler thread, and UID_REMOVED is protected 751b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // broadcast. 752daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey 753daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey final int uid = intent.getIntExtra(EXTRA_UID, -1); 754daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey if (uid == -1) return; 755daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey 756daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey synchronized (mStatsLock) { 757daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey mWakeLock.acquire(); 758daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey try { 759daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey removeUidsLocked(uid); 760daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey } finally { 761daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey mWakeLock.release(); 762daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey } 763daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey } 764daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey } 765daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey }; 766daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey 767daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey private BroadcastReceiver mUserReceiver = new BroadcastReceiver() { 768daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey @Override 769daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey public void onReceive(Context context, Intent intent) { 770daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey // On background handler thread, and USER_REMOVED is protected 771daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey // broadcast. 772daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey 773daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey final int userId = intent.getIntExtra(Intent.EXTRA_USER_HANDLE, -1); 774daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey if (userId == -1) return; 775daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey 776b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey synchronized (mStatsLock) { 7776248926e199dca9bde3c76c5f82c486c293cdcddJeff Sharkey mWakeLock.acquire(); 7786248926e199dca9bde3c76c5f82c486c293cdcddJeff Sharkey try { 779daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey removeUserLocked(userId); 7806248926e199dca9bde3c76c5f82c486c293cdcddJeff Sharkey } finally { 7816248926e199dca9bde3c76c5f82c486c293cdcddJeff Sharkey mWakeLock.release(); 7826248926e199dca9bde3c76c5f82c486c293cdcddJeff Sharkey } 783b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey } 784b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey } 785b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey }; 786b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey 78775279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey private BroadcastReceiver mShutdownReceiver = new BroadcastReceiver() { 78875279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey @Override 78975279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey public void onReceive(Context context, Intent intent) { 790b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey // SHUTDOWN is protected broadcast. 79175279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey synchronized (mStatsLock) { 7923f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey shutdownLocked(); 79375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey } 79475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey } 79575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey }; 79675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 797d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey /** 7988e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey * Observer that watches for {@link INetworkManagementService} alerts. 7998e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey */ 800216c181e76ee11a47a0b2a180f9af96740ab38adJeff Sharkey private INetworkManagementEventObserver mAlertObserver = new BaseNetworkObserver() { 8018e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey @Override 8028e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey public void limitReached(String limitName, String iface) { 8038e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey // only someone like NMS should be calling us 8048e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey mContext.enforceCallingOrSelfPermission(CONNECTIVITY_INTERNAL, TAG); 8058e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey 8068e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey if (LIMIT_GLOBAL_ALERT.equals(limitName)) { 8078e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey // kick off background poll to collect network stats; UID stats 8088e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey // are handled during normal polling interval. 8091f0b13b9d64085dd8342ba942f39b6063b6d534dJeff Sharkey final int flags = FLAG_PERSIST_NETWORK; 810b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey mHandler.obtainMessage(MSG_PERFORM_POLL, flags, 0).sendToTarget(); 8118e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey 8128e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey // re-arm global alert for next update 81325ce9ed57f137dc0b21045ab90fe595640ebf926Jeff Sharkey mHandler.obtainMessage(MSG_REGISTER_GLOBAL_ALERT).sendToTarget(); 8148e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } 8158e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } 8168e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey }; 8178e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey 818367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey private int mLastPhoneState = TelephonyManager.DATA_UNKNOWN; 819367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey private int mLastPhoneNetworkType = TelephonyManager.NETWORK_TYPE_UNKNOWN; 820367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey 821367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey /** 822367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey * Receiver that watches for {@link TelephonyManager} changes, such as 823367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey * transitioning between network types. 824367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey */ 825367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey private PhoneStateListener mPhoneListener = new PhoneStateListener() { 826367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey @Override 827367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey public void onDataConnectionStateChanged(int state, int networkType) { 828367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey final boolean stateChanged = state != mLastPhoneState; 829367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey final boolean networkTypeChanged = networkType != mLastPhoneNetworkType; 830367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey 831367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey if (networkTypeChanged && !stateChanged) { 832367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey // networkType changed without a state change, which means we 833367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey // need to roll our own update. delay long enough for 834367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey // ConnectivityManager to process. 835367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey // TODO: add direct event to ConnectivityService instead of 836367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey // relying on this delay. 837367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey if (LOGV) Slog.v(TAG, "triggering delayed updateIfaces()"); 838367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey mHandler.sendMessageDelayed( 839367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey mHandler.obtainMessage(MSG_UPDATE_IFACES), SECOND_IN_MILLIS); 840367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey } 841367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey 842367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey mLastPhoneState = state; 843367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey mLastPhoneNetworkType = networkType; 844367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey } 845367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey }; 846367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey 847367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey private void updateIfaces() { 848367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey synchronized (mStatsLock) { 849367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey mWakeLock.acquire(); 850367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey try { 851367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey updateIfacesLocked(); 852367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey } finally { 853367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey mWakeLock.release(); 854367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey } 855367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey } 856367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey } 857367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey 8588e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey /** 859d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * Inspect all current {@link NetworkState} to derive mapping from {@code 860d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * iface} to {@link NetworkStatsHistory}. When multiple {@link NetworkInfo} 861d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey * are active on a single {@code iface}, they are combined under a single 8621b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey * {@link NetworkIdentitySet}. 863d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey */ 864d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey private void updateIfacesLocked() { 8656341fcecc8826924a4bb24169aaf80fec9a20894Jeff Sharkey if (!mSystemReady) return; 86639ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey if (LOGV) Slog.v(TAG, "updateIfacesLocked()"); 867d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 868d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey // take one last stats snapshot before updating iface mapping. this 869d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey // isn't perfect, since the kernel may already be counting traffic from 870d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey // the updated network. 871b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey 8721f0b13b9d64085dd8342ba942f39b6063b6d534dJeff Sharkey // poll, but only persist network stats to keep codepath fast. UID stats 8731f0b13b9d64085dd8342ba942f39b6063b6d534dJeff Sharkey // will be persisted during next alarm poll event. 8741f0b13b9d64085dd8342ba942f39b6063b6d534dJeff Sharkey performPollLocked(FLAG_PERSIST_NETWORK); 875d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 876d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey final NetworkState[] states; 87763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final LinkProperties activeLink; 878d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey try { 879d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey states = mConnManager.getAllNetworkState(); 88063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey activeLink = mConnManager.getActiveLinkProperties(); 881d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } catch (RemoteException e) { 882b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey // ignored; service lives in system_server 883d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey return; 884d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 885d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 88663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mActiveIface = activeLink != null ? activeLink.getInterfaceName() : null; 88763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 888d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey // rebuild active interfaces based on connected networks 8891b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey mActiveIfaces.clear(); 890d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 891d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey for (NetworkState state : states) { 892d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey if (state.networkInfo.isConnected()) { 893d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey // collect networks under their parent interfaces 894d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey final String iface = state.linkProperties.getInterfaceName(); 8951b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 8961b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey NetworkIdentitySet ident = mActiveIfaces.get(iface); 8971b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey if (ident == null) { 8981b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey ident = new NetworkIdentitySet(); 8991b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey mActiveIfaces.put(iface, ident); 9001b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey } 9011b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey 902d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey ident.add(NetworkIdentity.buildNetworkIdentity(mContext, state)); 903234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey 904234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey // remember any ifaces associated with mobile networks 905234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey if (isNetworkTypeMobile(state.networkInfo.getType())) { 906234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey if (!contains(mMobileIfaces, iface)) { 907234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey mMobileIfaces = appendElement(String.class, mMobileIfaces, iface); 908234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 909234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey } 910d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 911d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 912d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey } 913d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey 91439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey /** 9158e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey * Bootstrap initial stats snapshot, usually during {@link #systemReady()} 9168e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey * so we have baseline values without double-counting. 9178e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey */ 91863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private void bootstrapStatsLocked() { 91963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final long currentTime = mTime.hasCache() ? mTime.currentTimeMillis() 92063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey : System.currentTimeMillis(); 92163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 9228e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey try { 92363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey // snapshot and record current counters; read UID stats first to 92463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey // avoid overcounting dev stats. 92563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final NetworkStats uidSnapshot = getNetworkStatsUidDetail(); 926e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey final NetworkStats xtSnapshot = mNetworkManager.getNetworkStatsSummaryXt(); 927e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey final NetworkStats devSnapshot = mNetworkManager.getNetworkStatsSummaryDev(); 92863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 92963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mDevRecorder.recordSnapshotLocked(devSnapshot, mActiveIfaces, currentTime); 930e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey mXtRecorder.recordSnapshotLocked(xtSnapshot, mActiveIfaces, currentTime); 93163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidRecorder.recordSnapshotLocked(uidSnapshot, mActiveIfaces, currentTime); 93263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidTagRecorder.recordSnapshotLocked(uidSnapshot, mActiveIfaces, currentTime); 93363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 9348e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } catch (IllegalStateException e) { 9358e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey Slog.w(TAG, "problem reading network stats: " + e); 9368e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } catch (RemoteException e) { 937b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey // ignored; service lives in system_server 9388e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } 9398e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } 9408e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey 941b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey private void performPoll(int flags) { 9428e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey synchronized (mStatsLock) { 9438e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey mWakeLock.acquire(); 944684c54a2eb860062f1960f4eba6bc71aa1cfa71dJeff Sharkey 945684c54a2eb860062f1960f4eba6bc71aa1cfa71dJeff Sharkey // try refreshing time source when stale 946684c54a2eb860062f1960f4eba6bc71aa1cfa71dJeff Sharkey if (mTime.getCacheAge() > mSettings.getTimeCacheMaxAge()) { 947684c54a2eb860062f1960f4eba6bc71aa1cfa71dJeff Sharkey mTime.forceRefresh(); 948684c54a2eb860062f1960f4eba6bc71aa1cfa71dJeff Sharkey } 949684c54a2eb860062f1960f4eba6bc71aa1cfa71dJeff Sharkey 9508e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey try { 951b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey performPollLocked(flags); 9528e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } finally { 9538e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey mWakeLock.release(); 9548e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } 9558e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } 9568e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } 9578e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey 9588e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey /** 95939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey * Periodic poll operation, reading current statistics and recording into 96039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey * {@link NetworkStatsHistory}. 96139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey */ 962b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey private void performPollLocked(int flags) { 9636341fcecc8826924a4bb24169aaf80fec9a20894Jeff Sharkey if (!mSystemReady) return; 964b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey if (LOGV) Slog.v(TAG, "performPollLocked(flags=0x" + Integer.toHexString(flags) + ")"); 9656341fcecc8826924a4bb24169aaf80fec9a20894Jeff Sharkey 9668e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey final long startRealtime = SystemClock.elapsedRealtime(); 96775279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 968b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey final boolean persistNetwork = (flags & FLAG_PERSIST_NETWORK) != 0; 969b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey final boolean persistUid = (flags & FLAG_PERSIST_UID) != 0; 9701f0b13b9d64085dd8342ba942f39b6063b6d534dJeff Sharkey final boolean persistForce = (flags & FLAG_PERSIST_FORCE) != 0; 971b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey 97275279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey // TODO: consider marking "untrusted" times in historical stats 97375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey final long currentTime = mTime.hasCache() ? mTime.currentTimeMillis() 97475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey : System.currentTimeMillis(); 97575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 97675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey try { 97763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey // snapshot and record current counters; read UID stats first to 97863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey // avoid overcounting dev stats. 97963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final NetworkStats uidSnapshot = getNetworkStatsUidDetail(); 980e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey final NetworkStats xtSnapshot = mNetworkManager.getNetworkStatsSummaryXt(); 981e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey final NetworkStats devSnapshot = mNetworkManager.getNetworkStatsSummaryDev(); 9821f0b13b9d64085dd8342ba942f39b6063b6d534dJeff Sharkey 98363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mDevRecorder.recordSnapshotLocked(devSnapshot, mActiveIfaces, currentTime); 984e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey mXtRecorder.recordSnapshotLocked(xtSnapshot, mActiveIfaces, currentTime); 98563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidRecorder.recordSnapshotLocked(uidSnapshot, mActiveIfaces, currentTime); 98663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidTagRecorder.recordSnapshotLocked(uidSnapshot, mActiveIfaces, currentTime); 987367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey 988b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey } catch (IllegalStateException e) { 989b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey Log.wtf(TAG, "problem reading network stats", e); 990905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey return; 991b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey } catch (RemoteException e) { 992b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey // ignored; service lives in system_server 993905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey return; 994905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey } 995905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey 99663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey // persist any pending data depending on requested flags 99763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey if (persistForce) { 99863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mDevRecorder.forcePersistLocked(currentTime); 999e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey mXtRecorder.forcePersistLocked(currentTime); 100063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidRecorder.forcePersistLocked(currentTime); 100163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidTagRecorder.forcePersistLocked(currentTime); 100263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } else { 100363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey if (persistNetwork) { 100463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mDevRecorder.maybePersistLocked(currentTime); 1005e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey mXtRecorder.maybePersistLocked(currentTime); 100663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 100763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey if (persistUid) { 100863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidRecorder.maybePersistLocked(currentTime); 100963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidTagRecorder.maybePersistLocked(currentTime); 101063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey } 101161ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey } 1012497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey 10138e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey if (LOGV) { 10148e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey final long duration = SystemClock.elapsedRealtime() - startRealtime; 10158e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey Slog.v(TAG, "performPollLocked() took " + duration + "ms"); 10168e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey } 10178e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey 101863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey if (mSettings.getSampleEnabled()) { 1019905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey // sample stats after each full poll 102063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey performSampleLocked(); 1021905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey } 102207b0dd9a092273f0451cd9881312cb9b22a7af3fJeff Sharkey 1023497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey // finally, dispatch updated event to any listeners 1024497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey final Intent updatedIntent = new Intent(ACTION_NETWORK_STATS_UPDATED); 1025497e4437af386930dff3bd55296d128bd4520959Jeff Sharkey updatedIntent.setFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY); 10265ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn mContext.sendBroadcastAsUser(updatedIntent, UserHandle.ALL, 10275ac72a29593ab9a20337a2225df52bdf4754be02Dianne Hackborn READ_NETWORK_USAGE_HISTORY); 102861ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey } 102961ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey 103061ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey /** 103107b0dd9a092273f0451cd9881312cb9b22a7af3fJeff Sharkey * Sample recent statistics summary into {@link EventLog}. 103207b0dd9a092273f0451cd9881312cb9b22a7af3fJeff Sharkey */ 103363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private void performSampleLocked() { 103463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey // TODO: migrate trustedtime fixes to separate binary log events 1035905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey final long trustedTime = mTime.hasCache() ? mTime.currentTimeMillis() : -1; 1036905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey 103763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey NetworkTemplate template; 103863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey NetworkStats.Entry devTotal; 103963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey NetworkStats.Entry xtTotal; 104063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey NetworkStats.Entry uidTotal; 104107b0dd9a092273f0451cd9881312cb9b22a7af3fJeff Sharkey 104207b0dd9a092273f0451cd9881312cb9b22a7af3fJeff Sharkey // collect mobile sample 1043234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey template = buildTemplateMobileWildcard(); 104463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey devTotal = mDevRecorder.getTotalSinceBootLocked(template); 1045e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey xtTotal = mXtRecorder.getTotalSinceBootLocked(template); 104663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey uidTotal = mUidRecorder.getTotalSinceBootLocked(template); 1047684c54a2eb860062f1960f4eba6bc71aa1cfa71dJeff Sharkey 1048905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey EventLogTags.writeNetstatsMobileSample( 1049905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey devTotal.rxBytes, devTotal.rxPackets, devTotal.txBytes, devTotal.txPackets, 1050905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey xtTotal.rxBytes, xtTotal.rxPackets, xtTotal.txBytes, xtTotal.txPackets, 1051905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey uidTotal.rxBytes, uidTotal.rxPackets, uidTotal.txBytes, uidTotal.txPackets, 105263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey trustedTime); 105307b0dd9a092273f0451cd9881312cb9b22a7af3fJeff Sharkey 105407b0dd9a092273f0451cd9881312cb9b22a7af3fJeff Sharkey // collect wifi sample 10558fc27e8b87bd1def854a03d84009143b315d4176Jeff Sharkey template = buildTemplateWifiWildcard(); 105663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey devTotal = mDevRecorder.getTotalSinceBootLocked(template); 1057e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey xtTotal = mXtRecorder.getTotalSinceBootLocked(template); 105863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey uidTotal = mUidRecorder.getTotalSinceBootLocked(template); 105963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 1060905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey EventLogTags.writeNetstatsWifiSample( 1061905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey devTotal.rxBytes, devTotal.rxPackets, devTotal.txBytes, devTotal.txPackets, 1062905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey xtTotal.rxBytes, xtTotal.rxPackets, xtTotal.txBytes, xtTotal.txPackets, 1063905b5891d2aa802f447ac2ce5d77b6c5ba06277aJeff Sharkey uidTotal.rxBytes, uidTotal.rxPackets, uidTotal.txBytes, uidTotal.txPackets, 106463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey trustedTime); 106507b0dd9a092273f0451cd9881312cb9b22a7af3fJeff Sharkey } 106607b0dd9a092273f0451cd9881312cb9b22a7af3fJeff Sharkey 106707b0dd9a092273f0451cd9881312cb9b22a7af3fJeff Sharkey /** 106863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * Clean up {@link #mUidRecorder} after UID is removed. 1069b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey */ 1070daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey private void removeUidsLocked(int... uids) { 1071daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey if (LOGV) Slog.v(TAG, "removeUidsLocked() for UIDs " + Arrays.toString(uids)); 1072daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey 1073daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey // Perform one last poll before removing 1074163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey performPollLocked(FLAG_PERSIST_ALL); 1075163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 1076daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey mUidRecorder.removeUidsLocked(uids); 1077daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey mUidTagRecorder.removeUidsLocked(uids); 1078daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey 1079daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey // Clear kernel stats associated with UID 1080daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey for (int uid : uids) { 1081daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey resetKernelUidStats(uid); 1082daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey } 1083daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey } 1084daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey 1085daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey /** 1086daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey * Clean up {@link #mUidRecorder} after user is removed. 1087daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey */ 1088daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey private void removeUserLocked(int userId) { 1089daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey if (LOGV) Slog.v(TAG, "removeUserLocked() for userId=" + userId); 1090daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey 1091daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey // Build list of UIDs that we should clean up 1092daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey int[] uids = new int[0]; 1093daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey final List<ApplicationInfo> apps = mContext.getPackageManager().getInstalledApplications( 1094daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey PackageManager.GET_UNINSTALLED_PACKAGES | PackageManager.GET_DISABLED_COMPONENTS); 1095daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey for (ApplicationInfo app : apps) { 1096daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey final int uid = UserHandle.getUid(userId, app.uid); 1097daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey uids = ArrayUtils.appendInt(uids, uid); 1098daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey } 1099163e6443f27884a9bfcb9a48ef606dc635852c23Jeff Sharkey 1100daa57e8d1866fe4579c280c41604f3660db7cd01Jeff Sharkey removeUidsLocked(uids); 110175279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey } 110275279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 110375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey @Override 110463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey protected void dump(FileDescriptor fd, PrintWriter writer, String[] args) { 110575279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey mContext.enforceCallingOrSelfPermission(DUMP, TAG); 110675279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 110761ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey final HashSet<String> argSet = new HashSet<String>(); 110861ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey for (String arg : args) { 110961ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey argSet.add(arg); 111061ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey } 111161ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey 1112706498d387eaceb574cf4aa982fee3c288819dadJeff Sharkey // usage: dumpsys netstats --full --uid --tag --poll --checkin 111363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final boolean poll = argSet.contains("--poll") || argSet.contains("poll"); 1114706498d387eaceb574cf4aa982fee3c288819dadJeff Sharkey final boolean checkin = argSet.contains("--checkin"); 111563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final boolean fullHistory = argSet.contains("--full") || argSet.contains("full"); 111663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final boolean includeUid = argSet.contains("--uid") || argSet.contains("detail"); 111763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final boolean includeTag = argSet.contains("--tag") || argSet.contains("detail"); 1118350083e36b9db6062e165954403ef921ff3dfdadJeff Sharkey 111963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final IndentingPrintWriter pw = new IndentingPrintWriter(writer, " "); 112061ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey 112163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey synchronized (mStatsLock) { 112263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey if (poll) { 11231f0b13b9d64085dd8342ba942f39b6063b6d534dJeff Sharkey performPollLocked(FLAG_PERSIST_ALL | FLAG_PERSIST_FORCE); 11243f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey pw.println("Forced poll"); 11253f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey return; 11263f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey } 11273f3913550c10792edb8aecf66cc83c3db5c8b311Jeff Sharkey 1128706498d387eaceb574cf4aa982fee3c288819dadJeff Sharkey if (checkin) { 1129706498d387eaceb574cf4aa982fee3c288819dadJeff Sharkey // list current stats files to verify rotation 1130706498d387eaceb574cf4aa982fee3c288819dadJeff Sharkey pw.println("Current files:"); 1131706498d387eaceb574cf4aa982fee3c288819dadJeff Sharkey pw.increaseIndent(); 1132706498d387eaceb574cf4aa982fee3c288819dadJeff Sharkey for (String file : mBaseDir.list()) { 1133706498d387eaceb574cf4aa982fee3c288819dadJeff Sharkey pw.println(file); 1134706498d387eaceb574cf4aa982fee3c288819dadJeff Sharkey } 1135706498d387eaceb574cf4aa982fee3c288819dadJeff Sharkey pw.decreaseIndent(); 1136706498d387eaceb574cf4aa982fee3c288819dadJeff Sharkey return; 1137706498d387eaceb574cf4aa982fee3c288819dadJeff Sharkey } 1138706498d387eaceb574cf4aa982fee3c288819dadJeff Sharkey 113961ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey pw.println("Active interfaces:"); 114063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey pw.increaseIndent(); 11411b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey for (String iface : mActiveIfaces.keySet()) { 11421b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey final NetworkIdentitySet ident = mActiveIfaces.get(iface); 114363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey pw.print("iface="); pw.print(iface); 114461ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey pw.print(" ident="); pw.println(ident.toString()); 114561ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey } 114663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey pw.decreaseIndent(); 114763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 114863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey pw.println("Dev stats:"); 114963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey pw.increaseIndent(); 115063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mDevRecorder.dumpLocked(pw, fullHistory); 115163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey pw.decreaseIndent(); 115263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 1153e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey pw.println("Xt stats:"); 1154e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey pw.increaseIndent(); 1155e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey mXtRecorder.dumpLocked(pw, fullHistory); 1156e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey pw.decreaseIndent(); 1157e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey 115863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey if (includeUid) { 115963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey pw.println("UID stats:"); 116063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey pw.increaseIndent(); 116163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidRecorder.dumpLocked(pw, fullHistory); 116263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey pw.decreaseIndent(); 116361ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey } 116461ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey 116563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey if (includeTag) { 116663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey pw.println("UID tag stats:"); 116763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey pw.increaseIndent(); 116863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey mUidTagRecorder.dumpLocked(pw, fullHistory); 116963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey pw.decreaseIndent(); 117061ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey } 117175279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey } 117261ee0bbb5b87fb5c4c3dc219868d52743def3d2bJeff Sharkey } 117375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 117475279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey /** 117563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * Return snapshot of current UID statistics, including any 117663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey * {@link TrafficStats#UID_TETHERING} and {@link #mUidOperations} values. 117775279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey */ 117863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private NetworkStats getNetworkStatsUidDetail() throws RemoteException { 117963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final NetworkStats uidSnapshot = mNetworkManager.getNetworkStatsUidDetail(UID_ALL); 118063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 118163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey // fold tethering stats and operations into uid snapshot 118263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final NetworkStats tetherSnapshot = getNetworkStatsTethering(); 118363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey uidSnapshot.combineAllValues(tetherSnapshot); 118463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey uidSnapshot.combineAllValues(mUidOperations); 118563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey 118663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey return uidSnapshot; 118775279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey } 118875279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey 1189d4ef8c8fc9ea70448e5d8138bf8bc96f4e69903fJeff Sharkey /** 1190d4ef8c8fc9ea70448e5d8138bf8bc96f4e69903fJeff Sharkey * Return snapshot of current tethering statistics. Will return empty 1191d4ef8c8fc9ea70448e5d8138bf8bc96f4e69903fJeff Sharkey * {@link NetworkStats} if any problems are encountered. 1192d4ef8c8fc9ea70448e5d8138bf8bc96f4e69903fJeff Sharkey */ 1193d4ef8c8fc9ea70448e5d8138bf8bc96f4e69903fJeff Sharkey private NetworkStats getNetworkStatsTethering() throws RemoteException { 1194d4ef8c8fc9ea70448e5d8138bf8bc96f4e69903fJeff Sharkey try { 1195d4ef8c8fc9ea70448e5d8138bf8bc96f4e69903fJeff Sharkey final String[] tetheredIfacePairs = mConnManager.getTetheredIfacePairs(); 1196d4ef8c8fc9ea70448e5d8138bf8bc96f4e69903fJeff Sharkey return mNetworkManager.getNetworkStatsTethering(tetheredIfacePairs); 1197d4ef8c8fc9ea70448e5d8138bf8bc96f4e69903fJeff Sharkey } catch (IllegalStateException e) { 1198d4ef8c8fc9ea70448e5d8138bf8bc96f4e69903fJeff Sharkey Log.wtf(TAG, "problem reading network stats", e); 1199d4ef8c8fc9ea70448e5d8138bf8bc96f4e69903fJeff Sharkey return new NetworkStats(0L, 10); 1200d4ef8c8fc9ea70448e5d8138bf8bc96f4e69903fJeff Sharkey } 1201d4ef8c8fc9ea70448e5d8138bf8bc96f4e69903fJeff Sharkey } 1202d4ef8c8fc9ea70448e5d8138bf8bc96f4e69903fJeff Sharkey 1203b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey private Handler.Callback mHandlerCallback = new Handler.Callback() { 1204bfdd680ab44da173a4a39fcd6feccdebb9d1f855Jeff Sharkey @Override 1205b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey public boolean handleMessage(Message msg) { 1206b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey switch (msg.what) { 12078e9992ae5053a3ac52d28a5a892aed0a0798c7abJeff Sharkey case MSG_PERFORM_POLL: { 1208b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey final int flags = msg.arg1; 1209b3d5957604f8fcaafe72bd76052bc76b682bf443Jeff Sharkey performPoll(flags); 1210b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey return true; 1211b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 1212367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey case MSG_UPDATE_IFACES: { 1213367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey updateIfaces(); 1214367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey return true; 1215367d15ab1a33b6159447fa8542d4fa8ff148371cJeff Sharkey } 121625ce9ed57f137dc0b21045ab90fe595640ebf926Jeff Sharkey case MSG_REGISTER_GLOBAL_ALERT: { 121725ce9ed57f137dc0b21045ab90fe595640ebf926Jeff Sharkey registerGlobalAlert(); 121825ce9ed57f137dc0b21045ab90fe595640ebf926Jeff Sharkey return true; 121925ce9ed57f137dc0b21045ab90fe595640ebf926Jeff Sharkey } 1220b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey default: { 1221b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey return false; 1222b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 1223b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 1224b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 1225b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey }; 1226b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 12274190a047ca1c5eb19a1f7e5d599ef1d532da71c7Jeff Sharkey private void assertBandwidthControlEnabled() { 12284190a047ca1c5eb19a1f7e5d599ef1d532da71c7Jeff Sharkey if (!isBandwidthControlEnabled()) { 12294190a047ca1c5eb19a1f7e5d599ef1d532da71c7Jeff Sharkey throw new IllegalStateException("Bandwidth module disabled"); 12304190a047ca1c5eb19a1f7e5d599ef1d532da71c7Jeff Sharkey } 12314190a047ca1c5eb19a1f7e5d599ef1d532da71c7Jeff Sharkey } 12324190a047ca1c5eb19a1f7e5d599ef1d532da71c7Jeff Sharkey 1233418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey private boolean isBandwidthControlEnabled() { 123449c1d1764bce02cf12a68e9312f3aa9dfa2e25ceJeff Sharkey final long token = Binder.clearCallingIdentity(); 1235418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey try { 1236418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey return mNetworkManager.isBandwidthControlEnabled(); 1237418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey } catch (RemoteException e) { 1238418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey // ignored; service lives in system_server 1239418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey return false; 124049c1d1764bce02cf12a68e9312f3aa9dfa2e25ceJeff Sharkey } finally { 124149c1d1764bce02cf12a68e9312f3aa9dfa2e25ceJeff Sharkey Binder.restoreCallingIdentity(token); 1242418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey } 1243418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey } 1244418d12dc8f2c518b673ebc522de4af6f7dbf0bf3Jeff Sharkey 124563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey private class DropBoxNonMonotonicObserver implements NonMonotonicObserver<String> { 1246bfdd680ab44da173a4a39fcd6feccdebb9d1f855Jeff Sharkey @Override 124763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public void foundNonMonotonic(NetworkStats left, int leftIndex, NetworkStats right, 124863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey int rightIndex, String cookie) { 124963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey Log.w(TAG, "found non-monotonic values; saving to dropbox"); 1250b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 125163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey // record error for debugging 125263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final StringBuilder builder = new StringBuilder(); 125363abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey builder.append("found non-monotonic " + cookie + " values at left[" + leftIndex 125463abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey + "] - right[" + rightIndex + "]\n"); 125563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey builder.append("left=").append(left).append('\n'); 125663abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey builder.append("right=").append(right).append('\n'); 1257b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 125863abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey final DropBoxManager dropBox = (DropBoxManager) mContext.getSystemService( 125963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey Context.DROPBOX_SERVICE); 126063abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey dropBox.addText(TAG_NETSTATS_ERROR, builder.toString()); 1261b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 1262b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey } 1263b5d55e302d2253e4bfb233ea705caf258cdc4cb9Jeff Sharkey 12641b5a2a96f793211bfbd39aa29cc41031dfa23950Jeff Sharkey /** 1265bfdd680ab44da173a4a39fcd6feccdebb9d1f855Jeff Sharkey * Default external settings that read from 1266625239a05401bbf18b04d9874cea3f82da7c29a1Jeff Sharkey * {@link android.provider.Settings.Global}. 126739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey */ 126839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey private static class DefaultNetworkStatsSettings implements NetworkStatsSettings { 126939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey private final ContentResolver mResolver; 127039ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 127139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey public DefaultNetworkStatsSettings(Context context) { 127239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey mResolver = checkNotNull(context.getContentResolver()); 127339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey // TODO: adjust these timings for production builds 127439ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 127539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 1276e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey private long getGlobalLong(String name, long def) { 1277e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey return Settings.Global.getLong(mResolver, name, def); 127839ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 1279e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey private boolean getGlobalBoolean(String name, boolean def) { 1280991d1b1b3f303ad247a959881b1d5b57766f678bJeff Sharkey final int defInt = def ? 1 : 0; 1281e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey return Settings.Global.getInt(mResolver, name, defInt) != 0; 1282991d1b1b3f303ad247a959881b1d5b57766f678bJeff Sharkey } 128339ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey 1284bfdd680ab44da173a4a39fcd6feccdebb9d1f855Jeff Sharkey @Override 128539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey public long getPollInterval() { 1286e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey return getGlobalLong(NETSTATS_POLL_INTERVAL, 30 * MINUTE_IN_MILLIS); 128739ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 1288bfdd680ab44da173a4a39fcd6feccdebb9d1f855Jeff Sharkey @Override 128963abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public long getTimeCacheMaxAge() { 1290e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey return getGlobalLong(NETSTATS_TIME_CACHE_MAX_AGE, DAY_IN_MILLIS); 129139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 1292bfdd680ab44da173a4a39fcd6feccdebb9d1f855Jeff Sharkey @Override 1293ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey public long getGlobalAlertBytes(long def) { 1294e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey return getGlobalLong(NETSTATS_GLOBAL_ALERT_BYTES, def); 129539ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 1296bfdd680ab44da173a4a39fcd6feccdebb9d1f855Jeff Sharkey @Override 129763abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public boolean getSampleEnabled() { 1298e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey return getGlobalBoolean(NETSTATS_SAMPLE_ENABLED, true); 129939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 1300bfdd680ab44da173a4a39fcd6feccdebb9d1f855Jeff Sharkey @Override 130170c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey public boolean getReportXtOverDev() { 1302e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey return getGlobalBoolean(NETSTATS_REPORT_XT_OVER_DEV, true); 130370c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey } 130470c70530bd6793869736ec894498e4ebf5dc9b20Jeff Sharkey @Override 130563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public Config getDevConfig() { 1306e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey return new Config(getGlobalLong(NETSTATS_DEV_BUCKET_DURATION, HOUR_IN_MILLIS), 1307e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey getGlobalLong(NETSTATS_DEV_ROTATE_AGE, 15 * DAY_IN_MILLIS), 1308e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey getGlobalLong(NETSTATS_DEV_DELETE_AGE, 90 * DAY_IN_MILLIS)); 130939ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 1310bfdd680ab44da173a4a39fcd6feccdebb9d1f855Jeff Sharkey @Override 1311e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey public Config getXtConfig() { 1312e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey return getDevConfig(); 1313e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey } 1314e8914c36276710de50b347c1e6aecfa45d6a56cdJeff Sharkey @Override 131563abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public Config getUidConfig() { 1316e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey return new Config(getGlobalLong(NETSTATS_UID_BUCKET_DURATION, 2 * HOUR_IN_MILLIS), 1317e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey getGlobalLong(NETSTATS_UID_ROTATE_AGE, 15 * DAY_IN_MILLIS), 1318e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey getGlobalLong(NETSTATS_UID_DELETE_AGE, 90 * DAY_IN_MILLIS)); 1319d03fd3f004e3ba8aaa1692ee0e92e8ae171d2a04Jeff Sharkey } 1320bfdd680ab44da173a4a39fcd6feccdebb9d1f855Jeff Sharkey @Override 132163abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey public Config getUidTagConfig() { 1322e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey return new Config(getGlobalLong(NETSTATS_UID_TAG_BUCKET_DURATION, 2 * HOUR_IN_MILLIS), 1323e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey getGlobalLong(NETSTATS_UID_TAG_ROTATE_AGE, 5 * DAY_IN_MILLIS), 1324e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey getGlobalLong(NETSTATS_UID_TAG_DELETE_AGE, 15 * DAY_IN_MILLIS)); 1325ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey } 1326ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey @Override 1327ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey public long getDevPersistBytes(long def) { 1328e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey return getGlobalLong(NETSTATS_DEV_PERSIST_BYTES, def); 1329ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey } 1330ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey @Override 1331ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey public long getXtPersistBytes(long def) { 1332ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey return getDevPersistBytes(def); 1333ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey } 1334ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey @Override 1335ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey public long getUidPersistBytes(long def) { 1336e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey return getGlobalLong(NETSTATS_UID_PERSIST_BYTES, def); 1337ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey } 1338ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey @Override 1339ac3fcb1590e1da21324c13ce237ec48f2bf488bfJeff Sharkey public long getUidTagPersistBytes(long def) { 1340e6e6197d7c2eb5c29224bcddb0131a302267f6deJeff Sharkey return getGlobalLong(NETSTATS_UID_TAG_PERSIST_BYTES, def); 134139ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 134239ebc2195ed16b9e955dd57f5c95212bb7b934b6Jeff Sharkey } 134375279904202357565cf5a1cb11148d01f42b4569Jeff Sharkey} 1344