Merge "Avoid creating a new data obj on every onUidStateChanged() callback." into sc-dev

This commit is contained in:
Sudheer Shanka
2021-04-05 18:26:19 +00:00
committed by Android (Google) Code Review

View File

@@ -643,6 +643,20 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
@GuardedBy("mUidRulesFirstLock")
private final SparseBooleanArray mInternetPermissionMap = new SparseBooleanArray();
/**
* Map of uid -> UidStateCallbackInfo objects holding the data received from
* {@link IUidObserver#onUidStateChanged(int, int, long, int)} callbacks. In order to avoid
* creating a new object for every callback received, we hold onto the object created for each
* uid and reuse it.
*
* Note that the lock used for accessing this object should not be used for anything else and we
* should not be acquiring new locks or doing any heavy work while this lock is held since this
* will be used in the callback from ActivityManagerService.
*/
@GuardedBy("mUidStateCallbackInfos")
private final SparseArray<UidStateCallbackInfo> mUidStateCallbackInfos =
new SparseArray<>();
private RestrictedModeObserver mRestrictedModeObserver;
// TODO: keep allowlist of system-critical services that should never have
@@ -1022,11 +1036,18 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
final private IUidObserver mUidObserver = new IUidObserver.Stub() {
@Override public void onUidStateChanged(int uid, int procState, long procStateSeq,
@ProcessCapability int capability) {
// TODO: Avoid creating a new UidStateCallbackInfo object every time
// we get a callback for an uid
mUidEventHandler.obtainMessage(UID_MSG_STATE_CHANGED,
new UidStateCallbackInfo(uid, procState, procStateSeq, capability))
synchronized (mUidStateCallbackInfos) {
UidStateCallbackInfo callbackInfo = mUidStateCallbackInfos.get(uid);
if (callbackInfo == null) {
callbackInfo = new UidStateCallbackInfo();
mUidStateCallbackInfos.put(uid, callbackInfo);
}
callbackInfo.update(uid, procState, procStateSeq, capability);
if (!callbackInfo.isPending) {
mUidEventHandler.obtainMessage(UID_MSG_STATE_CHANGED, callbackInfo)
.sendToTarget();
}
}
}
@Override public void onUidGone(int uid, boolean disabled) {
@@ -1044,14 +1065,14 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
};
private static final class UidStateCallbackInfo {
public final int uid;
public final int procState;
public final long procStateSeq;
public int uid;
public int procState;
public long procStateSeq;
@ProcessCapability
public final int capability;
public int capability;
public boolean isPending;
UidStateCallbackInfo(int uid, int procState, long procStateSeq,
@ProcessCapability int capability) {
public void update(int uid, int procState, long procStateSeq, int capability) {
this.uid = uid;
this.procState = procState;
this.procStateSeq = procStateSeq;
@@ -4495,6 +4516,9 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
mPowerSaveTempWhitelistAppIds.delete(uid);
mAppIdleTempWhitelistAppIds.delete(uid);
mUidFirewallRestrictedModeRules.delete(uid);
synchronized (mUidStateCallbackInfos) {
mUidStateCallbackInfos.remove(uid);
}
// ...then update iptables asynchronously.
mHandler.obtainMessage(MSG_RESET_FIREWALL_RULES_BY_UID, uid, 0).sendToTarget();
@@ -5128,10 +5152,17 @@ public class NetworkPolicyManagerService extends INetworkPolicyManager.Stub {
case UID_MSG_STATE_CHANGED: {
final UidStateCallbackInfo uidStateCallbackInfo =
(UidStateCallbackInfo) msg.obj;
final int uid = uidStateCallbackInfo.uid;
final int procState = uidStateCallbackInfo.procState;
final long procStateSeq = uidStateCallbackInfo.procStateSeq;
final int capability = uidStateCallbackInfo.capability;
final int uid;
final int procState;
final long procStateSeq;
final int capability;
synchronized (mUidStateCallbackInfos) {
uid = uidStateCallbackInfo.uid;
procState = uidStateCallbackInfo.procState;
procStateSeq = uidStateCallbackInfo.procStateSeq;
capability = uidStateCallbackInfo.capability;
uidStateCallbackInfo.isPending = false;
}
handleUidChanged(uid, procState, procStateSeq, capability);
return true;