1f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff/*
2f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * Copyright (C) 2007 The Android Open Source Project
3f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff *
4f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * Licensed under the Apache License, Version 2.0 (the "License");
5f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * you may not use this file except in compliance with the License.
6f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * You may obtain a copy of the License at
7f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff *
8f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff *      http://www.apache.org/licenses/LICENSE-2.0
9f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff *
10f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * Unless required by applicable law or agreed to in writing, software
11f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * distributed under the License is distributed on an "AS IS" BASIS,
12f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * See the License for the specific language governing permissions and
14f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * limitations under the License.
15f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff */
16f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff
17f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriffpackage android.net;
18f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff
19a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tateimport android.annotation.SystemApi;
204414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport android.app.DownloadManager;
214414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport android.app.backup.BackupManager;
22eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkeyimport android.content.Context;
234414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkeyimport android.media.MediaPlayer;
24eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkeyimport android.os.RemoteException;
25eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkeyimport android.os.ServiceManager;
26eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey
278568db534118fc14cc28100306d51626464ff319Jesse Wilsonimport com.android.server.NetworkManagementSocketTagger;
28f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff
298568db534118fc14cc28100306d51626464ff319Jesse Wilsonimport dalvik.system.SocketTagger;
30a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
3143be174888684ef3404a43d8434015193c656cceJeff Sharkeyimport java.net.Socket;
3243be174888684ef3404a43d8434015193c656cceJeff Sharkeyimport java.net.SocketException;
33f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff
34f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff/**
352b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * Class that provides network traffic statistics.  These statistics include
362b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * bytes transmitted and received and network packets transmitted and received,
372b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * over all interfaces, over the mobile interface, and on a per-UID basis.
38f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff * <p>
392b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * These statistics may not be available on all platforms.  If the statistics
402b4abcd0c7c4361af8ab6d5d7b073fb75ac6d219Dan Egnor * are not supported by this device, {@link #UNSUPPORTED} will be returned.
41f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff */
42f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriffpublic class TrafficStats {
43f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff    /**
44f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff     * The return value to indicate that the device does not support the statistic.
45f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff     */
46f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff    public final static int UNSUPPORTED = -1;
47f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff
48241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkey    /** @hide */
49241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkey    public static final long KB_IN_BYTES = 1024;
50241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkey    /** @hide */
51241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkey    public static final long MB_IN_BYTES = KB_IN_BYTES * 1024;
52241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkey    /** @hide */
53241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkey    public static final long GB_IN_BYTES = MB_IN_BYTES * 1024;
544887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey    /** @hide */
554887789e44cdb16b042a35e8ec03983213e88ac6Jeff Sharkey    public static final long TB_IN_BYTES = GB_IN_BYTES * 1024;
56b521feaed410b6862baca9b42d5fd7c398e07b2fJeff Sharkey    /** @hide */
57b521feaed410b6862baca9b42d5fd7c398e07b2fJeff Sharkey    public static final long PB_IN_BYTES = TB_IN_BYTES * 1024;
58241dde2306202e7655fdf41d5381f2874e47e108Jeff Sharkey
59d2a458750e5a3d490af09cecb5c28370baf0a913Jeff Sharkey    /**
60b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey     * Special UID value used when collecting {@link NetworkStatsHistory} for
61b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey     * removed applications.
62b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey     *
63b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey     * @hide
64b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey     */
65b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    public static final int UID_REMOVED = -4;
66b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey
67b09540f33a6cabe50edec0ef32d0b1d0b0d96fffJeff Sharkey    /**
68cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey     * Special UID value used when collecting {@link NetworkStatsHistory} for
69cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey     * tethering traffic.
70cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey     *
71cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey     * @hide
72cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey     */
73cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey    public static final int UID_TETHERING = -5;
74cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey
75cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey    /**
764414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey     * Default tag value for {@link DownloadManager} traffic.
774414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey     *
784414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey     * @hide
794414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey     */
80cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey    public static final int TAG_SYSTEM_DOWNLOAD = 0xFFFFFF01;
814414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey
824414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey    /**
834414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey     * Default tag value for {@link MediaPlayer} traffic.
844414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey     *
854414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey     * @hide
864414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey     */
87cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey    public static final int TAG_SYSTEM_MEDIA = 0xFFFFFF02;
884414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey
894414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey    /**
904414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey     * Default tag value for {@link BackupManager} traffic.
914414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey     *
924414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey     * @hide
934414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey     */
94cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey    public static final int TAG_SYSTEM_BACKUP = 0xFFFFFF03;
954414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey
96234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    private static INetworkStatsService sStatsService;
97234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey
98234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    private synchronized static INetworkStatsService getStatsService() {
99234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        if (sStatsService == null) {
100234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey            sStatsService = INetworkStatsService.Stub.asInterface(
101234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey                    ServiceManager.getService(Context.NETWORK_STATS_SERVICE));
102234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        }
103234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        return sStatsService;
104234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    }
105234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey
1064414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey    /**
107eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     * Snapshot of {@link NetworkStats} when the currently active profiling
108eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     * session started, or {@code null} if no session active.
109eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     *
110eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     * @see #startDataProfiling(Context)
111eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     * @see #stopDataProfiling(Context)
112eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     */
113eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey    private static NetworkStats sActiveProfilingStart;
114eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey
115eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey    private static Object sProfilingLock = new Object();
116eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey
117eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey    /**
11843be174888684ef3404a43d8434015193c656cceJeff Sharkey     * Set active tag to use when accounting {@link Socket} traffic originating
11943be174888684ef3404a43d8434015193c656cceJeff Sharkey     * from the current thread. Only one active tag per thread is supported.
12043be174888684ef3404a43d8434015193c656cceJeff Sharkey     * <p>
12143be174888684ef3404a43d8434015193c656cceJeff Sharkey     * Changes only take effect during subsequent calls to
12243be174888684ef3404a43d8434015193c656cceJeff Sharkey     * {@link #tagSocket(Socket)}.
123cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey     * <p>
124cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey     * Tags between {@code 0xFFFFFF00} and {@code 0xFFFFFFFF} are reserved and
125cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey     * used internally by system services like {@link DownloadManager} when
126cdd02c5d76d3dd4e21b5bb922d7fcfb86efec85fJeff Sharkey     * performing traffic on behalf of an application.
127dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     *
128dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * @see #clearThreadStatsTag()
12943be174888684ef3404a43d8434015193c656cceJeff Sharkey     */
1304414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey    public static void setThreadStatsTag(int tag) {
1318568db534118fc14cc28100306d51626464ff319Jesse Wilson        NetworkManagementSocketTagger.setThreadSocketStatsTag(tag);
13243be174888684ef3404a43d8434015193c656cceJeff Sharkey    }
13343be174888684ef3404a43d8434015193c656cceJeff Sharkey
1344414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey    /**
135a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate     * System API for backup-related support components to tag network traffic
136a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate     * appropriately.
137a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate     * @hide
138a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate     */
139a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate    @SystemApi
140a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate    public static void setThreadStatsTagBackup() {
141a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate        setThreadStatsTag(TAG_SYSTEM_BACKUP);
142a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate    }
143a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate
144a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate    /**
145eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert     * Get the active tag used when accounting {@link Socket} traffic originating
146eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert     * from the current thread. Only one active tag per thread is supported.
147eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert     * {@link #tagSocket(Socket)}.
148dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     *
149dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * @see #setThreadStatsTag(int)
150eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert     */
151eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert    public static int getThreadStatsTag() {
152eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert        return NetworkManagementSocketTagger.getThreadSocketStatsTag();
153eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert    }
154eaef351afcd586d5a84e80455f12f72fd12213efAlon Albert
155dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey    /**
156dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Clear any active tag set to account {@link Socket} traffic originating
157dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * from the current thread.
158dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     *
159dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * @see #setThreadStatsTag(int)
160dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     */
16143be174888684ef3404a43d8434015193c656cceJeff Sharkey    public static void clearThreadStatsTag() {
1628568db534118fc14cc28100306d51626464ff319Jesse Wilson        NetworkManagementSocketTagger.setThreadSocketStatsTag(-1);
16343be174888684ef3404a43d8434015193c656cceJeff Sharkey    }
16443be174888684ef3404a43d8434015193c656cceJeff Sharkey
16543be174888684ef3404a43d8434015193c656cceJeff Sharkey    /**
16643be174888684ef3404a43d8434015193c656cceJeff Sharkey     * Set specific UID to use when accounting {@link Socket} traffic
16743be174888684ef3404a43d8434015193c656cceJeff Sharkey     * originating from the current thread. Designed for use when performing an
16843be174888684ef3404a43d8434015193c656cceJeff Sharkey     * operation on behalf of another application.
16943be174888684ef3404a43d8434015193c656cceJeff Sharkey     * <p>
17043be174888684ef3404a43d8434015193c656cceJeff Sharkey     * Changes only take effect during subsequent calls to
17143be174888684ef3404a43d8434015193c656cceJeff Sharkey     * {@link #tagSocket(Socket)}.
17243be174888684ef3404a43d8434015193c656cceJeff Sharkey     * <p>
17343be174888684ef3404a43d8434015193c656cceJeff Sharkey     * To take effect, caller must hold
17443be174888684ef3404a43d8434015193c656cceJeff Sharkey     * {@link android.Manifest.permission#UPDATE_DEVICE_STATS} permission.
17543be174888684ef3404a43d8434015193c656cceJeff Sharkey     *
176dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * @hide
17743be174888684ef3404a43d8434015193c656cceJeff Sharkey     */
178a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate    @SystemApi
17943be174888684ef3404a43d8434015193c656cceJeff Sharkey    public static void setThreadStatsUid(int uid) {
1808568db534118fc14cc28100306d51626464ff319Jesse Wilson        NetworkManagementSocketTagger.setThreadSocketStatsUid(uid);
18143be174888684ef3404a43d8434015193c656cceJeff Sharkey    }
18243be174888684ef3404a43d8434015193c656cceJeff Sharkey
18343be174888684ef3404a43d8434015193c656cceJeff Sharkey    /** {@hide} */
184a2496de37abda981ba80d74f529943374c9d6e3dChristopher Tate    @SystemApi
18543be174888684ef3404a43d8434015193c656cceJeff Sharkey    public static void clearThreadStatsUid() {
1868568db534118fc14cc28100306d51626464ff319Jesse Wilson        NetworkManagementSocketTagger.setThreadSocketStatsUid(-1);
18743be174888684ef3404a43d8434015193c656cceJeff Sharkey    }
18843be174888684ef3404a43d8434015193c656cceJeff Sharkey
18943be174888684ef3404a43d8434015193c656cceJeff Sharkey    /**
19043be174888684ef3404a43d8434015193c656cceJeff Sharkey     * Tag the given {@link Socket} with any statistics parameters active for
19143be174888684ef3404a43d8434015193c656cceJeff Sharkey     * the current thread. Subsequent calls always replace any existing
19243be174888684ef3404a43d8434015193c656cceJeff Sharkey     * parameters. When finished, call {@link #untagSocket(Socket)} to remove
19343be174888684ef3404a43d8434015193c656cceJeff Sharkey     * statistics parameters.
19443be174888684ef3404a43d8434015193c656cceJeff Sharkey     *
1954414cea13908b8230640f84ef39603d68ff9c377Jeff Sharkey     * @see #setThreadStatsTag(int)
19643be174888684ef3404a43d8434015193c656cceJeff Sharkey     * @see #setThreadStatsUid(int)
19743be174888684ef3404a43d8434015193c656cceJeff Sharkey     */
19843be174888684ef3404a43d8434015193c656cceJeff Sharkey    public static void tagSocket(Socket socket) throws SocketException {
1998568db534118fc14cc28100306d51626464ff319Jesse Wilson        SocketTagger.get().tag(socket);
20043be174888684ef3404a43d8434015193c656cceJeff Sharkey    }
20143be174888684ef3404a43d8434015193c656cceJeff Sharkey
20243be174888684ef3404a43d8434015193c656cceJeff Sharkey    /**
20343be174888684ef3404a43d8434015193c656cceJeff Sharkey     * Remove any statistics parameters from the given {@link Socket}.
20443be174888684ef3404a43d8434015193c656cceJeff Sharkey     */
20543be174888684ef3404a43d8434015193c656cceJeff Sharkey    public static void untagSocket(Socket socket) throws SocketException {
2068568db534118fc14cc28100306d51626464ff319Jesse Wilson        SocketTagger.get().untag(socket);
20743be174888684ef3404a43d8434015193c656cceJeff Sharkey    }
20843be174888684ef3404a43d8434015193c656cceJeff Sharkey
20943be174888684ef3404a43d8434015193c656cceJeff Sharkey    /**
210eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     * Start profiling data usage for current UID. Only one profiling session
211eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     * can be active at a time.
212eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     *
213eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     * @hide
214eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     */
215eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey    public static void startDataProfiling(Context context) {
216eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey        synchronized (sProfilingLock) {
217eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey            if (sActiveProfilingStart != null) {
218eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey                throw new IllegalStateException("already profiling data");
219eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey            }
220eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey
221eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey            // take snapshot in time; we calculate delta later
222a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey            sActiveProfilingStart = getDataLayerSnapshotForUid(context);
223eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey        }
224eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey    }
225eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey
226eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey    /**
227eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     * Stop profiling data usage for current UID.
228eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     *
229eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     * @return Detailed {@link NetworkStats} of data that occurred since last
230eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     *         {@link #startDataProfiling(Context)} call.
231eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     * @hide
232eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     */
233eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey    public static NetworkStats stopDataProfiling(Context context) {
234eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey        synchronized (sProfilingLock) {
235eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey            if (sActiveProfilingStart == null) {
236eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey                throw new IllegalStateException("not profiling data");
237eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey            }
238eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey
2395a7bcf31a44d9875ca5fc010dc213aa2bd5b1168Jeff Sharkey            // subtract starting values and return delta
2405a7bcf31a44d9875ca5fc010dc213aa2bd5b1168Jeff Sharkey            final NetworkStats profilingStop = getDataLayerSnapshotForUid(context);
2415a7bcf31a44d9875ca5fc010dc213aa2bd5b1168Jeff Sharkey            final NetworkStats profilingDelta = NetworkStats.subtract(
24263abc37356728c0575d6a62a203102ae6d97953bJeff Sharkey                    profilingStop, sActiveProfilingStart, null, null);
2435a7bcf31a44d9875ca5fc010dc213aa2bd5b1168Jeff Sharkey            sActiveProfilingStart = null;
2445a7bcf31a44d9875ca5fc010dc213aa2bd5b1168Jeff Sharkey            return profilingDelta;
245eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey        }
246eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey    }
247eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey
248eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey    /**
249558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey     * Increment count of network operations performed under the accounting tag
250558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey     * currently active on the calling thread. This can be used to derive
251558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey     * bytes-per-operation.
252558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey     *
253558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey     * @param operationCount Number of operations to increment count by.
254558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey     */
255558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey    public static void incrementOperationCount(int operationCount) {
256558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey        final int tag = getThreadStatsTag();
257558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey        incrementOperationCount(tag, operationCount);
258558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey    }
259558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey
260558a23200697d306b75750cf4612cf0717e73537Jeff Sharkey    /**
261a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey     * Increment count of network operations performed under the given
262a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey     * accounting tag. This can be used to derive bytes-per-operation.
263a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey     *
264a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey     * @param tag Accounting tag used in {@link #setThreadStatsTag(int)}.
265a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey     * @param operationCount Number of operations to increment count by.
266a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey     */
267a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    public static void incrementOperationCount(int tag, int operationCount) {
268a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        final int uid = android.os.Process.myUid();
269a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        try {
270234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey            getStatsService().incrementOperationCount(uid, tag, operationCount);
271a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        } catch (RemoteException e) {
272a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey            throw new RuntimeException(e);
273a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey        }
274a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    }
275a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey
276b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey    /** {@hide} */
277b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey    public static void closeQuietly(INetworkStatsSession session) {
278b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        // TODO: move to NetworkStatsService once it exists
279b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        if (session != null) {
280b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey            try {
281b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey                session.close();
282b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey            } catch (RuntimeException rethrown) {
283b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey                throw rethrown;
284b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey            } catch (Exception ignored) {
285b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey            }
286b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey        }
287b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey    }
288b52e3e55098c4a6e3dbfe19885895411cfb38911Jeff Sharkey
289a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    /**
290dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Return number of packets transmitted across mobile networks since device
291dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * boot. Counts packets across all mobile network interfaces, and always
292dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * increases monotonically since device boot. Statistics are measured at the
293dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * network layer, so they include both TCP and UDP usage.
294dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * <p>
295dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
296dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
297f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff     */
298234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    public static long getMobileTxPackets() {
299234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        long total = 0;
300234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        for (String iface : getMobileIfaces()) {
301234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey            total += getTxPackets(iface);
302234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        }
303234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        return total;
304234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    }
305f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff
306f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff    /**
307dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Return number of packets received across mobile networks since device
308dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * boot. Counts packets across all mobile network interfaces, and always
309dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * increases monotonically since device boot. Statistics are measured at the
310dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * network layer, so they include both TCP and UDP usage.
311dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * <p>
312dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
313dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
314f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff     */
315234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    public static long getMobileRxPackets() {
316234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        long total = 0;
317234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        for (String iface : getMobileIfaces()) {
318234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey            total += getRxPackets(iface);
319234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        }
320234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        return total;
321234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    }
322f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff
323f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff    /**
324dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Return number of bytes transmitted across mobile networks since device
325dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * boot. Counts packets across all mobile network interfaces, and always
326dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * increases monotonically since device boot. Statistics are measured at the
327dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * network layer, so they include both TCP and UDP usage.
328dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * <p>
329dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
330dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
331f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff     */
332234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    public static long getMobileTxBytes() {
333234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        long total = 0;
334234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        for (String iface : getMobileIfaces()) {
335234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey            total += getTxBytes(iface);
336234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        }
337234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        return total;
338234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    }
339f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff
340f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff    /**
341dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Return number of bytes received across mobile networks since device boot.
342dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Counts packets across all mobile network interfaces, and always increases
343dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * monotonically since device boot. Statistics are measured at the network
344dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * layer, so they include both TCP and UDP usage.
345dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * <p>
346dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
347dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
348f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff     */
349234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    public static long getMobileRxBytes() {
350234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        long total = 0;
351234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        for (String iface : getMobileIfaces()) {
352234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey            total += getRxBytes(iface);
353234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        }
354234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        return total;
355234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    }
356f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff
3574b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey    /** {@hide} */
3584b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey    public static long getMobileTcpRxPackets() {
3594b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey        long total = 0;
3604b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey        for (String iface : getMobileIfaces()) {
3614b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey            final long stat = nativeGetIfaceStat(iface, TYPE_TCP_RX_PACKETS);
3624b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey            if (stat != UNSUPPORTED) {
3634b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey                total += stat;
3644b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey            }
3654b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey        }
3664b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey        return total;
3674b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey    }
3684b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey
3694b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey    /** {@hide} */
3704b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey    public static long getMobileTcpTxPackets() {
3714b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey        long total = 0;
3724b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey        for (String iface : getMobileIfaces()) {
3734b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey            final long stat = nativeGetIfaceStat(iface, TYPE_TCP_TX_PACKETS);
3744b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey            if (stat != UNSUPPORTED) {
3754b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey                total += stat;
3764b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey            }
3774b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey        }
3784b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey        return total;
3794b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey    }
3804b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey
381dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey    /** {@hide} */
382234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    public static long getTxPackets(String iface) {
383234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        return nativeGetIfaceStat(iface, TYPE_TX_PACKETS);
384234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    }
385227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff
386dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey    /** {@hide} */
387234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    public static long getRxPackets(String iface) {
388234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        return nativeGetIfaceStat(iface, TYPE_RX_PACKETS);
389234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    }
390227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff
391dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey    /** {@hide} */
392234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    public static long getTxBytes(String iface) {
393234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        return nativeGetIfaceStat(iface, TYPE_TX_BYTES);
394234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    }
395227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff
396dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey    /** {@hide} */
397234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    public static long getRxBytes(String iface) {
398234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        return nativeGetIfaceStat(iface, TYPE_RX_BYTES);
399234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    }
400227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff
401227bec49157bc496f7c9e8e8f63c12728a448922Irfan Sheriff    /**
402dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Return number of packets transmitted since device boot. Counts packets
403dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * across all network interfaces, and always increases monotonically since
404dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * device boot. Statistics are measured at the network layer, so they
405dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * include both TCP and UDP usage.
406dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * <p>
407dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
408dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
409f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff     */
410234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    public static long getTotalTxPackets() {
411234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        return nativeGetTotalStat(TYPE_TX_PACKETS);
412234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    }
413f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff
414f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff    /**
415dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Return number of packets received since device boot. Counts packets
416dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * across all network interfaces, and always increases monotonically since
417dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * device boot. Statistics are measured at the network layer, so they
418dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * include both TCP and UDP usage.
419dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * <p>
420dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
421dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
422f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff     */
423234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    public static long getTotalRxPackets() {
424234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        return nativeGetTotalStat(TYPE_RX_PACKETS);
425234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    }
426f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff
427f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff    /**
428dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Return number of bytes transmitted since device boot. Counts packets
429dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * across all network interfaces, and always increases monotonically since
430dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * device boot. Statistics are measured at the network layer, so they
431dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * include both TCP and UDP usage.
432dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * <p>
433dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
434dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
435f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff     */
436234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    public static long getTotalTxBytes() {
437234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        return nativeGetTotalStat(TYPE_TX_BYTES);
438234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    }
439f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff
440f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff    /**
441dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Return number of bytes received since device boot. Counts packets across
442dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * all network interfaces, and always increases monotonically since device
443dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * boot. Statistics are measured at the network layer, so they include both
444dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * TCP and UDP usage.
445dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * <p>
446dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may
447dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey     * return {@link #UNSUPPORTED} on devices where statistics aren't available.
448f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff     */
449234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    public static long getTotalRxBytes() {
450234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        return nativeGetTotalStat(TYPE_RX_BYTES);
451234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    }
452f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff
453f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff    /**
45492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * Return number of bytes transmitted by the given UID since device boot.
45592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * Counts packets across all network interfaces, and always increases
45692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * monotonically since device boot. Statistics are measured at the network
45792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * layer, so they include both TCP and UDP usage.
45892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * <p>
45945e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return
46092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * {@link #UNSUPPORTED} on devices where statistics aren't available.
461f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff     *
46292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see android.os.Process#myUid()
46392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see android.content.pm.ApplicationInfo#uid
464f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff     */
46592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    public static long getUidTxBytes(int uid) {
46692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey        return nativeGetUidStat(uid, TYPE_TX_BYTES);
46792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    }
468f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff
469f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff    /**
47092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * Return number of bytes received by the given UID since device boot.
47192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * Counts packets across all network interfaces, and always increases
47292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * monotonically since device boot. Statistics are measured at the network
47392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * layer, so they include both TCP and UDP usage.
47492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * <p>
47545e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return
47692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * {@link #UNSUPPORTED} on devices where statistics aren't available.
477f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff     *
47892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see android.os.Process#myUid()
47992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see android.content.pm.ApplicationInfo#uid
480f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff     */
48192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    public static long getUidRxBytes(int uid) {
48292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey        return nativeGetUidStat(uid, TYPE_RX_BYTES);
48392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    }
484c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma
485c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma    /**
48692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * Return number of packets transmitted by the given UID since device boot.
48792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * Counts packets across all network interfaces, and always increases
48892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * monotonically since device boot. Statistics are measured at the network
48992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * layer, so they include both TCP and UDP usage.
49092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * <p>
49145e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return
49292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * {@link #UNSUPPORTED} on devices where statistics aren't available.
493c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma     *
49492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see android.os.Process#myUid()
49592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see android.content.pm.ApplicationInfo#uid
496c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma     */
49792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    public static long getUidTxPackets(int uid) {
49892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey        return nativeGetUidStat(uid, TYPE_TX_PACKETS);
49992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    }
500c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma
501c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma    /**
50292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * Return number of packets received by the given UID since device boot.
50392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * Counts packets across all network interfaces, and always increases
50492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * monotonically since device boot. Statistics are measured at the network
50592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * layer, so they include both TCP and UDP usage.
50692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * <p>
50745e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn     * Before {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2}, this may return
50892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * {@link #UNSUPPORTED} on devices where statistics aren't available.
509c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma     *
51092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see android.os.Process#myUid()
51192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see android.content.pm.ApplicationInfo#uid
512c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma     */
51392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    public static long getUidRxPackets(int uid) {
51492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey        return nativeGetUidStat(uid, TYPE_RX_PACKETS);
51592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    }
516c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma
517c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma    /**
51845e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
51992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             transport layer statistics are no longer available, and will
52092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             always return {@link #UNSUPPORTED}.
52192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see #getUidTxBytes(int)
522c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma     */
52392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    @Deprecated
52492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    public static long getUidTcpTxBytes(int uid) {
52592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey        return UNSUPPORTED;
52692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    }
527c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma
528c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma    /**
52945e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
53092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             transport layer statistics are no longer available, and will
53192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             always return {@link #UNSUPPORTED}.
53292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see #getUidRxBytes(int)
533c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma     */
53492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    @Deprecated
53592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    public static long getUidTcpRxBytes(int uid) {
53692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey        return UNSUPPORTED;
53792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    }
538c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma
539c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma    /**
54045e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
54192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             transport layer statistics are no longer available, and will
54292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             always return {@link #UNSUPPORTED}.
54392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see #getUidTxBytes(int)
544c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma     */
54592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    @Deprecated
54692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    public static long getUidUdpTxBytes(int uid) {
54792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey        return UNSUPPORTED;
54892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    }
549c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma
550c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma    /**
55145e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
55292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             transport layer statistics are no longer available, and will
55392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             always return {@link #UNSUPPORTED}.
55492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see #getUidRxBytes(int)
555c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma     */
55692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    @Deprecated
55792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    public static long getUidUdpRxBytes(int uid) {
55892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey        return UNSUPPORTED;
55992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    }
560c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma
561c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma    /**
56245e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
56392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             transport layer statistics are no longer available, and will
56492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             always return {@link #UNSUPPORTED}.
56592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see #getUidTxPackets(int)
566c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma     */
56792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    @Deprecated
56892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    public static long getUidTcpTxSegments(int uid) {
56992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey        return UNSUPPORTED;
57092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    }
571c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma
572c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma    /**
57345e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
57492be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             transport layer statistics are no longer available, and will
57592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             always return {@link #UNSUPPORTED}.
57692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see #getUidRxPackets(int)
577c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma     */
57892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    @Deprecated
57992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    public static long getUidTcpRxSegments(int uid) {
58092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey        return UNSUPPORTED;
58192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    }
582c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma
583c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma    /**
58445e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
58592be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             transport layer statistics are no longer available, and will
58692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             always return {@link #UNSUPPORTED}.
58792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see #getUidTxPackets(int)
588c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma     */
58992be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    @Deprecated
59092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    public static long getUidUdpTxPackets(int uid) {
59192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey        return UNSUPPORTED;
59292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    }
593c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma
594c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma    /**
59545e9ede55f3c5049fed1fc5002bd5084d1cd7eacDianne Hackborn     * @deprecated Starting in {@link android.os.Build.VERSION_CODES#JELLY_BEAN_MR2},
59692be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             transport layer statistics are no longer available, and will
59792be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     *             always return {@link #UNSUPPORTED}.
59892be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey     * @see #getUidRxPackets(int)
599c39c1d4dee917560d174f6ba5402e4c6644edd47Ashish Sharma     */
60092be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    @Deprecated
60192be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    public static long getUidUdpRxPackets(int uid) {
60292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey        return UNSUPPORTED;
60392be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    }
604eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey
605eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey    /**
606eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     * Return detailed {@link NetworkStats} for the current UID. Requires no
607eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     * special permission.
608eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey     */
609a63ba59260cd1bb3f5c16e395ace45a61f1d4461Jeff Sharkey    private static NetworkStats getDataLayerSnapshotForUid(Context context) {
610dddace758239a5c531f1cb9387eba0fd27b93e08Jeff Sharkey        // TODO: take snapshot locally, since proc file is now visible
611eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey        final int uid = android.os.Process.myUid();
612eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey        try {
613234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey            return getStatsService().getDataLayerSnapshotForUid(uid);
614234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        } catch (RemoteException e) {
615234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey            throw new RuntimeException(e);
616234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        }
617234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    }
618234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey
619234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    /**
620234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey     * Return set of any ifaces associated with mobile networks since boot.
621234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey     * Interfaces are never removed from this list, so counters should always be
622234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey     * monotonic.
623234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey     */
624234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    private static String[] getMobileIfaces() {
625234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey        try {
626234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey            return getStatsService().getMobileIfaces();
627eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey        } catch (RemoteException e) {
628eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey            throw new RuntimeException(e);
629eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey        }
630eedcb9525ba5befee2ba6ebb7a9ee3f13395c2a3Jeff Sharkey    }
631234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey
632234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    // NOTE: keep these in sync with android_net_TrafficStats.cpp
633234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    private static final int TYPE_RX_BYTES = 0;
634234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    private static final int TYPE_RX_PACKETS = 1;
635234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    private static final int TYPE_TX_BYTES = 2;
636234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    private static final int TYPE_TX_PACKETS = 3;
6374b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey    private static final int TYPE_TCP_RX_PACKETS = 4;
6384b17a1321db24b1a59c29b580aed7482a43febeeJeff Sharkey    private static final int TYPE_TCP_TX_PACKETS = 5;
639234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey
640234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    private static native long nativeGetTotalStat(int type);
641234766a36af6214644fa8205202287084ca9cf93Jeff Sharkey    private static native long nativeGetIfaceStat(String iface, int type);
64292be93a94edafb5906e8bc48e6fee9dd07f5049eJeff Sharkey    private static native long nativeGetUidStat(int uid, int type);
643f7d0b01387c10f93bf17981d45087810c80f0902Ken Shirriff}
644