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