blob: 8a688d55f70c948750ed7949a6f4686757201d9d [file] [log] [blame]
Ken Shirrifff7d0b012009-12-07 15:56:05 -08001/*
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
17package android.net;
18
Jeff Sharkeyeedcb952011-05-17 14:55:15 -070019import android.content.Context;
20import android.os.IBinder;
21import android.os.INetworkManagementService;
22import android.os.RemoteException;
23import android.os.ServiceManager;
24
Jeff Sharkey43be1742011-04-21 18:45:43 -070025import dalvik.system.BlockGuard;
Ken Shirrifff7d0b012009-12-07 15:56:05 -080026
Jeff Sharkey43be1742011-04-21 18:45:43 -070027import java.net.Socket;
28import java.net.SocketException;
Ken Shirrifff7d0b012009-12-07 15:56:05 -080029
30/**
Dan Egnor2b4abcd2010-04-07 17:30:50 -070031 * Class that provides network traffic statistics. These statistics include
32 * bytes transmitted and received and network packets transmitted and received,
33 * over all interfaces, over the mobile interface, and on a per-UID basis.
Ken Shirrifff7d0b012009-12-07 15:56:05 -080034 * <p>
Dan Egnor2b4abcd2010-04-07 17:30:50 -070035 * These statistics may not be available on all platforms. If the statistics
36 * are not supported by this device, {@link #UNSUPPORTED} will be returned.
Ken Shirrifff7d0b012009-12-07 15:56:05 -080037 */
38public class TrafficStats {
39 /**
40 * The return value to indicate that the device does not support the statistic.
41 */
42 public final static int UNSUPPORTED = -1;
43
Jeff Sharkeyd2a45872011-05-28 20:56:34 -070044 // TODO: find better home for these template constants
45
46 /**
47 * Template to combine all {@link ConnectivityManager#TYPE_MOBILE} style
48 * networks together. Only uses statistics for currently active IMSI.
49 *
50 * @hide
51 */
52 public static final int TEMPLATE_MOBILE_ALL = 1;
53
54 /**
55 * Template to combine all {@link ConnectivityManager#TYPE_MOBILE} style
56 * networks together that roughly meet a "3G" definition, or lower. Only
57 * uses statistics for currently active IMSI.
58 *
59 * @hide
60 */
61 public static final int TEMPLATE_MOBILE_3G_LOWER = 2;
62
63 /**
64 * Template to combine all {@link ConnectivityManager#TYPE_MOBILE} style
65 * networks together that meet a "4G" definition. Only uses statistics for
66 * currently active IMSI.
67 *
68 * @hide
69 */
70 public static final int TEMPLATE_MOBILE_4G = 3;
71
72 /**
73 * Template to combine all {@link ConnectivityManager#TYPE_WIFI} style
74 * networks together.
75 *
76 * @hide
77 */
78 public static final int TEMPLATE_WIFI = 4;
79
Ken Shirrifff7d0b012009-12-07 15:56:05 -080080 /**
Jeff Sharkeyeedcb952011-05-17 14:55:15 -070081 * Snapshot of {@link NetworkStats} when the currently active profiling
82 * session started, or {@code null} if no session active.
83 *
84 * @see #startDataProfiling(Context)
85 * @see #stopDataProfiling(Context)
86 */
87 private static NetworkStats sActiveProfilingStart;
88
89 private static Object sProfilingLock = new Object();
90
91 /**
Jeff Sharkey43be1742011-04-21 18:45:43 -070092 * Set active tag to use when accounting {@link Socket} traffic originating
93 * from the current thread. Only one active tag per thread is supported.
94 * <p>
95 * Changes only take effect during subsequent calls to
96 * {@link #tagSocket(Socket)}.
97 */
98 public static void setThreadStatsTag(String tag) {
99 BlockGuard.setThreadSocketStatsTag(tag);
100 }
101
102 public static void clearThreadStatsTag() {
103 BlockGuard.setThreadSocketStatsTag(null);
104 }
105
106 /**
107 * Set specific UID to use when accounting {@link Socket} traffic
108 * originating from the current thread. Designed for use when performing an
109 * operation on behalf of another application.
110 * <p>
111 * Changes only take effect during subsequent calls to
112 * {@link #tagSocket(Socket)}.
113 * <p>
114 * To take effect, caller must hold
115 * {@link android.Manifest.permission#UPDATE_DEVICE_STATS} permission.
116 *
117 * {@hide}
118 */
119 public static void setThreadStatsUid(int uid) {
120 BlockGuard.setThreadSocketStatsUid(uid);
121 }
122
123 /** {@hide} */
124 public static void clearThreadStatsUid() {
125 BlockGuard.setThreadSocketStatsUid(-1);
126 }
127
128 /**
129 * Tag the given {@link Socket} with any statistics parameters active for
130 * the current thread. Subsequent calls always replace any existing
131 * parameters. When finished, call {@link #untagSocket(Socket)} to remove
132 * statistics parameters.
133 *
134 * @see #setThreadStatsTag(String)
135 * @see #setThreadStatsUid(int)
136 */
137 public static void tagSocket(Socket socket) throws SocketException {
138 BlockGuard.tagSocketFd(socket.getFileDescriptor$());
139 }
140
141 /**
142 * Remove any statistics parameters from the given {@link Socket}.
143 */
144 public static void untagSocket(Socket socket) throws SocketException {
145 BlockGuard.untagSocketFd(socket.getFileDescriptor$());
146 }
147
148 /**
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700149 * Start profiling data usage for current UID. Only one profiling session
150 * can be active at a time.
151 *
152 * @hide
153 */
154 public static void startDataProfiling(Context context) {
155 synchronized (sProfilingLock) {
156 if (sActiveProfilingStart != null) {
157 throw new IllegalStateException("already profiling data");
158 }
159
160 // take snapshot in time; we calculate delta later
161 sActiveProfilingStart = getNetworkStatsForUid(context);
162 }
163 }
164
165 /**
166 * Stop profiling data usage for current UID.
167 *
168 * @return Detailed {@link NetworkStats} of data that occurred since last
169 * {@link #startDataProfiling(Context)} call.
170 * @hide
171 */
172 public static NetworkStats stopDataProfiling(Context context) {
173 synchronized (sProfilingLock) {
174 if (sActiveProfilingStart == null) {
175 throw new IllegalStateException("not profiling data");
176 }
177
178 // subtract starting values and return delta
179 final NetworkStats profilingStop = getNetworkStatsForUid(context);
Jeff Sharkey3f391352011-06-05 17:42:53 -0700180 final NetworkStats profilingDelta = profilingStop.subtractClamped(
181 sActiveProfilingStart);
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700182 sActiveProfilingStart = null;
183 return profilingDelta;
184 }
185 }
186
187 /**
Ken Shirrifff7d0b012009-12-07 15:56:05 -0800188 * Get the total number of packets transmitted through the mobile interface.
189 *
190 * @return number of packets. If the statistics are not supported by this device,
191 * {@link #UNSUPPORTED} will be returned.
192 */
Dan Egnor2b4abcd2010-04-07 17:30:50 -0700193 public static native long getMobileTxPackets();
Ken Shirrifff7d0b012009-12-07 15:56:05 -0800194
195 /**
196 * Get the total number of packets received through the mobile interface.
197 *
198 * @return number of packets. If the statistics are not supported by this device,
199 * {@link #UNSUPPORTED} will be returned.
200 */
Dan Egnor2b4abcd2010-04-07 17:30:50 -0700201 public static native long getMobileRxPackets();
Ken Shirrifff7d0b012009-12-07 15:56:05 -0800202
203 /**
204 * Get the total number of bytes transmitted through the mobile interface.
205 *
206 * @return number of bytes. If the statistics are not supported by this device,
207 * {@link #UNSUPPORTED} will be returned.
208 */
Dan Egnor2b4abcd2010-04-07 17:30:50 -0700209 public static native long getMobileTxBytes();
Ken Shirrifff7d0b012009-12-07 15:56:05 -0800210
211 /**
212 * Get the total number of bytes received through the mobile interface.
213 *
214 * @return number of bytes. If the statistics are not supported by this device,
215 * {@link #UNSUPPORTED} will be returned.
216 */
Dan Egnor2b4abcd2010-04-07 17:30:50 -0700217 public static native long getMobileRxBytes();
Ken Shirrifff7d0b012009-12-07 15:56:05 -0800218
219 /**
Irfan Sheriff227bec42011-02-15 19:30:27 -0800220 * Get the total number of packets transmitted through the specified interface.
221 *
222 * @return number of packets. If the statistics are not supported by this interface,
223 * {@link #UNSUPPORTED} will be returned.
224 * @hide
225 */
226 public static native long getTxPackets(String iface);
227
228 /**
229 * Get the total number of packets received through the specified interface.
230 *
231 * @return number of packets. If the statistics are not supported by this interface,
232 * {@link #UNSUPPORTED} will be returned.
233 * @hide
234 */
235 public static native long getRxPackets(String iface);
236
237 /**
238 * Get the total number of bytes transmitted through the specified interface.
239 *
240 * @return number of bytes. If the statistics are not supported by this interface,
241 * {@link #UNSUPPORTED} will be returned.
242 * @hide
243 */
244 public static native long getTxBytes(String iface);
245
246 /**
247 * Get the total number of bytes received through the specified interface.
248 *
249 * @return number of bytes. If the statistics are not supported by this interface,
250 * {@link #UNSUPPORTED} will be returned.
251 * @hide
252 */
253 public static native long getRxBytes(String iface);
254
255
256 /**
Ken Shirrifff7d0b012009-12-07 15:56:05 -0800257 * Get the total number of packets sent through all network interfaces.
258 *
259 * @return the number of packets. If the statistics are not supported by this device,
260 * {@link #UNSUPPORTED} will be returned.
261 */
Dan Egnor2b4abcd2010-04-07 17:30:50 -0700262 public static native long getTotalTxPackets();
Ken Shirrifff7d0b012009-12-07 15:56:05 -0800263
264 /**
265 * Get the total number of packets received through all network interfaces.
266 *
267 * @return number of packets. If the statistics are not supported by this device,
268 * {@link #UNSUPPORTED} will be returned.
269 */
Dan Egnor2b4abcd2010-04-07 17:30:50 -0700270 public static native long getTotalRxPackets();
Ken Shirrifff7d0b012009-12-07 15:56:05 -0800271
272 /**
273 * Get the total number of bytes sent through all network interfaces.
274 *
275 * @return number of bytes. If the statistics are not supported by this device,
276 * {@link #UNSUPPORTED} will be returned.
277 */
Dan Egnor2b4abcd2010-04-07 17:30:50 -0700278 public static native long getTotalTxBytes();
Ken Shirrifff7d0b012009-12-07 15:56:05 -0800279
280 /**
281 * Get the total number of bytes received through all network interfaces.
282 *
283 * @return number of bytes. If the statistics are not supported by this device,
284 * {@link #UNSUPPORTED} will be returned.
285 */
Dan Egnor2b4abcd2010-04-07 17:30:50 -0700286 public static native long getTotalRxBytes();
Ken Shirrifff7d0b012009-12-07 15:56:05 -0800287
288 /**
289 * Get the number of bytes sent through the network for this UID.
290 * The statistics are across all interfaces.
291 *
292 * {@see android.os.Process#myUid()}.
293 *
294 * @param uid The UID of the process to examine.
295 * @return number of bytes. If the statistics are not supported by this device,
296 * {@link #UNSUPPORTED} will be returned.
297 */
Dan Egnor2b4abcd2010-04-07 17:30:50 -0700298 public static native long getUidTxBytes(int uid);
Ken Shirrifff7d0b012009-12-07 15:56:05 -0800299
300 /**
301 * Get the number of bytes received through the network for this UID.
302 * The statistics are across all interfaces.
303 *
304 * {@see android.os.Process#myUid()}.
305 *
306 * @param uid The UID of the process to examine.
307 * @return number of bytes
308 */
Dan Egnor2b4abcd2010-04-07 17:30:50 -0700309 public static native long getUidRxBytes(int uid);
Ashish Sharmac39c1d42011-01-27 15:52:38 -0800310
311 /**
312 * Get the number of packets (TCP segments + UDP) sent through
313 * the network for this UID.
314 * The statistics are across all interfaces.
315 *
316 * {@see android.os.Process#myUid()}.
317 *
318 * @param uid The UID of the process to examine.
319 * @return number of packets.
320 * If the statistics are not supported by this device,
321 * {@link #UNSUPPORTED} will be returned.
322 */
323 public static native long getUidTxPackets(int uid);
324
325 /**
326 * Get the number of packets (TCP segments + UDP) received through
327 * the network for this UID.
328 * The statistics are across all interfaces.
329 *
330 * {@see android.os.Process#myUid()}.
331 *
332 * @param uid The UID of the process to examine.
333 * @return number of packets
334 */
335 public static native long getUidRxPackets(int uid);
336
337 /**
338 * Get the number of TCP payload bytes sent for this UID.
339 * This total does not include protocol and control overheads at
340 * the transport and the lower layers of the networking stack.
341 * The statistics are across all interfaces.
342 *
343 * {@see android.os.Process#myUid()}.
344 *
345 * @param uid The UID of the process to examine.
346 * @return number of bytes. If the statistics are not supported by this device,
347 * {@link #UNSUPPORTED} will be returned.
348 */
349 public static native long getUidTcpTxBytes(int uid);
350
351 /**
352 * Get the number of TCP payload bytes received for this UID.
353 * This total does not include protocol and control overheads at
354 * the transport and the lower layers of the networking stack.
355 * The statistics are across all interfaces.
356 *
357 * {@see android.os.Process#myUid()}.
358 *
359 * @param uid The UID of the process to examine.
360 * @return number of bytes. If the statistics are not supported by this device,
361 * {@link #UNSUPPORTED} will be returned.
362 */
363 public static native long getUidTcpRxBytes(int uid);
364
365 /**
366 * Get the number of UDP payload bytes sent for this UID.
367 * This total does not include protocol and control overheads at
368 * the transport and the lower layers of the networking stack.
369 * The statistics are across all interfaces.
370 *
371 * {@see android.os.Process#myUid()}.
372 *
373 * @param uid The UID of the process to examine.
374 * @return number of bytes. If the statistics are not supported by this device,
375 * {@link #UNSUPPORTED} will be returned.
376 */
377 public static native long getUidUdpTxBytes(int uid);
378
379 /**
380 * Get the number of UDP payload bytes received for this UID.
381 * This total does not include protocol and control overheads at
382 * the transport and the lower layers of the networking stack.
383 * The statistics are across all interfaces.
384 *
385 * {@see android.os.Process#myUid()}.
386 *
387 * @param uid The UID of the process to examine.
388 * @return number of bytes. If the statistics are not supported by this device,
389 * {@link #UNSUPPORTED} will be returned.
390 */
391 public static native long getUidUdpRxBytes(int uid);
392
393 /**
394 * Get the number of TCP segments sent for this UID.
395 * Does not include TCP control packets (SYN/ACKs/FIN/..).
396 * The statistics are across all interfaces.
397 *
398 * {@see android.os.Process#myUid()}.
399 *
400 * @param uid The UID of the process to examine.
401 * @return number of TCP segments. If the statistics are not supported by this device,
402 * {@link #UNSUPPORTED} will be returned.
403 */
404 public static native long getUidTcpTxSegments(int uid);
405
406 /**
Ashish Sharmabeda53d2011-01-31 14:29:42 -0800407 * Get the number of TCP segments received for this UID.
Ashish Sharmac39c1d42011-01-27 15:52:38 -0800408 * Does not include TCP control packets (SYN/ACKs/FIN/..).
409 * The statistics are across all interfaces.
410 *
411 * {@see android.os.Process#myUid()}.
412 *
413 * @param uid The UID of the process to examine.
414 * @return number of TCP segments. If the statistics are not supported by this device,
415 * {@link #UNSUPPORTED} will be returned.
416 */
417 public static native long getUidTcpRxSegments(int uid);
418
419
420 /**
421 * Get the number of UDP packets sent for this UID.
422 * Includes DNS requests.
423 * The statistics are across all interfaces.
424 *
425 * {@see android.os.Process#myUid()}.
426 *
427 * @param uid The UID of the process to examine.
428 * @return number of packets. If the statistics are not supported by this device,
429 * {@link #UNSUPPORTED} will be returned.
430 */
431 public static native long getUidUdpTxPackets(int uid);
432
433 /**
434 * Get the number of UDP packets received for this UID.
435 * Includes DNS responses.
436 * The statistics are across all interfaces.
437 *
438 * {@see android.os.Process#myUid()}.
439 *
440 * @param uid The UID of the process to examine.
441 * @return number of packets. If the statistics are not supported by this device,
442 * {@link #UNSUPPORTED} will be returned.
443 */
444 public static native long getUidUdpRxPackets(int uid);
Jeff Sharkeyeedcb952011-05-17 14:55:15 -0700445
446 /**
447 * Return detailed {@link NetworkStats} for the current UID. Requires no
448 * special permission.
449 */
450 private static NetworkStats getNetworkStatsForUid(Context context) {
451 final IBinder binder = ServiceManager.getService(Context.NETWORKMANAGEMENT_SERVICE);
452 final INetworkManagementService service = INetworkManagementService.Stub.asInterface(
453 binder);
454
455 final int uid = android.os.Process.myUid();
456 try {
457 return service.getNetworkStatsUidDetail(uid);
458 } catch (RemoteException e) {
459 throw new RuntimeException(e);
460 }
461 }
Ken Shirrifff7d0b012009-12-07 15:56:05 -0800462}