Skip to content

Commit a537205

Browse files
jsharkeyAndroid (Google) Code Review
authored andcommitted
Merge "INetworkStatsSession with lifecycle for caching."
2 parents a3bd242 + b52e3e5 commit a537205

File tree

10 files changed

+166
-68
lines changed

10 files changed

+166
-68
lines changed

Android.mk

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,7 @@ LOCAL_SRC_FILES += \
118118
core/java/android/net/INetworkPolicyListener.aidl \
119119
core/java/android/net/INetworkPolicyManager.aidl \
120120
core/java/android/net/INetworkStatsService.aidl \
121+
core/java/android/net/INetworkStatsSession.aidl \
121122
core/java/android/net/nsd/INsdManager.aidl \
122123
core/java/android/nfc/INdefPushCallback.aidl \
123124
core/java/android/nfc/INfcAdapter.aidl \

core/java/android/net/INetworkStatsService.aidl

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,19 @@
1616

1717
package android.net;
1818

19+
import android.net.INetworkStatsSession;
1920
import android.net.NetworkStats;
2021
import android.net.NetworkStatsHistory;
2122
import android.net.NetworkTemplate;
2223

2324
/** {@hide} */
2425
interface INetworkStatsService {
2526

26-
/** Return historical network layer stats for traffic that matches template. */
27-
NetworkStatsHistory getHistoryForNetwork(in NetworkTemplate template, int fields);
28-
/** Return historical network layer stats for specific UID traffic that matches template. */
29-
NetworkStatsHistory getHistoryForUid(in NetworkTemplate template, int uid, int set, int tag, int fields);
27+
/** Start a statistics query session. */
28+
INetworkStatsSession openSession();
3029

31-
/** Return network layer usage summary for traffic that matches template. */
32-
NetworkStats getSummaryForNetwork(in NetworkTemplate template, long start, long end);
33-
/** Return network layer usage summary per UID for traffic that matches template. */
34-
NetworkStats getSummaryForAllUid(in NetworkTemplate template, long start, long end, boolean includeTags);
30+
/** Return network layer usage total for traffic that matches template. */
31+
long getNetworkTotalBytes(in NetworkTemplate template, long start, long end);
3532

3633
/** Return data layer snapshot of UID network usage. */
3734
NetworkStats getDataLayerSnapshotForUid(int uid);
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright (C) 2012 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.net.NetworkStats;
20+
import android.net.NetworkStatsHistory;
21+
import android.net.NetworkTemplate;
22+
23+
/** {@hide} */
24+
interface INetworkStatsSession {
25+
26+
/** Return network layer usage summary for traffic that matches template. */
27+
NetworkStats getSummaryForNetwork(in NetworkTemplate template, long start, long end);
28+
/** Return historical network layer stats for traffic that matches template. */
29+
NetworkStatsHistory getHistoryForNetwork(in NetworkTemplate template, int fields);
30+
31+
/** Return network layer usage summary per UID for traffic that matches template. */
32+
NetworkStats getSummaryForAllUid(in NetworkTemplate template, long start, long end, boolean includeTags);
33+
/** Return historical network layer stats for specific UID traffic that matches template. */
34+
NetworkStatsHistory getHistoryForUid(in NetworkTemplate template, int uid, int set, int tag, int fields);
35+
36+
void close();
37+
38+
}

core/java/android/net/TrafficStats.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,19 @@ public static void incrementOperationCount(int tag, int operationCount) {
238238
}
239239
}
240240

