Home | History | Annotate | Download | only in net
      1 /*
      2  * Copyright (C) 2007 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package android.net;
     18 
     19 import android.annotation.RequiresPermission;
     20 import android.annotation.SystemApi;
     21 import android.app.DownloadManager;
     22 import android.app.backup.BackupManager;
     23 import android.app.usage.NetworkStatsManager;
     24 import android.content.Context;
     25 import android.media.MediaPlayer;
     26 import android.os.RemoteException;
     27 import android.os.ServiceManager;
     28 
     29 import com.android.server.NetworkManagementSocketTagger;
     30 
     31 import dalvik.system.SocketTagger;
     32 
     33 import java.net.DatagramSocket;
     34 import java.net.Socket;
     35 import java.net.SocketException;
     36 
     37 /**
     38  * Class that provides network traffic statistics. These statistics include
     39  * bytes transmitted and received and network packets transmitted and received,
     40  * over all interfaces, over the mobile interface, and on a per-UID basis.
     41  * <p>
     42  * These statistics may not be available on all platforms. If the statistics are
     43  * not supported by this device, {@link #UNSUPPORTED} will be returned.
     44  * <p>
     45  * Note that the statistics returned by this class reset and start from zero
     46  * after every reboot. To access more robust historical network statistics data,
     47  * use {@link NetworkStatsManager} instead.
     48  */
     49 public class TrafficStats {
     50     /**
     51      * The return value to indicate that the device does not support the statistic.
     52      */
     53     public final static int UNSUPPORTED = -1;
     54 
     55     /** @hide */
     56     public static final long KB_IN_BYTES = 1024;
     57     /** @hide */
     58     public static final long MB_IN_BYTES = KB_IN_BYTES * 1024;
     59     /** @hide */
     60     public static final long GB_IN_BYTES = MB_IN_BYTES * 1024;
     61     /** @hide */
     62     public static final long TB_IN_BYTES = GB_IN_BYTES * 1024;
     63     /** @hide */
     64     public static final long PB_IN_BYTES = TB_IN_BYTES * 1024;
     65 
     66     /**
     67      * Special UID value used when collecting {@link NetworkStatsHistory} for
     68      * removed applications.
     69      *
     70      * @hide
     71      */
     72     public static final int UID_REMOVED = -4;
     73 
     74     /**
     75      * Special UID value used when collecting {@link NetworkStatsHistory} for
     76      * tethering traffic.
     77      *
     78      * @hide
     79      */
     80     public static final int UID_TETHERING = -5;
     81 
     82     /**
     83      * Default tag value for {@link DownloadManager} traffic.
     84      *
     85      * @hide
     86      */
     87     public static final int TAG_SYSTEM_DOWNLOAD = 0xFFFFFF01;
     88 
     89     /**
     90      * Default tag value for {@link MediaPlayer} traffic.
     91      *
     92      * @hide
     93      */
     94     public static final int TAG_SYSTEM_MEDIA = 0xFFFFFF02;
     95 
     96     /**
     97      * Default tag value for {@link BackupManager} backup traffic; that is,
     98      * traffic from the device to the storage backend.
     99      *
    100      * @hide
    101      */
    102     public static final int TAG_SYSTEM_BACKUP = 0xFFFFFF03;
    103 
    104     /**
    105      * Default tag value for {@link BackupManager} restore traffic; that is,
    106      * app data retrieved from the storage backend at install time.
    107      *
    108      * @hide
    109      */
    110     public static final int TAG_SYSTEM_RESTORE = 0xFFFFFF04;
    111 
    112     /** @hide */
    113     public static final int TAG_SYSTEM_DHCP = 0xFFFFFF05;
    114     /** @hide */
    115     public static final int TAG_SYSTEM_NTP = 0xFFFFFF06;
    116     /** @hide */
    117     public static final int TAG_SYSTEM_PROBE = 0xFFFFFF07;
    118     /** @hide */
    119     public static final int TAG_SYSTEM_NEIGHBOR = 0xFFFFFF08;
    120     /** @hide */
    121     public static final int TAG_SYSTEM_GPS = 0xFFFFFF09;
    122     /** @hide */
    123     public static final int TAG_SYSTEM_PAC = 0xFFFFFF0A;
    124 
    125     /**
    126      * Sockets that are strictly local on device; never hits network.
    127      *
    128      * @hide
    129      */
    130     public static final int TAG_SYSTEM_LOCAL = 0xFFFFFFAA;
    131 
    132     private static INetworkStatsService sStatsService;
    133 
    134     private synchronized static INetworkStatsService getStatsService() {
    135         if (sStatsService == null) {
    136             sStatsService = INetworkStatsService.Stub.asInterface(
    137                     ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
    138         }
    139         return sStatsService;
    140     }
    141 
    142     /**
    143      * Snapshot of {@link NetworkStats} when the currently active profiling
    144      * session started, or {@code null} if no session active.
    145      *
    146      * @see #startDataProfiling(Context)
    147      * @see #stopDataProfiling(Context)
    148      */
    149     private static NetworkStats sActiveProfilingStart;
    150 
    151     private static Object sProfilingLock = new Object();
    152 
    153     /**
    154      * Set active tag to use when accounting {@link Socket} traffic originating
    155      * from the current thread. Only one active tag per thread is supported.
    156      * <p>
    157      * Changes only take effect during subsequent calls to
    158      * {@link #tagSocket(Socket)}.
    159      * <p>
    160      * Tags between {@code 0xFFFFFF00} and {@code 0xFFFFFFFF} are reserved and
    161      * used internally by system services like {@link DownloadManager} when
    162      * performing traffic on behalf of an application.
    163      *
    164      * @see #clearThreadStatsTag()
    165      */
    166     public static void setThreadStatsTag(int tag) {
    167         NetworkManagementSocketTagger.setThreadSocketStatsTag(tag);
    168     }
    169 
    170     /**
    171      * Set active tag to use when accounting {@link Socket} traffic originating
    172      * from the current thread. Only one active tag per thread is supported.
    173      * <p>
    174      * Changes only take effect during subsequent calls to
    175      * {@link #tagSocket(Socket)}.
    176      * <p>
    177      * Tags between {@code 0xFFFFFF00} and {@code 0xFFFFFFFF} are reserved and
    178      * used internally by system services like {@link DownloadManager} when
    179      * performing traffic on behalf of an application.
    180      *
    181      * @return the current tag for the calling thread, which can be used to
    182      *         restore any existing values after a nested operation is finished
    183      */
    184     public static int getAndSetThreadStatsTag(int tag) {
    185         return NetworkManagementSocketTagger.setThreadSocketStatsTag(tag);
    186     }
    187 
    188     /**
    189      * Set active tag to use when accounting {@link Socket} traffic originating
    190      * from the current thread. The tag used internally is well-defined to
    191      * distinguish all backup-related traffic.
    192      *
    193      * @hide
    194      */
    195     @SystemApi
    196     public static void setThreadStatsTagBackup() {
    197         setThreadStatsTag(TAG_SYSTEM_BACKUP);
    198     }
    199 
    200     /**
    201      * Set active tag to use when accounting {@link Socket} traffic originating
    202      * from the current thread. The tag used internally is well-defined to
    203      * distinguish all restore-related traffic.
    204      *
    205      * @hide
    206      */
    207     @SystemApi
    208     public static void setThreadStatsTagRestore() {
    209         setThreadStatsTag(TAG_SYSTEM_RESTORE);
    210     }
    211 
    212     /**
    213      * Get the active tag used when accounting {@link Socket} traffic originating
    214      * from the current thread. Only one active tag per thread is supported.
    215      * {@link #tagSocket(Socket)}.
    216      *
    217      * @see #setThreadStatsTag(int)
    218      */
    219     public static int getThreadStatsTag() {
    220         return NetworkManagementSocketTagger.getThreadSocketStatsTag();
    221     }
    222 
    223     /**
    224      * Clear any active tag set to account {@link Socket} traffic originating
    225      * from the current thread.
    226      *
    227      * @see #setThreadStatsTag(int)
    228      */
    229     public static void clearThreadStatsTag() {
    230         NetworkManagementSocketTagger.setThreadSocketStatsTag(-1);
    231     }
    232 
    233     /**
    234      * Set specific UID to use when accounting {@link Socket} traffic
    235      * originating from the current thread. Designed for use when performing an
    236      * operation on behalf of another application.
    237      * <p>
    238      * Changes only take effect during subsequent calls to
    239      * {@link #tagSocket(Socket)}.
    240      * <p>
    241      * To take effect, caller must hold
    242      * {@link android.Manifest.permission#UPDATE_DEVICE_STATS} permission.
    243      *
    244      * @hide
    245      */
    246     @SystemApi
    247     @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS)
    248     public static void setThreadStatsUid(int uid) {
    249         NetworkManagementSocketTagger.setThreadSocketStatsUid(uid);
    250     }
    251 
    252     /**
    253      * Clear any active UID set to account {@link Socket} traffic originating
    254      * from the current thread.
    255      *
    256      * @see #setThreadStatsUid(int)
    257      * @hide
    258      */
    259     @SystemApi
    260     @RequiresPermission(android.Manifest.permission.UPDATE_DEVICE_STATS)
    261     public static void clearThreadStatsUid() {
    262         NetworkManagementSocketTagger.setThreadSocketStatsUid(-1);
    263     }
    264 
    265     /**
    266      * Tag the given {@link Socket} with any statistics parameters active for
    267      * the current thread. Subsequent calls always replace any existing
    268      * parameters. When finished, call {@link #untagSocket(Socket)} to remove
    269      * statistics parameters.
    270      *
    271      * @see #setThreadStatsTag(int)
    272      */
    273     public static void tagSocket(Socket socket) throws SocketException {
    274         SocketTagger.get().tag(socket);
    275     }
    276 
    277     /**
    278      * Remove any statistics parameters from the given {@link Socket}.
    279      */
    280     public static void untagSocket(Socket socket) throws SocketException {
    281         SocketTagger.get().untag(socket);
    282     }
    283 
    284     /**
    285      * Tag the given {@link DatagramSocket} with any statistics parameters
    286      * active for the current thread. Subsequent calls always replace any
    287      * existing parameters. When finished, call
    288      * {@link #untagDatagramSocket(DatagramSocket)} to remove statistics
    289      * parameters.
    290      *
    291      * @see #setThreadStatsTag(int)
    292      */
    293     public static void tagDatagramSocket(DatagramSocket socket) throws SocketException {
    294         SocketTagger.get().tag(socket);
    295     }
    296 
    297     /**
    298      * Remove any statistics parameters from the given {@link DatagramSocket}.
    299      */
    300     public static void untagDatagramSocket(DatagramSocket socket) throws SocketException {
    301         SocketTagger.get().untag(socket);
    302     }
    303 
    304     /**
    305      * Start profiling data usage for current UID. Only one profiling session
    306      * can be active at a time.
    307      *
    308      * @hide
    309      */
    310     public static void startDataProfiling(Context context) {
    311         synchronized (sProfilingLock) {
    312             if (sActiveProfilingStart != null) {
    313                 throw new IllegalStateException("already profiling data");
    314             }
    315 
    316             // take snapshot in time; we calculate delta later
    317             sActiveProfilingStart = getDataLayerSnapshotForUid(context);
    318         }
    319     }
    320 
    321     /**
    322      * Stop profiling data usage for current UID.
    323      *
    324      * @return Detailed {@link NetworkStats} of data that occurred since last
    325      *         {@link #startDataProfiling(Context)} call.
    326      * @hide
    327      */
    328     public static NetworkStats stopDataProfiling(Context context) {
    329         synchronized (sProfilingLock) {
    330             if (sActiveProfilingStart == null) {
    331                 throw new IllegalStateException("not profiling data");
    332             }
    333 
    334             // subtract starting values and return delta
    335             final NetworkStats profilingStop = getDataLayerSnapshotForUid(context);
    336             final NetworkStats profilingDelta = NetworkStats.subtract(
    337                     profilingStop, sActiveProfilingStart, null, null);
    338             sActiveProfilingStart = null;
    339             return profilingDelta;
    340         }
    341     }
    342 
    343     /**
    344      * Increment count of network operations performed under the accounting tag
    345      * currently active on the calling thread. This can be used to derive
    346      * bytes-per-operation.
    347      *
    348      * @param operationCount Number of operations to increment count by.
    349      */
    350     public static void incrementOperationCount(int operationCount) {
    351         final int tag = getThreadStatsTag();
    352         incrementOperationCount(tag, operationCount);
    353     }
    354 
    355     /**
    356      * Increment count of network operations performed under the given
    357      * accounting tag. This can be used to derive bytes-per-operation.
    358      *
    359      * @param tag Accounting tag used in {@link #setThreadStatsTag(int)}.
    360      * @param operationCount Number of operations to increment count by.
    361      */
    362     public static void incrementOperationCount(int tag, int operationCount) {
    363         final int uid = android.os.Process.myUid();
    364         try {
    365             getStatsService().incrementOperationCount(uid, tag, operationCount);
    366         } catch (RemoteException e) {
    367             throw e.rethrowFromSystemServer();
    368         }
    369     }
    370 
    371     /** {@hide} */
    372     public static void closeQuietly(INetworkStatsSession session) {
    373         // TODO: move to NetworkStatsService once it exists
    374         if (session != null) {
    375             try {
    376                 session.close();
    377             } catch (RuntimeException rethrown) {
    378                 throw rethrown;
    379             } catch (Exception ignored) {
    380             }
    381         }
    382     }
    383 
    384     /**
    385      * Return number of packets transmitted across mobile networks since device
    386      * boot. Counts packets across all mobile network interfaces, and always
    387      * increases monotonically since device boot. Statistics are measured at the
    388      * network layer, so they include both TCP and UDP usage.
    389      * <p>
    390      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
    391      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
    392      */
    393     public static long getMobileTxPackets() {
    394         long total = 0;
    395         for (String iface : getMobileIfaces()) {
    396             total += getTxPackets(iface);
    397         }
    398         return total;
    399     }
    400 
    401     /**
    402      * Return number of packets received across mobile networks since device
    403      * boot. Counts packets across all mobile network interfaces, and always
    404      * increases monotonically since device boot. Statistics are measured at the
    405      * network layer, so they include both TCP and UDP usage.
    406      * <p>
    407      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
    408      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
    409      */
    410     public static long getMobileRxPackets() {
    411         long total = 0;
    412         for (String iface : getMobileIfaces()) {
    413             total += getRxPackets(iface);
    414         }
    415         return total;
    416     }
    417 
    418     /**
    419      * Return number of bytes transmitted across mobile networks since device
    420      * boot. Counts packets across all mobile network interfaces, and always
    421      * increases monotonically since device boot. Statistics are measured at the
    422      * network layer, so they include both TCP and UDP usage.
    423      * <p>
    424      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
    425      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
    426      */
    427     public static long getMobileTxBytes() {
    428         long total = 0;
    429         for (String iface : getMobileIfaces()) {
    430             total += getTxBytes(iface);
    431         }
    432         return total;
    433     }
    434 
    435     /**
    436      * Return number of bytes received across mobile networks since device boot.
    437      * Counts packets across all mobile network interfaces, and always increases
    438      * monotonically since device boot. Statistics are measured at the network
    439      * layer, so they include both TCP and UDP usage.
    440      * <p>
    441      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
    442      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
    443      */
    444     public static long getMobileRxBytes() {
    445         long total = 0;
    446         for (String iface : getMobileIfaces()) {
    447             total += getRxBytes(iface);
    448         }
    449         return total;
    450     }
    451 
    452     /** {@hide} */
    453     public static long getMobileTcpRxPackets() {
    454         long total = 0;
    455         for (String iface : getMobileIfaces()) {
    456             final long stat = nativeGetIfaceStat(iface, TYPE_TCP_RX_PACKETS);
    457             if (stat != UNSUPPORTED) {
    458                 total += stat;
    459             }
    460         }
    461         return total;
    462     }
    463 
    464     /** {@hide} */
    465     public static long getMobileTcpTxPackets() {
    466         long total = 0;
    467         for (String iface : getMobileIfaces()) {
    468             final long stat = nativeGetIfaceStat(iface, TYPE_TCP_TX_PACKETS);
    469             if (stat != UNSUPPORTED) {
    470                 total += stat;
    471             }
    472         }
    473         return total;
    474     }
    475 
    476     /** {@hide} */
    477     public static long getTxPackets(String iface) {
    478         return nativeGetIfaceStat(iface, TYPE_TX_PACKETS);
    479     }
    480 
    481     /** {@hide} */
    482     public static long getRxPackets(String iface) {
    483         return nativeGetIfaceStat(iface, TYPE_RX_PACKETS);
    484     }
    485 
    486     /** {@hide} */
    487     public static long getTxBytes(String iface) {
    488         return nativeGetIfaceStat(iface, TYPE_TX_BYTES);
    489     }
    490 
    491     /** {@hide} */
    492     public static long getRxBytes(String iface) {
    493         return nativeGetIfaceStat(iface, TYPE_RX_BYTES);
    494     }
    495 
    496     /**
    497      * Return number of packets transmitted since device boot. Counts packets
    498      * across all network interfaces, and always increases monotonically since
    499      * device boot. Statistics are measured at the network layer, so they
    500      * include both TCP and UDP usage.
    501      * <p>
    502      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
    503      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
    504      */
    505     public static long getTotalTxPackets() {
    506         return nativeGetTotalStat(TYPE_TX_PACKETS);
    507     }
    508 
    509     /**
    510      * Return number of packets received since device boot. Counts packets
    511      * across all network interfaces, and always increases monotonically since
    512      * device boot. Statistics are measured at the network layer, so they
    513      * include both TCP and UDP usage.
    514      * <p>
    515      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
    516      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
    517      */
    518     public static long getTotalRxPackets() {
    519         return nativeGetTotalStat(TYPE_RX_PACKETS);
    520     }
    521 
    522     /**
    523      * Return number of bytes transmitted since device boot. Counts packets
    524      * across all network interfaces, and always increases monotonically since
    525      * device boot. Statistics are measured at the network layer, so they
    526      * include both TCP and UDP usage.
    527      * <p>
    528      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
    529      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
    530      */
    531     public static long getTotalTxBytes() {
    532         return nativeGetTotalStat(TYPE_TX_BYTES);
    533     }
    534 
    535     /**
    536      * Return number of bytes received since device boot. Counts packets across
    537      * all network interfaces, and always increases monotonically since device
    538      * boot. Statistics are measured at the network layer, so they include both
    539      * TCP and UDP usage.
    540      * <p>
    541      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
    542      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
    543      */
    544     public static long getTotalRxBytes() {
    545         return nativeGetTotalStat(TYPE_RX_BYTES);
    546     }
    547 
    548     /**
    549      * Return number of bytes transmitted by the given UID since device boot.
    550      * Counts packets across all network interfaces, and always increases
    551      * monotonically since device boot. Statistics are measured at the network
    552      * layer, so they include both TCP and UDP usage.
    553      * <p>
    554      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
    555      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
    556      * <p>
    557      * Starting in {@link android.os.Build.VERSION_CODES#N} this will only
    558      * report traffic statistics for the calling UID. It will return
    559      * {@link #UNSUPPORTED} for all other UIDs for privacy reasons. To access
    560      * historical network statistics belonging to other UIDs, use
    561      * {@link NetworkStatsManager}.
    562      *
    563      * @see android.os.Process#myUid()
    564      * @see android.content.pm.ApplicationInfo#uid
    565      */
    566     public static long getUidTxBytes(int uid) {
    567         // This isn't actually enforcing any security; it just returns the
    568         // unsupported value. The real filtering is done at the kernel level.
    569         final int callingUid = android.os.Process.myUid();
    570         if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) {
    571             return nativeGetUidStat(uid, TYPE_TX_BYTES);
    572         } else {
    573             return UNSUPPORTED;
    574         }
    575     }
    576 
    577     /**
    578      * Return number of bytes received by the given UID since device boot.
    579      * Counts packets across all network interfaces, and always increases
    580      * monotonically since device boot. Statistics are measured at the network
    581      * layer, so they include both TCP and UDP usage.
    582      * <p>
    583      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return
    584      * {@link #UNSUPPORTED} on devices where statistics aren't available.
    585      * <p>
    586      * Starting in {@link android.os.Build.VERSION_CODES#N} this will only
    587      * report traffic statistics for the calling UID. It will return
    588      * {@link #UNSUPPORTED} for all other UIDs for privacy reasons. To access
    589      * historical network statistics belonging to other UIDs, use
    590      * {@link NetworkStatsManager}.
    591      *
    592      * @see android.os.Process#myUid()
    593      * @see android.content.pm.ApplicationInfo#uid
    594      */
    595     public static long getUidRxBytes(int uid) {
    596         // This isn't actually enforcing any security; it just returns the
    597         // unsupported value. The real filtering is done at the kernel level.
    598         final int callingUid = android.os.Process.myUid();
    599         if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) {
    600             return nativeGetUidStat(uid, TYPE_RX_BYTES);
    601         } else {
    602             return UNSUPPORTED;
    603         }
    604     }
    605 
    606     /**
    607      * Return number of packets transmitted by the given UID since device boot.
    608      * Counts packets across all network interfaces, and always increases
    609      * monotonically since device boot. Statistics are measured at the network
    610      * layer, so they include both TCP and UDP usage.
    611      * <p>
    612      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return
    613      * {@link #UNSUPPORTED} on devices where statistics aren't available.
    614      * <p>
    615      * Starting in {@link android.os.Build.VERSION_CODES#N} this will only
    616      * report traffic statistics for the calling UID. It will return
    617      * {@link #UNSUPPORTED} for all other UIDs for privacy reasons. To access
    618      * historical network statistics belonging to other UIDs, use
    619      * {@link NetworkStatsManager}.
    620      *
    621      * @see android.os.Process#myUid()
    622      * @see android.content.pm.ApplicationInfo#uid
    623      */
    624     public static long getUidTxPackets(int uid) {
    625         // This isn't actually enforcing any security; it just returns the
    626         // unsupported value. The real filtering is done at the kernel level.
    627         final int callingUid = android.os.Process.myUid();
    628         if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) {
    629             return nativeGetUidStat(uid, TYPE_TX_PACKETS);
    630         } else {
    631             return UNSUPPORTED;
    632         }
    633     }
    634 
    635     /**
    636      * Return number of packets received by the given UID since device boot.
    637      * Counts packets across all network interfaces, and always increases
    638      * monotonically since device boot. Statistics are measured at the network
    639      * layer, so they include both TCP and UDP usage.
    640      * <p>
    641      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return
    642      * {@link #UNSUPPORTED} on devices where statistics aren't available.
    643      * <p>
    644      * Starting in {@link android.os.Build.VERSION_CODES#N} this will only
    645      * report traffic statistics for the calling UID. It will return
    646      * {@link #UNSUPPORTED} for all other UIDs for privacy reasons. To access
    647      * historical network statistics belonging to other UIDs, use
    648      * {@link NetworkStatsManager}.
    649      *
    650      * @see android.os.Process#myUid()
    651      * @see android.content.pm.ApplicationInfo#uid
    652      */
    653     public static long getUidRxPackets(int uid) {
    654         // This isn't actually enforcing any security; it just returns the
    655         // unsupported value. The real filtering is done at the kernel level.
    656         final int callingUid = android.os.Process.myUid();
    657         if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) {
    658             return nativeGetUidStat(uid, TYPE_RX_PACKETS);
    659         } else {
    660             return UNSUPPORTED;
    661         }
    662     }
    663 
    664     /**
    665      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
    666      *             transport layer statistics are no longer available, and will
    667      *             always return {@link #UNSUPPORTED}.
    668      * @see #getUidTxBytes(int)
    669      */
    670     @Deprecated
    671     public static long getUidTcpTxBytes(int uid) {
    672         return UNSUPPORTED;
    673     }
    674 
    675     /**
    676      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
    677      *             transport layer statistics are no longer available, and will
    678      *             always return {@link #UNSUPPORTED}.
    679      * @see #getUidRxBytes(int)
    680      */
    681     @Deprecated
    682     public static long getUidTcpRxBytes(int uid) {
    683         return UNSUPPORTED;
    684     }
    685 
    686     /**
    687      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
    688      *             transport layer statistics are no longer available, and will
    689      *             always return {@link #UNSUPPORTED}.
    690      * @see #getUidTxBytes(int)
    691      */
    692     @Deprecated
    693     public static long getUidUdpTxBytes(int uid) {
    694         return UNSUPPORTED;
    695     }
    696 
    697     /**
    698      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
    699      *             transport layer statistics are no longer available, and will
    700      *             always return {@link #UNSUPPORTED}.
    701      * @see #getUidRxBytes(int)
    702      */
    703     @Deprecated
    704     public static long getUidUdpRxBytes(int uid) {
    705         return UNSUPPORTED;
    706     }
    707 
    708     /**
    709      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
    710      *             transport layer statistics are no longer available, and will
    711      *             always return {@link #UNSUPPORTED}.
    712      * @see #getUidTxPackets(int)
    713      */
    714     @Deprecated
    715     public static long getUidTcpTxSegments(int uid) {
    716         return UNSUPPORTED;
    717     }
    718 
    719     /**
    720      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
    721      *             transport layer statistics are no longer available, and will
    722      *             always return {@link #UNSUPPORTED}.
    723      * @see #getUidRxPackets(int)
    724      */
    725     @Deprecated
    726     public static long getUidTcpRxSegments(int uid) {
    727         return UNSUPPORTED;
    728     }
    729 
    730     /**
    731      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
    732      *             transport layer statistics are no longer available, and will
    733      *             always return {@link #UNSUPPORTED}.
    734      * @see #getUidTxPackets(int)
    735      */
    736     @Deprecated
    737     public static long getUidUdpTxPackets(int uid) {
    738         return UNSUPPORTED;
    739     }
    740 
    741     /**
    742      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
    743      *             transport layer statistics are no longer available, and will
    744      *             always return {@link #UNSUPPORTED}.
    745      * @see #getUidRxPackets(int)
    746      */
    747     @Deprecated
    748     public static long getUidUdpRxPackets(int uid) {
    749         return UNSUPPORTED;
    750     }
    751 
    752     /**
    753      * Return detailed {@link NetworkStats} for the current UID. Requires no
    754      * special permission.
    755      */
    756     private static NetworkStats getDataLayerSnapshotForUid(Context context) {
    757         // TODO: take snapshot locally, since proc file is now visible
    758         final int uid = android.os.Process.myUid();
    759         try {
    760             return getStatsService().getDataLayerSnapshotForUid(uid);
    761         } catch (RemoteException e) {
    762             throw e.rethrowFromSystemServer();
    763         }
    764     }
    765 
    766     /**
    767      * Return set of any ifaces associated with mobile networks since boot.
    768      * Interfaces are never removed from this list, so counters should always be
    769      * monotonic.
    770      */
    771     private static String[] getMobileIfaces() {
    772         try {
    773             return getStatsService().getMobileIfaces();
    774         } catch (RemoteException e) {
    775             throw e.rethrowFromSystemServer();
    776         }
    777     }
    778 
    779     // NOTE: keep these in sync with android_net_TrafficStats.cpp
    780     private static final int TYPE_RX_BYTES = 0;
    781     private static final int TYPE_RX_PACKETS = 1;
    782     private static final int TYPE_TX_BYTES = 2;
    783     private static final int TYPE_TX_PACKETS = 3;
    784     private static final int TYPE_TCP_RX_PACKETS = 4;
    785     private static final int TYPE_TCP_TX_PACKETS = 5;
    786 
    787     private static native long nativeGetTotalStat(int type);
    788     private static native long nativeGetIfaceStat(String iface, int type);
    789     private static native long nativeGetUidStat(int uid, int type);
    790 }
    791