Merge "Don't take a lock on the UI thread"

This commit is contained in:
Makoto Onuki
2018-02-06 17:27:29 +00:00
committed by Android (Google) Code Review
3 changed files with 112 additions and 42 deletions

View File

@@ -3528,10 +3528,15 @@ class AlarmManagerService extends SystemService {
public static final int REPORT_ALARMS_ACTIVE = 4;
public static final int APP_STANDBY_BUCKET_CHANGED = 5;
public static final int APP_STANDBY_PAROLE_CHANGED = 6;
public static final int REMOVE_FOR_STOPPED = 7;
public AlarmHandler() {
}
public void postRemoveForStopped(int uid) {
obtainMessage(REMOVE_FOR_STOPPED, uid, 0).sendToTarget();
}
public void handleMessage(Message msg) {
switch (msg.what) {
case ALARM_EVENT: {
@@ -3594,6 +3599,12 @@ class AlarmManagerService extends SystemService {
}
break;
case REMOVE_FOR_STOPPED:
synchronized (mLock) {
removeForStoppedLocked(msg.arg1);
}
break;
default:
// nope, just ignore it
break;
@@ -3783,10 +3794,8 @@ class AlarmManagerService extends SystemService {
}
@Override public void onUidGone(int uid, boolean disabled) {
synchronized (mLock) {
if (disabled) {
removeForStoppedLocked(uid);
}
if (disabled) {
mHandler.postRemoveForStopped(uid);
}
}
@@ -3794,10 +3803,8 @@ class AlarmManagerService extends SystemService {
}
@Override public void onUidIdle(int uid, boolean disabled) {
synchronized (mLock) {
if (disabled) {
removeForStoppedLocked(uid);
}
if (disabled) {
mHandler.postRemoveForStopped(uid);
}
}

View File

@@ -614,48 +614,22 @@ public class ForceAppStandbyTracker {
private final class UidObserver extends IUidObserver.Stub {
@Override
public void onUidStateChanged(int uid, int procState, long procStateSeq) {
synchronized (mLock) {
if (procState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
if (removeUidFromArray(mForegroundUids, uid, false)) {
mHandler.notifyUidForegroundStateChanged(uid);
}
} else {
if (addUidToArray(mForegroundUids, uid)) {
mHandler.notifyUidForegroundStateChanged(uid);
}
}
}
}
@Override
public void onUidGone(int uid, boolean disabled) {
removeUid(uid, true);
mHandler.onUidStateChanged(uid, procState);
}
@Override
public void onUidActive(int uid) {
synchronized (mLock) {
if (addUidToArray(mActiveUids, uid)) {
mHandler.notifyUidActiveStateChanged(uid);
}
}
mHandler.onUidActive(uid);
}
@Override
public void onUidGone(int uid, boolean disabled) {
mHandler.onUidGone(uid, disabled);
}
@Override
public void onUidIdle(int uid, boolean disabled) {
// Just to avoid excessive memcpy, don't remove from the array in this case.
removeUid(uid, false);
}
private void removeUid(int uid, boolean remove) {
synchronized (mLock) {
if (removeUidFromArray(mActiveUids, uid, remove)) {
mHandler.notifyUidActiveStateChanged(uid);
}
if (removeUidFromArray(mForegroundUids, uid, remove)) {
mHandler.notifyUidForegroundStateChanged(uid);
}
}
mHandler.onUidIdle(uid, disabled);
}
@Override
@@ -740,6 +714,11 @@ public class ForceAppStandbyTracker {
private static final int MSG_FORCE_APP_STANDBY_FEATURE_FLAG_CHANGED = 9;
private static final int MSG_EXEMPT_CHANGED = 10;
private static final int MSG_ON_UID_STATE_CHANGED = 11;
private static final int MSG_ON_UID_ACTIVE = 12;
private static final int MSG_ON_UID_GONE = 13;
private static final int MSG_ON_UID_IDLE = 14;
public MyHandler(Looper looper) {
super(looper);
}
@@ -790,6 +769,22 @@ public class ForceAppStandbyTracker {
obtainMessage(MSG_USER_REMOVED, userId, 0).sendToTarget();
}
public void onUidStateChanged(int uid, int procState) {
obtainMessage(MSG_ON_UID_STATE_CHANGED, uid, procState).sendToTarget();
}
public void onUidActive(int uid) {
obtainMessage(MSG_ON_UID_ACTIVE, uid, 0).sendToTarget();
}
public void onUidGone(int uid, boolean disabled) {
obtainMessage(MSG_ON_UID_GONE, uid, disabled ? 1 : 0).sendToTarget();
}
public void onUidIdle(int uid, boolean disabled) {
obtainMessage(MSG_ON_UID_IDLE, uid, disabled ? 1 : 0).sendToTarget();
}
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
@@ -883,6 +878,61 @@ public class ForceAppStandbyTracker {
case MSG_USER_REMOVED:
handleUserRemoved(msg.arg1);
return;
case MSG_ON_UID_STATE_CHANGED:
handleUidStateChanged(msg.arg1, msg.arg2);
return;
case MSG_ON_UID_ACTIVE:
handleUidActive(msg.arg1);
return;
case MSG_ON_UID_GONE:
handleUidGone(msg.arg1, msg.arg1 != 0);
return;
case MSG_ON_UID_IDLE:
handleUidIdle(msg.arg1, msg.arg1 != 0);
return;
}
}
public void handleUidStateChanged(int uid, int procState) {
synchronized (mLock) {
if (procState > ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND) {
if (removeUidFromArray(mForegroundUids, uid, false)) {
mHandler.notifyUidForegroundStateChanged(uid);
}
} else {
if (addUidToArray(mForegroundUids, uid)) {
mHandler.notifyUidForegroundStateChanged(uid);
}
}
}
}
public void handleUidActive(int uid) {
synchronized (mLock) {
if (addUidToArray(mActiveUids, uid)) {
mHandler.notifyUidActiveStateChanged(uid);
}
}
}
public void handleUidGone(int uid, boolean disabled) {
removeUid(uid, true);
}
public void handleUidIdle(int uid, boolean disabled) {
// Just to avoid excessive memcpy, don't remove from the array in this case.
removeUid(uid, false);
}
private void removeUid(int uid, boolean remove) {
synchronized (mLock) {
if (removeUidFromArray(mActiveUids, uid, remove)) {
mHandler.notifyUidActiveStateChanged(uid);
}
if (removeUidFromArray(mForegroundUids, uid, remove)) {
mHandler.notifyUidForegroundStateChanged(uid);
}
}
}
}

View File

@@ -343,6 +343,7 @@ public class ForceAppStandbyTrackerTest {
assertTrue(instance.isUidActive(Process.SYSTEM_UID));
mIUidObserver.onUidActive(UID_1);
waitUntilMainHandlerDrain();
areRestricted(instance, UID_1, PACKAGE_1, NONE);
areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS);
areRestricted(instance, Process.SYSTEM_UID, PACKAGE_SYSTEM, NONE);
@@ -350,6 +351,7 @@ public class ForceAppStandbyTrackerTest {
assertFalse(instance.isUidActive(UID_2));
mIUidObserver.onUidGone(UID_1, /*disable=*/ false);
waitUntilMainHandlerDrain();
areRestricted(instance, UID_1, PACKAGE_1, JOBS_AND_ALARMS);
areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS);
areRestricted(instance, Process.SYSTEM_UID, PACKAGE_SYSTEM, NONE);
@@ -357,11 +359,13 @@ public class ForceAppStandbyTrackerTest {
assertFalse(instance.isUidActive(UID_2));
mIUidObserver.onUidActive(UID_1);
waitUntilMainHandlerDrain();
areRestricted(instance, UID_1, PACKAGE_1, NONE);
areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS);
areRestricted(instance, Process.SYSTEM_UID, PACKAGE_SYSTEM, NONE);
mIUidObserver.onUidIdle(UID_1, /*disable=*/ false);
waitUntilMainHandlerDrain();
areRestricted(instance, UID_1, PACKAGE_1, JOBS_AND_ALARMS);
areRestricted(instance, UID_2, PACKAGE_2, JOBS_AND_ALARMS);
areRestricted(instance, Process.SYSTEM_UID, PACKAGE_SYSTEM, NONE);
@@ -467,6 +471,7 @@ public class ForceAppStandbyTrackerTest {
mIUidObserver.onUidActive(UID_1);
waitUntilMainHandlerDrain();
assertTrue(instance.isUidActive(UID_1));
assertFalse(instance.isUidActive(UID_2));
assertTrue(instance.isUidActive(Process.SYSTEM_UID));
@@ -479,6 +484,7 @@ public class ForceAppStandbyTrackerTest {
mIUidObserver.onUidStateChanged(UID_2,
ActivityManager.PROCESS_STATE_BOUND_FOREGROUND_SERVICE, 0);
waitUntilMainHandlerDrain();
assertTrue(instance.isUidActive(UID_1));
assertFalse(instance.isUidActive(UID_2));
assertTrue(instance.isUidActive(Process.SYSTEM_UID));
@@ -491,6 +497,7 @@ public class ForceAppStandbyTrackerTest {
mIUidObserver.onUidStateChanged(UID_1,
ActivityManager.PROCESS_STATE_FOREGROUND_SERVICE, 0);
waitUntilMainHandlerDrain();
assertTrue(instance.isUidActive(UID_1));
assertFalse(instance.isUidActive(UID_2));
assertTrue(instance.isUidActive(Process.SYSTEM_UID));
@@ -501,6 +508,7 @@ public class ForceAppStandbyTrackerTest {
mIUidObserver.onUidGone(UID_1, true);
waitUntilMainHandlerDrain();
assertFalse(instance.isUidActive(UID_1));
assertFalse(instance.isUidActive(UID_2));
assertTrue(instance.isUidActive(Process.SYSTEM_UID));
@@ -511,6 +519,7 @@ public class ForceAppStandbyTrackerTest {
mIUidObserver.onUidIdle(UID_2, true);
waitUntilMainHandlerDrain();
assertFalse(instance.isUidActive(UID_1));
assertFalse(instance.isUidActive(UID_2));
assertTrue(instance.isUidActive(Process.SYSTEM_UID));
@@ -522,6 +531,7 @@ public class ForceAppStandbyTrackerTest {
mIUidObserver.onUidStateChanged(UID_1,
ActivityManager.PROCESS_STATE_IMPORTANT_FOREGROUND, 0);
waitUntilMainHandlerDrain();
assertFalse(instance.isUidActive(UID_1));
assertFalse(instance.isUidActive(UID_2));
assertTrue(instance.isUidActive(Process.SYSTEM_UID));
@@ -533,6 +543,7 @@ public class ForceAppStandbyTrackerTest {
mIUidObserver.onUidStateChanged(UID_1,
ActivityManager.PROCESS_STATE_TRANSIENT_BACKGROUND, 0);
waitUntilMainHandlerDrain();
assertFalse(instance.isUidActive(UID_1));
assertFalse(instance.isUidActive(UID_2));
assertTrue(instance.isUidActive(Process.SYSTEM_UID));
@@ -1037,6 +1048,8 @@ public class ForceAppStandbyTrackerTest {
mIUidObserver.onUidActive(UID_1);
mIUidObserver.onUidActive(UID_10_1);
waitUntilMainHandlerDrain();
setAppOps(UID_2, PACKAGE_2, true);
setAppOps(UID_10_2, PACKAGE_2, true);