241+
/** {@hide} */
242+
public static void closeQuietly(INetworkStatsSession session) {
243+
// TODO: move to NetworkStatsService once it exists
244+
if (session != null) {
245+
try {
246+
session.close();
247+
} catch (RuntimeException rethrown) {
248+
throw rethrown;
249+
} catch (Exception ignored) {
250+
}
251+
}
252+
}
253+
241254
/**
242255
* Get the total number of packets transmitted through the mobile interface.
243256
*

services/java/com/android/server/net/NetworkPolicyManagerService.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1740,7 +1740,7 @@ private void setPolicyDataEnable(int networkType, boolean enabled) {
17401740

17411741
private long getTotalBytes(NetworkTemplate template, long start, long end) {
17421742
try {
1743-
return mNetworkStats.getSummaryForNetwork(template, start, end).getTotalBytes();
1743+
return mNetworkStats.getNetworkTotalBytes(template, start, end);
17441744
} catch (RuntimeException e) {
17451745
Slog.w(TAG, "problem reading network stats: " + e);
17461746
return 0;

services/java/com/android/server/net/NetworkStatsRecorder.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,11 @@ public void removeUidLocked(int uid) {
221221
if (mLastSnapshot != null) {
222222
mLastSnapshot = mLastSnapshot.withoutUid(uid);
223223
}
224+
225+
final NetworkStatsCollection complete = mComplete != null ? mComplete.get() : null;
226+
if (complete != null) {
227+
complete.removeUid(uid);
228+
}
224229
}
225230

226231
/**

services/java/com/android/server/net/NetworkStatsService.java

Lines changed: 65 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@
7070
import android.net.IConnectivityManager;
7171
import android.net.INetworkManagementEventObserver;
7272
import android.net.INetworkStatsService;
73+
import android.net.INetworkStatsSession;
7374
import android.net.LinkProperties;
7475
import android.net.NetworkIdentity;
7576
import android.net.NetworkInfo;
@@ -412,40 +413,75 @@ private void registerGlobalAlert() {
412413
}
413414

414415
@Override
415-
public NetworkStatsHistory getHistoryForNetwork(NetworkTemplate template, int fields) {
416-
return mDevStatsCached.getHistory(template, UID_ALL, SET_ALL, TAG_NONE, fields);
417-
}
416+
public INetworkStatsSession openSession() {
417+
mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG);
418418

419-
@Override
420-
public NetworkStats getSummaryForNetwork(NetworkTemplate template, long start, long end) {
421-
return mDevStatsCached.getSummary(template, start, end);
422-
}
419+
// return an IBinder which holds strong references to any loaded stats
420+
// for its lifetime; when caller closes only weak references remain.
423421

424-
@Override
425-
public NetworkStatsHistory getHistoryForUid(
426-
NetworkTemplate template, int uid, int set, int tag, int fields) {
427-
// TODO: transition to stats sessions to avoid WeakReferences
428-
if (tag == TAG_NONE) {
429-
return mUidRecorder.getOrLoadCompleteLocked().getHistory(
430-
template, uid, set, tag, fields);
431-
} else {
432-
return mUidTagRecorder.getOrLoadCompleteLocked().getHistory(
433-
template, uid, set, tag, fields);
434-
}
422+
return new INetworkStatsSession.Stub() {
423+
private NetworkStatsCollection mUidComplete;
424+
private NetworkStatsCollection mUidTagComplete;
425+
426+
private NetworkStatsCollection getUidComplete() {
427+
if (mUidComplete == null) {
428+
mUidComplete = mUidRecorder.getOrLoadCompleteLocked();
429+
}
430+
return mUidComplete;
431+
}
432+
433+
private NetworkStatsCollection getUidTagComplete() {
434+
if (mUidTagComplete == null) {
435+
mUidTagComplete = mUidTagRecorder.getOrLoadCompleteLocked();
436+
}
437+
return mUidTagComplete;
438+
}
439+
440+
@Override
441+
public NetworkStats getSummaryForNetwork(
442+
NetworkTemplate template, long start, long end) {
443+
return mDevStatsCached.getSummary(template, start, end);
444+
}
445+
446+
@Override
447+
public NetworkStatsHistory getHistoryForNetwork(NetworkTemplate template, int fields) {
448+
return mDevStatsCached.getHistory(template, UID_ALL, SET_ALL, TAG_NONE, fields);
449+
}
450+
451+
@Override
452+
public NetworkStats getSummaryForAllUid(
453+
NetworkTemplate template, long start, long end, boolean includeTags) {
454+
final NetworkStats stats = getUidComplete().getSummary(template, start, end);
455+
if (includeTags) {
456+
final NetworkStats tagStats = getUidTagComplete()
457+
.getSummary(template, start, end);
458+
stats.combineAllValues(tagStats);
459+
}
460+
return stats;
461+
}
462+
463+
@Override
464+
public NetworkStatsHistory getHistoryForUid(
465+
NetworkTemplate template, int uid, int set, int tag, int fields) {
466+
if (tag == TAG_NONE) {
467+
return getUidComplete().getHistory(template, uid, set, tag, fields);
468+
} else {
469+
return getUidTagComplete().getHistory(template, uid, set, tag, fields);
470+
}
471+
}
472+
473+
@Override
474+
public void close() {
475+
mUidComplete = null;
476+
mUidTagComplete = null;
477+
}
478+
};
435479
}
436480

437481
@Override
438-
public NetworkStats getSummaryForAllUid(
439-
NetworkTemplate template, long start, long end, boolean includeTags) {
440-
// TODO: transition to stats sessions to avoid WeakReferences
441-
final NetworkStats stats = mUidRecorder.getOrLoadCompleteLocked().getSummary(
442-
template, start, end);
443-
if (includeTags) {
444-
final NetworkStats tagStats = mUidTagRecorder.getOrLoadCompleteLocked().getSummary(
445-
template, start, end);
446-
stats.combineAllValues(tagStats);
447-
}
448-
return stats;
482+
public long getNetworkTotalBytes(NetworkTemplate template, long start, long end) {
483+
mContext.enforceCallingOrSelfPermission(READ_NETWORK_USAGE_HISTORY, TAG);
484+
return mDevStatsCached.getSummary(template, start, end).getTotalBytes();
449485
}
450486

451487
@Override

services/tests/servicestests/src/com/android/server/NetworkPolicyManagerServiceTest.java

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@
7070
import android.os.INetworkManagementService;
7171
import android.os.IPowerManager;
7272
import android.os.MessageQueue.IdleHandler;
73-
import android.os.SystemClock;
7473
import android.os.UserId;
7574
import android.test.AndroidTestCase;
7675
import android.test.mock.MockPackageManager;
@@ -628,8 +627,8 @@ public void testNetworkPolicyAppliedCycleLastMonth() throws Exception {
628627
// pretend that 512 bytes total have happened
629628
stats = new NetworkStats(getElapsedRealtime(), 1)
630629
.addIfaceValues(TEST_IFACE, 256L, 2L, 256L, 2L);
631-
expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, TIME_MAR_10))
632-
.andReturn(stats).atLeastOnce();
630+
expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, TIME_MAR_10))
631+
.andReturn(stats.getTotalBytes()).atLeastOnce();
633632
expectPolicyDataEnable(TYPE_WIFI, true);
634633

635634
// TODO: consider making strongly ordered mock
@@ -699,8 +698,8 @@ public void testOverWarningLimitNotification() throws Exception {
699698
{
700699
expectCurrentTime();
701700
expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
702-
expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
703-
.andReturn(stats).atLeastOnce();
701+
expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
702+
.andReturn(stats.getTotalBytes()).atLeastOnce();
704703
expectPolicyDataEnable(TYPE_WIFI, true);
705704

706705
expectClearNotifications();
@@ -722,8 +721,8 @@ public void testOverWarningLimitNotification() throws Exception {
722721
{
723722
expectCurrentTime();
724723
expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
725-
expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
726-
.andReturn(stats).atLeastOnce();
724+
expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
725+
.andReturn(stats.getTotalBytes()).atLeastOnce();
727726
expectPolicyDataEnable(TYPE_WIFI, true);
728727

729728
expectRemoveInterfaceQuota(TEST_IFACE);
@@ -745,8 +744,8 @@ public void testOverWarningLimitNotification() throws Exception {
745744

746745
{
747746
expectCurrentTime();
748-
expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
749-
.andReturn(stats).atLeastOnce();
747+
expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
748+
.andReturn(stats.getTotalBytes()).atLeastOnce();
750749
expectPolicyDataEnable(TYPE_WIFI, true);
751750

752751
expectForceUpdate();
@@ -766,8 +765,8 @@ public void testOverWarningLimitNotification() throws Exception {
766765

767766
{
768767
expectCurrentTime();
769-
expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
770-
.andReturn(stats).atLeastOnce();
768+
expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
769+
.andReturn(stats.getTotalBytes()).atLeastOnce();
771770
expectPolicyDataEnable(TYPE_WIFI, false);
772771

773772
expectForceUpdate();
@@ -786,8 +785,8 @@ public void testOverWarningLimitNotification() throws Exception {
786785
{
787786
expectCurrentTime();
788787
expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
789-
expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
790-
.andReturn(stats).atLeastOnce();
788+
expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
789+
.andReturn(stats.getTotalBytes()).atLeastOnce();
791790
expectPolicyDataEnable(TYPE_WIFI, true);
792791

793792
// snoozed interface still has high quota so background data is
@@ -827,8 +826,8 @@ public void testMeteredNetworkWithoutLimit() throws Exception {
827826
{
828827
expectCurrentTime();
829828
expect(mConnManager.getAllNetworkState()).andReturn(state).atLeastOnce();
830-
expect(mStatsService.getSummaryForNetwork(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
831-
.andReturn(stats).atLeastOnce();
829+
expect(mStatsService.getNetworkTotalBytes(sTemplateWifi, TIME_FEB_15, currentTimeMillis()))
830+
.andReturn(stats.getTotalBytes()).atLeastOnce();
832831
expectPolicyDataEnable(TYPE_WIFI, true);
833832

834833
expectRemoveInterfaceQuota(TEST_IFACE);

0 commit comments

Comments
 (0)