Merge "Support dynamic feature flag config"

This commit is contained in:
Kevin Han
2021-02-23 01:36:29 +00:00
committed by Gerrit Code Review
3 changed files with 50 additions and 7 deletions

View File

@@ -23,9 +23,12 @@ import static android.content.Intent.EXTRA_REPLACING;
import static android.content.pm.PackageManager.MATCH_ANY_USER; import static android.content.pm.PackageManager.MATCH_ANY_USER;
import static android.provider.DeviceConfig.NAMESPACE_APP_HIBERNATION; import static android.provider.DeviceConfig.NAMESPACE_APP_HIBERNATION;
import static com.android.server.apphibernation.AppHibernationConstants.KEY_APP_HIBERNATION_ENABLED;
import android.annotation.NonNull; import android.annotation.NonNull;
import android.annotation.Nullable; import android.annotation.Nullable;
import android.app.ActivityManager; import android.app.ActivityManager;
import android.app.ActivityThread;
import android.app.IActivityManager; import android.app.IActivityManager;
import android.apphibernation.IAppHibernationService; import android.apphibernation.IAppHibernationService;
import android.content.BroadcastReceiver; import android.content.BroadcastReceiver;
@@ -45,6 +48,8 @@ import android.os.Trace;
import android.os.UserHandle; import android.os.UserHandle;
import android.os.UserManager; import android.os.UserManager;
import android.provider.DeviceConfig; import android.provider.DeviceConfig;
import android.provider.DeviceConfig.Properties;
import android.text.TextUtils;
import android.util.ArrayMap; import android.util.ArrayMap;
import android.util.ArraySet; import android.util.ArraySet;
import android.util.Slog; import android.util.Slog;
@@ -93,6 +98,9 @@ public final class AppHibernationService extends SystemService {
private final HibernationStateDiskStore<GlobalLevelState> mGlobalLevelHibernationDiskStore; private final HibernationStateDiskStore<GlobalLevelState> mGlobalLevelHibernationDiskStore;
private final Injector mInjector; private final Injector mInjector;
@VisibleForTesting
boolean mIsServiceEnabled;
/** /**
* Initializes the system service. * Initializes the system service.
* <p> * <p>
@@ -139,6 +147,13 @@ public final class AppHibernationService extends SystemService {
initializeGlobalHibernationStates(states); initializeGlobalHibernationStates(states);
} }
} }
if (phase == SystemService.PHASE_SYSTEM_SERVICES_READY) {
mIsServiceEnabled = isAppHibernationEnabled();
DeviceConfig.addOnPropertiesChangedListener(
NAMESPACE_APP_HIBERNATION,
ActivityThread.currentApplication().getMainExecutor(),
this::onDeviceConfigChanged);
}
} }
/** /**
@@ -149,6 +164,10 @@ public final class AppHibernationService extends SystemService {
* @return true if package is hibernating for the user * @return true if package is hibernating for the user
*/ */
boolean isHibernatingForUser(String packageName, int userId) { boolean isHibernatingForUser(String packageName, int userId) {
if (!checkHibernationEnabled("isHibernatingForUser")) {
return false;
}
userId = handleIncomingUser(userId, "isHibernating"); userId = handleIncomingUser(userId, "isHibernating");
if (!mUserManager.isUserUnlockingOrUnlocked(userId)) { if (!mUserManager.isUserUnlockingOrUnlocked(userId)) {
Slog.e(TAG, "Attempt to get hibernation state of stopped or nonexistent user " Slog.e(TAG, "Attempt to get hibernation state of stopped or nonexistent user "
@@ -174,6 +193,9 @@ public final class AppHibernationService extends SystemService {
* @param packageName package to check * @param packageName package to check
*/ */
boolean isHibernatingGlobally(String packageName) { boolean isHibernatingGlobally(String packageName) {
if (!checkHibernationEnabled("isHibernatingGlobally")) {
return false;
}
synchronized (mLock) { synchronized (mLock) {
GlobalLevelState state = mGlobalHibernationStates.get(packageName); GlobalLevelState state = mGlobalHibernationStates.get(packageName);
if (state == null) { if (state == null) {
@@ -192,6 +214,9 @@ public final class AppHibernationService extends SystemService {
* @param isHibernating new hibernation state * @param isHibernating new hibernation state
*/ */
void setHibernatingForUser(String packageName, int userId, boolean isHibernating) { void setHibernatingForUser(String packageName, int userId, boolean isHibernating) {
if (!checkHibernationEnabled("setHibernatingForUser")) {
return;
}
userId = handleIncomingUser(userId, "setHibernating"); userId = handleIncomingUser(userId, "setHibernating");
if (!mUserManager.isUserUnlockingOrUnlocked(userId)) { if (!mUserManager.isUserUnlockingOrUnlocked(userId)) {
Slog.w(TAG, "Attempt to set hibernation state for a stopped or nonexistent user " Slog.w(TAG, "Attempt to set hibernation state for a stopped or nonexistent user "
@@ -229,6 +254,9 @@ public final class AppHibernationService extends SystemService {
* @param isHibernating new hibernation state * @param isHibernating new hibernation state
*/ */
void setHibernatingGlobally(String packageName, boolean isHibernating) { void setHibernatingGlobally(String packageName, boolean isHibernating) {
if (!checkHibernationEnabled("setHibernatingGlobally")) {
return;
}
synchronized (mLock) { synchronized (mLock) {
GlobalLevelState state = mGlobalHibernationStates.get(packageName); GlobalLevelState state = mGlobalHibernationStates.get(packageName);
if (state == null) { if (state == null) {
@@ -444,6 +472,15 @@ public final class AppHibernationService extends SystemService {
} }
} }
private void onDeviceConfigChanged(Properties properties) {
for (String key : properties.getKeyset()) {
if (TextUtils.equals(KEY_APP_HIBERNATION_ENABLED, key)) {
mIsServiceEnabled = isAppHibernationEnabled();
break;
}
}
}
/** /**
* Private helper method to get the real user id and enforce permission checks. * Private helper method to get the real user id and enforce permission checks.
* *
@@ -461,6 +498,13 @@ public final class AppHibernationService extends SystemService {
} }
} }
private boolean checkHibernationEnabled(String methodName) {
if (!mIsServiceEnabled) {
Slog.w(TAG, String.format("Attempted to call %s on unsupported device.", methodName));
}
return mIsServiceEnabled;
}
private final AppHibernationServiceStub mServiceStub = new AppHibernationServiceStub(this); private final AppHibernationServiceStub mServiceStub = new AppHibernationServiceStub(this);
static final class AppHibernationServiceStub extends IAppHibernationService.Stub { static final class AppHibernationServiceStub extends IAppHibernationService.Stub {
@@ -536,7 +580,7 @@ public final class AppHibernationService extends SystemService {
public static boolean isAppHibernationEnabled() { public static boolean isAppHibernationEnabled() {
return DeviceConfig.getBoolean( return DeviceConfig.getBoolean(
NAMESPACE_APP_HIBERNATION, NAMESPACE_APP_HIBERNATION,
AppHibernationConstants.KEY_APP_HIBERNATION_ENABLED, KEY_APP_HIBERNATION_ENABLED,
false /* defaultValue */); false /* defaultValue */);
} }

View File

@@ -97,7 +97,6 @@ import com.android.internal.util.FrameworkStatsLog;
import com.android.internal.widget.ILockSettings; import com.android.internal.widget.ILockSettings;
import com.android.server.am.ActivityManagerService; import com.android.server.am.ActivityManagerService;
import com.android.server.appbinding.AppBindingService; import com.android.server.appbinding.AppBindingService;
import com.android.server.apphibernation.AppHibernationService;
import com.android.server.attention.AttentionManagerService; import com.android.server.attention.AttentionManagerService;
import com.android.server.audio.AudioService; import com.android.server.audio.AudioService;
import com.android.server.biometrics.AuthService; import com.android.server.biometrics.AuthService;
@@ -1883,11 +1882,9 @@ public final class SystemServer {
mSystemServiceManager.startService(VOICE_RECOGNITION_MANAGER_SERVICE_CLASS); mSystemServiceManager.startService(VOICE_RECOGNITION_MANAGER_SERVICE_CLASS);
t.traceEnd(); t.traceEnd();
if (AppHibernationService.isAppHibernationEnabled()) {
t.traceBegin("StartAppHibernationService"); t.traceBegin("StartAppHibernationService");
mSystemServiceManager.startService(APP_HIBERNATION_SERVICE_CLASS); mSystemServiceManager.startService(APP_HIBERNATION_SERVICE_CLASS);
t.traceEnd(); t.traceEnd();
}
if (GestureLauncherService.isGestureLauncherEnabled(context.getResources())) { if (GestureLauncherService.isGestureLauncherEnabled(context.getResources())) {
t.traceBegin("StartGestureLauncher"); t.traceBegin("StartGestureLauncher");

View File

@@ -110,6 +110,8 @@ public final class AppHibernationServiceTest {
UserInfo userInfo = addUser(USER_ID_1); UserInfo userInfo = addUser(USER_ID_1);
mAppHibernationService.onUserUnlocking(new SystemService.TargetUser(userInfo)); mAppHibernationService.onUserUnlocking(new SystemService.TargetUser(userInfo));
doReturn(true).when(mUserManager).isUserUnlockingOrUnlocked(USER_ID_1); doReturn(true).when(mUserManager).isUserUnlockingOrUnlocked(USER_ID_1);
mAppHibernationService.mIsServiceEnabled = true;
} }
@Test @Test