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.NonNull;
20 import android.annotation.SuppressLint;
21 import android.annotation.SystemApi;
22 import android.annotation.TestApi;
23 import android.app.DownloadManager;
24 import android.app.backup.BackupManager;
25 import android.app.usage.NetworkStatsManager;
26 import android.compat.annotation.UnsupportedAppUsage;
27 import android.content.Context;
28 import android.media.MediaPlayer;
29 import android.os.Build;
30 import android.os.RemoteException;
31 import android.os.ServiceManager;
32 import android.util.DataUnit;
33 
34 import com.android.server.NetworkManagementSocketTagger;
35 
36 import dalvik.system.SocketTagger;
37 
38 import java.io.FileDescriptor;
39 import java.io.IOException;
40 import java.net.DatagramSocket;
41 import java.net.Socket;
42 import java.net.SocketException;
43 
44 /**
45  * Class that provides network traffic statistics. These statistics include
46  * bytes transmitted and received and network packets transmitted and received,
47  * over all interfaces, over the mobile interface, and on a per-UID basis.
48  * <p>
49  * These statistics may not be available on all platforms. If the statistics are
50  * not supported by this device, {@link #UNSUPPORTED} will be returned.
51  * <p>
52  * Note that the statistics returned by this class reset and start from zero
53  * after every reboot. To access more robust historical network statistics data,
54  * use {@link NetworkStatsManager} instead.
55  */
56 public class TrafficStats {
57     /**
58      * The return value to indicate that the device does not support the statistic.
59      */
60     public final static int UNSUPPORTED = -1;
61 
62     /** @hide @deprecated use {@link DataUnit} instead to clarify SI-vs-IEC */
63     @Deprecated
64     public static final long KB_IN_BYTES = 1024;
65     /** @hide @deprecated use {@link DataUnit} instead to clarify SI-vs-IEC */
66     @Deprecated
67     public static final long MB_IN_BYTES = KB_IN_BYTES * 1024;
68     /** @hide @deprecated use {@link DataUnit} instead to clarify SI-vs-IEC */
69     @Deprecated
70     public static final long GB_IN_BYTES = MB_IN_BYTES * 1024;
71     /** @hide @deprecated use {@link DataUnit} instead to clarify SI-vs-IEC */
72     @Deprecated
73     public static final long TB_IN_BYTES = GB_IN_BYTES * 1024;
74     /** @hide @deprecated use {@link DataUnit} instead to clarify SI-vs-IEC */
75     @Deprecated
76     public static final long PB_IN_BYTES = TB_IN_BYTES * 1024;
77 
78     /**
79      * Special UID value used when collecting {@link NetworkStatsHistory} for
80      * removed applications.
81      *
82      * @hide
83      */
84     public static final int UID_REMOVED = -4;
85 
86     /**
87      * Special UID value used when collecting {@link NetworkStatsHistory} for
88      * tethering traffic.
89      *
90      * @hide
91      */
92     public static final int UID_TETHERING = NetworkStats.UID_TETHERING;
93 
94     /**
95      * Tag values in this range are reserved for the network stack. The network stack is
96      * running as UID {@link android.os.Process.NETWORK_STACK_UID} when in the mainline
97      * module separate process, and as the system UID otherwise.
98      */
99     /** @hide */
100     @SystemApi
101     public static final int TAG_NETWORK_STACK_RANGE_START = 0xFFFFFD00;
102     /** @hide */
103     @SystemApi
104     public static final int TAG_NETWORK_STACK_RANGE_END = 0xFFFFFEFF;
105 
106     /**
107      * Tags between 0xFFFFFF00 and 0xFFFFFFFF are reserved and used internally by system services
108      * like DownloadManager when performing traffic on behalf of an application.
109      */
110     // Please note there is no enforcement of these constants, so do not rely on them to
111     // determine that the caller is a system caller.
112     /** @hide */
113     @SystemApi
114     public static final int TAG_SYSTEM_IMPERSONATION_RANGE_START = 0xFFFFFF00;
115     /** @hide */
116     @SystemApi
117     public static final int TAG_SYSTEM_IMPERSONATION_RANGE_END = 0xFFFFFF0F;
118 
119     /**
120      * Tag values between these ranges are reserved for the network stack to do traffic
121      * on behalf of applications. It is a subrange of the range above.
122      */
123     /** @hide */
124     @SystemApi
125     public static final int TAG_NETWORK_STACK_IMPERSONATION_RANGE_START = 0xFFFFFF80;
126     /** @hide */
127     @SystemApi
128     public static final int TAG_NETWORK_STACK_IMPERSONATION_RANGE_END = 0xFFFFFF8F;
129 
130     /**
131      * Default tag value for {@link DownloadManager} traffic.
132      *
133      * @hide
134      */
135     public static final int TAG_SYSTEM_DOWNLOAD = 0xFFFFFF01;
136 
137     /**
138      * Default tag value for {@link MediaPlayer} traffic.
139      *
140      * @hide
141      */
142     public static final int TAG_SYSTEM_MEDIA = 0xFFFFFF02;
143 
144     /**
145      * Default tag value for {@link BackupManager} backup traffic; that is,
146      * traffic from the device to the storage backend.
147      *
148      * @hide
149      */
150     public static final int TAG_SYSTEM_BACKUP = 0xFFFFFF03;
151 
152     /**
153      * Default tag value for {@link BackupManager} restore traffic; that is,
154      * app data retrieved from the storage backend at install time.
155      *
156      * @hide
157      */
158     public static final int TAG_SYSTEM_RESTORE = 0xFFFFFF04;
159 
160     /**
161      * Default tag value for code (typically APKs) downloaded by an app store on
162      * behalf of the app, such as updates.
163      *
164      * @hide
165      */
166     public static final int TAG_SYSTEM_APP = 0xFFFFFF05;
167 
168     // TODO : remove this constant when Wifi code is updated
169     /** @hide */
170     public static final int TAG_SYSTEM_PROBE = 0xFFFFFF42;
171 
172     private static INetworkStatsService sStatsService;
173 
174     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562)
getStatsService()175     private synchronized static INetworkStatsService getStatsService() {
176         if (sStatsService == null) {
177             sStatsService = INetworkStatsService.Stub.asInterface(
178                     ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
179         }
180         return sStatsService;
181     }
182 
183     /**
184      * Snapshot of {@link NetworkStats} when the currently active profiling
185      * session started, or {@code null} if no session active.
186      *
187      * @see #startDataProfiling(Context)
188      * @see #stopDataProfiling(Context)
189      */
190     private static NetworkStats sActiveProfilingStart;
191 
192     private static Object sProfilingLock = new Object();
193 
194     private static final String LOOPBACK_IFACE = "lo";
195 
196     /**
197      * Set active tag to use when accounting {@link Socket} traffic originating
198      * from the current thread. Only one active tag per thread is supported.
199      * <p>
200      * Changes only take effect during subsequent calls to
201      * {@link #tagSocket(Socket)}.
202      * <p>
203      * Tags between {@code 0xFFFFFF00} and {@code 0xFFFFFFFF} are reserved and
204      * used internally by system services like {@link DownloadManager} when
205      * performing traffic on behalf of an application.
206      *
207      * @see #clearThreadStatsTag()
208      */
setThreadStatsTag(int tag)209     public static void setThreadStatsTag(int tag) {
210         NetworkManagementSocketTagger.setThreadSocketStatsTag(tag);
211     }
212 
213     /**
214      * Set active tag to use when accounting {@link Socket} traffic originating
215      * from the current thread. Only one active tag per thread is supported.
216      * <p>
217      * Changes only take effect during subsequent calls to
218      * {@link #tagSocket(Socket)}.
219      * <p>
220      * Tags between {@code 0xFFFFFF00} and {@code 0xFFFFFFFF} are reserved and
221      * used internally by system services like {@link DownloadManager} when
222      * performing traffic on behalf of an application.
223      *
224      * @return the current tag for the calling thread, which can be used to
225      *         restore any existing values after a nested operation is finished
226      */
getAndSetThreadStatsTag(int tag)227     public static int getAndSetThreadStatsTag(int tag) {
228         return NetworkManagementSocketTagger.setThreadSocketStatsTag(tag);
229     }
230 
231     /**
232      * Set active tag to use when accounting {@link Socket} traffic originating
233      * from the current thread. The tag used internally is well-defined to
234      * distinguish all backup-related traffic.
235      *
236      * @hide
237      */
238     @SystemApi
setThreadStatsTagBackup()239     public static void setThreadStatsTagBackup() {
240         setThreadStatsTag(TAG_SYSTEM_BACKUP);
241     }
242 
243     /**
244      * Set active tag to use when accounting {@link Socket} traffic originating
245      * from the current thread. The tag used internally is well-defined to
246      * distinguish all restore-related traffic.
247      *
248      * @hide
249      */
250     @SystemApi
setThreadStatsTagRestore()251     public static void setThreadStatsTagRestore() {
252         setThreadStatsTag(TAG_SYSTEM_RESTORE);
253     }
254 
255     /**
256      * Set active tag to use when accounting {@link Socket} traffic originating
257      * from the current thread. The tag used internally is well-defined to
258      * distinguish all code (typically APKs) downloaded by an app store on
259      * behalf of the app, such as updates.
260      *
261      * @hide
262      */
263     @SystemApi
setThreadStatsTagApp()264     public static void setThreadStatsTagApp() {
265         setThreadStatsTag(TAG_SYSTEM_APP);
266     }
267 
268     /**
269      * Get the active tag used when accounting {@link Socket} traffic originating
270      * from the current thread. Only one active tag per thread is supported.
271      * {@link #tagSocket(Socket)}.
272      *
273      * @see #setThreadStatsTag(int)
274      */
getThreadStatsTag()275     public static int getThreadStatsTag() {
276         return NetworkManagementSocketTagger.getThreadSocketStatsTag();
277     }
278 
279     /**
280      * Clear any active tag set to account {@link Socket} traffic originating
281      * from the current thread.
282      *
283      * @see #setThreadStatsTag(int)
284      */
clearThreadStatsTag()285     public static void clearThreadStatsTag() {
286         NetworkManagementSocketTagger.setThreadSocketStatsTag(-1);
287     }
288 
289     /**
290      * Set specific UID to use when accounting {@link Socket} traffic
291      * originating from the current thread. Designed for use when performing an
292      * operation on behalf of another application, or when another application
293      * is performing operations on your behalf.
294      * <p>
295      * Any app can <em>accept</em> blame for traffic performed on a socket
296      * originally created by another app by calling this method with the
297      * {@link android.system.Os#getuid()} value. However, only apps holding the
298      * {@code android.Manifest.permission#UPDATE_DEVICE_STATS} permission may
299      * <em>assign</em> blame to another UIDs.
300      * <p>
301      * Changes only take effect during subsequent calls to
302      * {@link #tagSocket(Socket)}.
303      */
304     @SuppressLint("Doclava125")
setThreadStatsUid(int uid)305     public static void setThreadStatsUid(int uid) {
306         NetworkManagementSocketTagger.setThreadSocketStatsUid(uid);
307     }
308 
309     /**
310      * Get the active UID used when accounting {@link Socket} traffic originating
311      * from the current thread. Only one active tag per thread is supported.
312      * {@link #tagSocket(Socket)}.
313      *
314      * @see #setThreadStatsUid(int)
315      */
getThreadStatsUid()316     public static int getThreadStatsUid() {
317         return NetworkManagementSocketTagger.getThreadSocketStatsUid();
318     }
319 
320     /**
321      * Set specific UID to use when accounting {@link Socket} traffic
322      * originating from the current thread as the calling UID. Designed for use
323      * when another application is performing operations on your behalf.
324      * <p>
325      * Changes only take effect during subsequent calls to
326      * {@link #tagSocket(Socket)}.
327      *
328      * @removed
329      * @deprecated use {@link #setThreadStatsUid(int)} instead.
330      */
331     @Deprecated
setThreadStatsUidSelf()332     public static void setThreadStatsUidSelf() {
333         setThreadStatsUid(android.os.Process.myUid());
334     }
335 
336     /**
337      * Clear any active UID set to account {@link Socket} traffic originating
338      * from the current thread.
339      *
340      * @see #setThreadStatsUid(int)
341      */
342     @SuppressLint("Doclava125")
clearThreadStatsUid()343     public static void clearThreadStatsUid() {
344         NetworkManagementSocketTagger.setThreadSocketStatsUid(-1);
345     }
346 
347     /**
348      * Tag the given {@link Socket} with any statistics parameters active for
349      * the current thread. Subsequent calls always replace any existing
350      * parameters. When finished, call {@link #untagSocket(Socket)} to remove
351      * statistics parameters.
352      *
353      * @see #setThreadStatsTag(int)
354      */
tagSocket(Socket socket)355     public static void tagSocket(Socket socket) throws SocketException {
356         SocketTagger.get().tag(socket);
357     }
358 
359     /**
360      * Remove any statistics parameters from the given {@link Socket}.
361      * <p>
362      * In Android 8.1 (API level 27) and lower, a socket is automatically
363      * untagged when it's sent to another process using binder IPC with a
364      * {@code ParcelFileDescriptor} container. In Android 9.0 (API level 28)
365      * and higher, the socket tag is kept when the socket is sent to another
366      * process using binder IPC. You can mimic the previous behavior by
367      * calling {@code untagSocket()} before sending the socket to another
368      * process.
369      */
untagSocket(Socket socket)370     public static void untagSocket(Socket socket) throws SocketException {
371         SocketTagger.get().untag(socket);
372     }
373 
374     /**
375      * Tag the given {@link DatagramSocket} with any statistics parameters
376      * active for the current thread. Subsequent calls always replace any
377      * existing parameters. When finished, call
378      * {@link #untagDatagramSocket(DatagramSocket)} to remove statistics
379      * parameters.
380      *
381      * @see #setThreadStatsTag(int)
382      */
tagDatagramSocket(DatagramSocket socket)383     public static void tagDatagramSocket(DatagramSocket socket) throws SocketException {
384         SocketTagger.get().tag(socket);
385     }
386 
387     /**
388      * Remove any statistics parameters from the given {@link DatagramSocket}.
389      */
untagDatagramSocket(DatagramSocket socket)390     public static void untagDatagramSocket(DatagramSocket socket) throws SocketException {
391         SocketTagger.get().untag(socket);
392     }
393 
394     /**
395      * Tag the given {@link FileDescriptor} socket with any statistics
396      * parameters active for the current thread. Subsequent calls always replace
397      * any existing parameters. When finished, call
398      * {@link #untagFileDescriptor(FileDescriptor)} to remove statistics
399      * parameters.
400      *
401      * @see #setThreadStatsTag(int)
402      */
tagFileDescriptor(FileDescriptor fd)403     public static void tagFileDescriptor(FileDescriptor fd) throws IOException {
404         SocketTagger.get().tag(fd);
405     }
406 
407     /**
408      * Remove any statistics parameters from the given {@link FileDescriptor}
409      * socket.
410      */
untagFileDescriptor(FileDescriptor fd)411     public static void untagFileDescriptor(FileDescriptor fd) throws IOException {
412         SocketTagger.get().untag(fd);
413     }
414 
415     /**
416      * Start profiling data usage for current UID. Only one profiling session
417      * can be active at a time.
418      *
419      * @hide
420      */
startDataProfiling(Context context)421     public static void startDataProfiling(Context context) {
422         synchronized (sProfilingLock) {
423             if (sActiveProfilingStart != null) {
424                 throw new IllegalStateException("already profiling data");
425             }
426 
427             // take snapshot in time; we calculate delta later
428             sActiveProfilingStart = getDataLayerSnapshotForUid(context);
429         }
430     }
431 
432     /**
433      * Stop profiling data usage for current UID.
434      *
435      * @return Detailed {@link NetworkStats} of data that occurred since last
436      *         {@link #startDataProfiling(Context)} call.
437      * @hide
438      */
stopDataProfiling(Context context)439     public static NetworkStats stopDataProfiling(Context context) {
440         synchronized (sProfilingLock) {
441             if (sActiveProfilingStart == null) {
442                 throw new IllegalStateException("not profiling data");
443             }
444 
445             // subtract starting values and return delta
446             final NetworkStats profilingStop = getDataLayerSnapshotForUid(context);
447             final NetworkStats profilingDelta = NetworkStats.subtract(
448                     profilingStop, sActiveProfilingStart, null, null);
449             sActiveProfilingStart = null;
450             return profilingDelta;
451         }
452     }
453 
454     /**
455      * Increment count of network operations performed under the accounting tag
456      * currently active on the calling thread. This can be used to derive
457      * bytes-per-operation.
458      *
459      * @param operationCount Number of operations to increment count by.
460      */
incrementOperationCount(int operationCount)461     public static void incrementOperationCount(int operationCount) {
462         final int tag = getThreadStatsTag();
463         incrementOperationCount(tag, operationCount);
464     }
465 
466     /**
467      * Increment count of network operations performed under the given
468      * accounting tag. This can be used to derive bytes-per-operation.
469      *
470      * @param tag Accounting tag used in {@link #setThreadStatsTag(int)}.
471      * @param operationCount Number of operations to increment count by.
472      */
incrementOperationCount(int tag, int operationCount)473     public static void incrementOperationCount(int tag, int operationCount) {
474         final int uid = android.os.Process.myUid();
475         try {
476             getStatsService().incrementOperationCount(uid, tag, operationCount);
477         } catch (RemoteException e) {
478             throw e.rethrowFromSystemServer();
479         }
480     }
481 
482     /** {@hide} */
closeQuietly(INetworkStatsSession session)483     public static void closeQuietly(INetworkStatsSession session) {
484         // TODO: move to NetworkStatsService once it exists
485         if (session != null) {
486             try {
487                 session.close();
488             } catch (RuntimeException rethrown) {
489                 throw rethrown;
490             } catch (Exception ignored) {
491             }
492         }
493     }
494 
addIfSupported(long stat)495     private static long addIfSupported(long stat) {
496         return (stat == UNSUPPORTED) ? 0 : stat;
497     }
498 
499     /**
500      * Return number of packets transmitted across mobile networks since device
501      * boot. Counts packets across all mobile network interfaces, and always
502      * increases monotonically since device boot. Statistics are measured at the
503      * network layer, so they include both TCP and UDP usage.
504      * <p>
505      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
506      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
507      */
getMobileTxPackets()508     public static long getMobileTxPackets() {
509         long total = 0;
510         for (String iface : getMobileIfaces()) {
511             total += addIfSupported(getTxPackets(iface));
512         }
513         return total;
514     }
515 
516     /**
517      * Return number of packets received across mobile networks since device
518      * boot. Counts packets across all mobile network interfaces, and always
519      * increases monotonically since device boot. Statistics are measured at the
520      * network layer, so they include both TCP and UDP usage.
521      * <p>
522      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
523      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
524      */
getMobileRxPackets()525     public static long getMobileRxPackets() {
526         long total = 0;
527         for (String iface : getMobileIfaces()) {
528             total += addIfSupported(getRxPackets(iface));
529         }
530         return total;
531     }
532 
533     /**
534      * Return number of bytes transmitted across mobile networks since device
535      * boot. Counts packets across all mobile network interfaces, and always
536      * increases monotonically since device boot. Statistics are measured at the
537      * network layer, so they include both TCP and UDP usage.
538      * <p>
539      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
540      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
541      */
getMobileTxBytes()542     public static long getMobileTxBytes() {
543         long total = 0;
544         for (String iface : getMobileIfaces()) {
545             total += addIfSupported(getTxBytes(iface));
546         }
547         return total;
548     }
549 
550     /**
551      * Return number of bytes received across mobile networks since device boot.
552      * Counts packets across all mobile network interfaces, and always increases
553      * monotonically since device boot. Statistics are measured at the network
554      * layer, so they include both TCP and UDP usage.
555      * <p>
556      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
557      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
558      */
getMobileRxBytes()559     public static long getMobileRxBytes() {
560         long total = 0;
561         for (String iface : getMobileIfaces()) {
562             total += addIfSupported(getRxBytes(iface));
563         }
564         return total;
565     }
566 
567     /** {@hide} */
568     @UnsupportedAppUsage
getMobileTcpRxPackets()569     public static long getMobileTcpRxPackets() {
570         long total = 0;
571         for (String iface : getMobileIfaces()) {
572             long stat = UNSUPPORTED;
573             try {
574                 stat = getStatsService().getIfaceStats(iface, TYPE_TCP_RX_PACKETS);
575             } catch (RemoteException e) {
576                 throw e.rethrowFromSystemServer();
577             }
578             total += addIfSupported(stat);
579         }
580         return total;
581     }
582 
583     /** {@hide} */
584     @UnsupportedAppUsage
getMobileTcpTxPackets()585     public static long getMobileTcpTxPackets() {
586         long total = 0;
587         for (String iface : getMobileIfaces()) {
588             long stat = UNSUPPORTED;
589             try {
590                 stat = getStatsService().getIfaceStats(iface, TYPE_TCP_TX_PACKETS);
591             } catch (RemoteException e) {
592                 throw e.rethrowFromSystemServer();
593             }
594             total += addIfSupported(stat);
595         }
596         return total;
597     }
598 
599     /**
600      * Return the number of packets transmitted on the specified interface since
601      * device boot. Statistics are measured at the network layer, so both TCP and
602      * UDP usage are included.
603      *
604      * @param iface The name of the interface.
605      * @return The number of transmitted packets.
606      */
getTxPackets(@onNull String iface)607     public static long getTxPackets(@NonNull String iface) {
608         try {
609             return getStatsService().getIfaceStats(iface, TYPE_TX_PACKETS);
610         } catch (RemoteException e) {
611             throw e.rethrowFromSystemServer();
612         }
613     }
614 
615     /**
616      * Return the number of packets received on the specified interface since
617      * device boot. Statistics are measured at the network layer, so both TCP
618      * and UDP usage are included.
619      *
620      * @param iface The name of the interface.
621      * @return The number of received packets.
622      */
getRxPackets(@onNull String iface)623     public static long getRxPackets(@NonNull String iface) {
624         try {
625             return getStatsService().getIfaceStats(iface, TYPE_RX_PACKETS);
626         } catch (RemoteException e) {
627             throw e.rethrowFromSystemServer();
628         }
629     }
630 
631     /** {@hide} */
632     @UnsupportedAppUsage
getTxBytes(String iface)633     public static long getTxBytes(String iface) {
634         try {
635             return getStatsService().getIfaceStats(iface, TYPE_TX_BYTES);
636         } catch (RemoteException e) {
637             throw e.rethrowFromSystemServer();
638         }
639     }
640 
641     /** {@hide} */
642     @UnsupportedAppUsage
getRxBytes(String iface)643     public static long getRxBytes(String iface) {
644         try {
645             return getStatsService().getIfaceStats(iface, TYPE_RX_BYTES);
646         } catch (RemoteException e) {
647             throw e.rethrowFromSystemServer();
648         }
649     }
650 
651     /** {@hide} */
652     @TestApi
getLoopbackTxPackets()653     public static long getLoopbackTxPackets() {
654         try {
655             return getStatsService().getIfaceStats(LOOPBACK_IFACE, TYPE_TX_PACKETS);
656         } catch (RemoteException e) {
657             throw e.rethrowFromSystemServer();
658         }
659     }
660 
661     /** {@hide} */
662     @TestApi
getLoopbackRxPackets()663     public static long getLoopbackRxPackets() {
664         try {
665             return getStatsService().getIfaceStats(LOOPBACK_IFACE, TYPE_RX_PACKETS);
666         } catch (RemoteException e) {
667             throw e.rethrowFromSystemServer();
668         }
669     }
670 
671     /** {@hide} */
672     @TestApi
getLoopbackTxBytes()673     public static long getLoopbackTxBytes() {
674         try {
675             return getStatsService().getIfaceStats(LOOPBACK_IFACE, TYPE_TX_BYTES);
676         } catch (RemoteException e) {
677             throw e.rethrowFromSystemServer();
678         }
679     }
680 
681     /** {@hide} */
682     @TestApi
getLoopbackRxBytes()683     public static long getLoopbackRxBytes() {
684         try {
685             return getStatsService().getIfaceStats(LOOPBACK_IFACE, TYPE_RX_BYTES);
686         } catch (RemoteException e) {
687             throw e.rethrowFromSystemServer();
688         }
689     }
690 
691     /**
692      * Return number of packets transmitted since device boot. Counts packets
693      * across all network interfaces, and always increases monotonically since
694      * device boot. Statistics are measured at the network layer, so they
695      * include both TCP and UDP usage.
696      * <p>
697      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
698      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
699      */
getTotalTxPackets()700     public static long getTotalTxPackets() {
701         try {
702             return getStatsService().getTotalStats(TYPE_TX_PACKETS);
703         } catch (RemoteException e) {
704             throw e.rethrowFromSystemServer();
705         }
706     }
707 
708     /**
709      * Return number of packets received since device boot. Counts packets
710      * across all network interfaces, and always increases monotonically since
711      * device boot. Statistics are measured at the network layer, so they
712      * include both TCP and UDP usage.
713      * <p>
714      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
715      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
716      */
getTotalRxPackets()717     public static long getTotalRxPackets() {
718         try {
719             return getStatsService().getTotalStats(TYPE_RX_PACKETS);
720         } catch (RemoteException e) {
721             throw e.rethrowFromSystemServer();
722         }
723     }
724 
725     /**
726      * Return number of bytes transmitted since device boot. Counts packets
727      * across all network interfaces, and always increases monotonically since
728      * device boot. Statistics are measured at the network layer, so they
729      * include both TCP and UDP usage.
730      * <p>
731      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
732      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
733      */
getTotalTxBytes()734     public static long getTotalTxBytes() {
735         try {
736             return getStatsService().getTotalStats(TYPE_TX_BYTES);
737         } catch (RemoteException e) {
738             throw e.rethrowFromSystemServer();
739         }
740     }
741 
742     /**
743      * Return number of bytes received since device boot. Counts packets across
744      * all network interfaces, and always increases monotonically since device
745      * boot. Statistics are measured at the network layer, so they include both
746      * TCP and UDP usage.
747      * <p>
748      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
749      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
750      */
getTotalRxBytes()751     public static long getTotalRxBytes() {
752         try {
753             return getStatsService().getTotalStats(TYPE_RX_BYTES);
754         } catch (RemoteException e) {
755             throw e.rethrowFromSystemServer();
756         }
757     }
758 
759     /**
760      * Return number of bytes transmitted by the given UID since device boot.
761      * Counts packets across all network interfaces, and always increases
762      * monotonically since device boot. Statistics are measured at the network
763      * layer, so they include both TCP and UDP usage.
764      * <p>
765      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
766      * return {@link #UNSUPPORTED} on devices where statistics aren't available.
767      * <p>
768      * Starting in {@link android.os.Build.VERSION_CODES#N} this will only
769      * report traffic statistics for the calling UID. It will return
770      * {@link #UNSUPPORTED} for all other UIDs for privacy reasons. To access
771      * historical network statistics belonging to other UIDs, use
772      * {@link NetworkStatsManager}.
773      *
774      * @see android.os.Process#myUid()
775      * @see android.content.pm.ApplicationInfo#uid
776      */
getUidTxBytes(int uid)777     public static long getUidTxBytes(int uid) {
778         // This isn't actually enforcing any security; it just returns the
779         // unsupported value. The real filtering is done at the kernel level.
780         final int callingUid = android.os.Process.myUid();
781         if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) {
782             try {
783                 return getStatsService().getUidStats(uid, TYPE_TX_BYTES);
784             } catch (RemoteException e) {
785                 throw e.rethrowFromSystemServer();
786             }
787         } else {
788             return UNSUPPORTED;
789         }
790     }
791 
792     /**
793      * Return number of bytes received by the given UID since device boot.
794      * Counts packets across all network interfaces, and always increases
795      * monotonically since device boot. Statistics are measured at the network
796      * layer, so they include both TCP and UDP usage.
797      * <p>
798      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return
799      * {@link #UNSUPPORTED} on devices where statistics aren't available.
800      * <p>
801      * Starting in {@link android.os.Build.VERSION_CODES#N} this will only
802      * report traffic statistics for the calling UID. It will return
803      * {@link #UNSUPPORTED} for all other UIDs for privacy reasons. To access
804      * historical network statistics belonging to other UIDs, use
805      * {@link NetworkStatsManager}.
806      *
807      * @see android.os.Process#myUid()
808      * @see android.content.pm.ApplicationInfo#uid
809      */
getUidRxBytes(int uid)810     public static long getUidRxBytes(int uid) {
811         // This isn't actually enforcing any security; it just returns the
812         // unsupported value. The real filtering is done at the kernel level.
813         final int callingUid = android.os.Process.myUid();
814         if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) {
815             try {
816                 return getStatsService().getUidStats(uid, TYPE_RX_BYTES);
817             } catch (RemoteException e) {
818                 throw e.rethrowFromSystemServer();
819             }
820         } else {
821             return UNSUPPORTED;
822         }
823     }
824 
825     /**
826      * Return number of packets transmitted by the given UID since device boot.
827      * Counts packets across all network interfaces, and always increases
828      * monotonically since device boot. Statistics are measured at the network
829      * layer, so they include both TCP and UDP usage.
830      * <p>
831      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return
832      * {@link #UNSUPPORTED} on devices where statistics aren't available.
833      * <p>
834      * Starting in {@link android.os.Build.VERSION_CODES#N} this will only
835      * report traffic statistics for the calling UID. It will return
836      * {@link #UNSUPPORTED} for all other UIDs for privacy reasons. To access
837      * historical network statistics belonging to other UIDs, use
838      * {@link NetworkStatsManager}.
839      *
840      * @see android.os.Process#myUid()
841      * @see android.content.pm.ApplicationInfo#uid
842      */
getUidTxPackets(int uid)843     public static long getUidTxPackets(int uid) {
844         // This isn't actually enforcing any security; it just returns the
845         // unsupported value. The real filtering is done at the kernel level.
846         final int callingUid = android.os.Process.myUid();
847         if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) {
848             try {
849                 return getStatsService().getUidStats(uid, TYPE_TX_PACKETS);
850             } catch (RemoteException e) {
851                 throw e.rethrowFromSystemServer();
852             }
853         } else {
854             return UNSUPPORTED;
855         }
856     }
857 
858     /**
859      * Return number of packets received by the given UID since device boot.
860      * Counts packets across all network interfaces, and always increases
861      * monotonically since device boot. Statistics are measured at the network
862      * layer, so they include both TCP and UDP usage.
863      * <p>
864      * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return
865      * {@link #UNSUPPORTED} on devices where statistics aren't available.
866      * <p>
867      * Starting in {@link android.os.Build.VERSION_CODES#N} this will only
868      * report traffic statistics for the calling UID. It will return
869      * {@link #UNSUPPORTED} for all other UIDs for privacy reasons. To access
870      * historical network statistics belonging to other UIDs, use
871      * {@link NetworkStatsManager}.
872      *
873      * @see android.os.Process#myUid()
874      * @see android.content.pm.ApplicationInfo#uid
875      */
getUidRxPackets(int uid)876     public static long getUidRxPackets(int uid) {
877         // This isn't actually enforcing any security; it just returns the
878         // unsupported value. The real filtering is done at the kernel level.
879         final int callingUid = android.os.Process.myUid();
880         if (callingUid == android.os.Process.SYSTEM_UID || callingUid == uid) {
881             try {
882                 return getStatsService().getUidStats(uid, TYPE_RX_PACKETS);
883             } catch (RemoteException e) {
884                 throw e.rethrowFromSystemServer();
885             }
886         } else {
887             return UNSUPPORTED;
888         }
889     }
890 
891     /**
892      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
893      *             transport layer statistics are no longer available, and will
894      *             always return {@link #UNSUPPORTED}.
895      * @see #getUidTxBytes(int)
896      */
897     @Deprecated
getUidTcpTxBytes(int uid)898     public static long getUidTcpTxBytes(int uid) {
899         return UNSUPPORTED;
900     }
901 
902     /**
903      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
904      *             transport layer statistics are no longer available, and will
905      *             always return {@link #UNSUPPORTED}.
906      * @see #getUidRxBytes(int)
907      */
908     @Deprecated
getUidTcpRxBytes(int uid)909     public static long getUidTcpRxBytes(int uid) {
910         return UNSUPPORTED;
911     }
912 
913     /**
914      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
915      *             transport layer statistics are no longer available, and will
916      *             always return {@link #UNSUPPORTED}.
917      * @see #getUidTxBytes(int)
918      */
919     @Deprecated
getUidUdpTxBytes(int uid)920     public static long getUidUdpTxBytes(int uid) {
921         return UNSUPPORTED;
922     }
923 
924     /**
925      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
926      *             transport layer statistics are no longer available, and will
927      *             always return {@link #UNSUPPORTED}.
928      * @see #getUidRxBytes(int)
929      */
930     @Deprecated
getUidUdpRxBytes(int uid)931     public static long getUidUdpRxBytes(int uid) {
932         return UNSUPPORTED;
933     }
934 
935     /**
936      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
937      *             transport layer statistics are no longer available, and will
938      *             always return {@link #UNSUPPORTED}.
939      * @see #getUidTxPackets(int)
940      */
941     @Deprecated
getUidTcpTxSegments(int uid)942     public static long getUidTcpTxSegments(int uid) {
943         return UNSUPPORTED;
944     }
945 
946     /**
947      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
948      *             transport layer statistics are no longer available, and will
949      *             always return {@link #UNSUPPORTED}.
950      * @see #getUidRxPackets(int)
951      */
952     @Deprecated
getUidTcpRxSegments(int uid)953     public static long getUidTcpRxSegments(int uid) {
954         return UNSUPPORTED;
955     }
956 
957     /**
958      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
959      *             transport layer statistics are no longer available, and will
960      *             always return {@link #UNSUPPORTED}.
961      * @see #getUidTxPackets(int)
962      */
963     @Deprecated
getUidUdpTxPackets(int uid)964     public static long getUidUdpTxPackets(int uid) {
965         return UNSUPPORTED;
966     }
967 
968     /**
969      * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
970      *             transport layer statistics are no longer available, and will
971      *             always return {@link #UNSUPPORTED}.
972      * @see #getUidRxPackets(int)
973      */
974     @Deprecated
getUidUdpRxPackets(int uid)975     public static long getUidUdpRxPackets(int uid) {
976         return UNSUPPORTED;
977     }
978 
979     /**
980      * Return detailed {@link NetworkStats} for the current UID. Requires no
981      * special permission.
982      */
getDataLayerSnapshotForUid(Context context)983     private static NetworkStats getDataLayerSnapshotForUid(Context context) {
984         // TODO: take snapshot locally, since proc file is now visible
985         final int uid = android.os.Process.myUid();
986         try {
987             return getStatsService().getDataLayerSnapshotForUid(uid);
988         } catch (RemoteException e) {
989             throw e.rethrowFromSystemServer();
990         }
991     }
992 
993     /**
994      * Return set of any ifaces associated with mobile networks since boot.
995      * Interfaces are never removed from this list, so counters should always be
996      * monotonic.
997      */
998     @UnsupportedAppUsage(maxTargetSdk = Build.VERSION_CODES.P, trackingBug = 130143562)
getMobileIfaces()999     private static String[] getMobileIfaces() {
1000         try {
1001             return getStatsService().getMobileIfaces();
1002         } catch (RemoteException e) {
1003             throw e.rethrowFromSystemServer();
1004         }
1005     }
1006 
1007     // NOTE: keep these in sync with android_net_TrafficStats.cpp
1008     private static final int TYPE_RX_BYTES = 0;
1009     private static final int TYPE_RX_PACKETS = 1;
1010     private static final int TYPE_TX_BYTES = 2;
1011     private static final int TYPE_TX_PACKETS = 3;
1012     private static final int TYPE_TCP_RX_PACKETS = 4;
1013     private static final int TYPE_TCP_TX_PACKETS = 5;
1014 }
1015