From 9efbc1352b62535444dcb2c013e6b78b40fb0412 Mon Sep 17 00:00:00 2001 From: Winson Chiu Date: Fri, 30 Sep 2022 17:51:20 +0000 Subject: [PATCH] Move SystemConfig to services.jar Migrates getDefaultVrComponents used by SettingsProvider and adds a flag for hidden API enforcement to ApplicationInfo. This removes any dependency on SystemConfig from core/ and so it can be moved into services/core and exposed as a mainline API. This was done instead of exposing all of the methods through SystemConfigManager, as that is designed for use across processes, and it's more efficient to expose SystemConfig directly for modules running in the server process. Although VrManager is a nullable service, so getDefaultVrComponents had to live there to simplify the logic and maintain the existing behavior. Bug: 236389629 Change-Id: I4c2b14e1d34aaf439ceb1a3f9c8207e5d39fa6c2 --- core/java/android/content/om/OverlayManager.java | 4 +--- .../java/android/content/pm/ApplicationInfo.java | 16 +++++++++++++--- core/java/android/os/ISystemConfig.aidl | 5 +++++ core/java/android/os/SystemConfigManager.java | 14 ++++++++++++++ packages/SettingsProvider/AndroidManifest.xml | 1 + .../providers/settings/SettingsProvider.java | 12 +++++++----- .../java/com/android/server/SystemConfig.java | 4 +++- .../server/pm/parsing/PackageInfoUtils.java | 6 +++++- .../com/android/server/SystemConfigService.java | 7 +++++++ .../src/com/android/server/pm/MockSystem.kt | 3 +++ 10 files changed, 59 insertions(+), 13 deletions(-) rename {core => services/core}/java/com/android/server/SystemConfig.java (99%) diff --git a/core/java/android/content/om/OverlayManager.java b/core/java/android/content/om/OverlayManager.java index 0f7e01b234c25..94275aea0c4d8 100644 --- a/core/java/android/content/om/OverlayManager.java +++ b/core/java/android/content/om/OverlayManager.java @@ -31,8 +31,6 @@ import android.os.RemoteException; import android.os.ServiceManager; import android.os.UserHandle; -import com.android.server.SystemConfig; - import java.util.List; /** @@ -50,7 +48,7 @@ import java.util.List; * * }

* - *

Actors are defined through {@link SystemConfig}. Only system packages can be used. + *

Actors are defined through SystemConfig. Only system packages can be used. * The namespace "android" is reserved for use by AOSP and any "android" definitions must * have an implementation on device that fulfill their intended functionality.

* diff --git a/core/java/android/content/pm/ApplicationInfo.java b/core/java/android/content/pm/ApplicationInfo.java index e13f60c3265b2..2c28268d07728 100644 --- a/core/java/android/content/pm/ApplicationInfo.java +++ b/core/java/android/content/pm/ApplicationInfo.java @@ -45,7 +45,6 @@ import android.window.OnBackInvokedCallback; import com.android.internal.util.ArrayUtils; import com.android.internal.util.Parcelling; import com.android.internal.util.Parcelling.BuiltIn.ForBoolean; -import com.android.server.SystemConfig; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -803,7 +802,6 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { */ public static final int PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE = 1 << 2; - /** * If false, {@link android.view.KeyEvent#KEYCODE_BACK} related events will be forwarded to * the Activities, Dialogs and Views and {@link android.app.Activity#onBackPressed()}, @@ -815,12 +813,24 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { */ public static final int PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK = 1 << 3; + /** + * Whether or not this package is allowed to access hidden APIs. Replacement for legacy + * implementation of {@link #isPackageWhitelistedForHiddenApis()}. + * + * This is an internal flag and should never be used outside of this class. The real API for + * the hidden API enforcement policy is {@link #getHiddenApiEnforcementPolicy()}. + * + * @hide + */ + public static final int PRIVATE_FLAG_EXT_ALLOWLISTED_FOR_HIDDEN_APIS = 1 << 4; + /** @hide */ @IntDef(flag = true, prefix = { "PRIVATE_FLAG_EXT_" }, value = { PRIVATE_FLAG_EXT_PROFILEABLE, PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION, PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE, PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK, + PRIVATE_FLAG_EXT_ALLOWLISTED_FOR_HIDDEN_APIS, }) @Retention(RetentionPolicy.SOURCE) public @interface ApplicationInfoPrivateFlagsExt {} @@ -2222,7 +2232,7 @@ public class ApplicationInfo extends PackageItemInfo implements Parcelable { } private boolean isPackageWhitelistedForHiddenApis() { - return SystemConfig.getInstance().getHiddenApiWhitelistedApps().contains(packageName); + return (privateFlagsExt & PRIVATE_FLAG_EXT_ALLOWLISTED_FOR_HIDDEN_APIS) != 0; } /** diff --git a/core/java/android/os/ISystemConfig.aidl b/core/java/android/os/ISystemConfig.aidl index 15e3ce25122bb..61b24aa55e304 100644 --- a/core/java/android/os/ISystemConfig.aidl +++ b/core/java/android/os/ISystemConfig.aidl @@ -47,4 +47,9 @@ interface ISystemConfig { * @see SystemConfigManager#getEnabledComponentOverrides */ List getEnabledComponentOverrides(String packageName); + + /** + * @see SystemConfigManager#getDefaultVrComponents + */ + List getDefaultVrComponents(); } diff --git a/core/java/android/os/SystemConfigManager.java b/core/java/android/os/SystemConfigManager.java index cde2063fdba50..77843d9fbb0ae 100644 --- a/core/java/android/os/SystemConfigManager.java +++ b/core/java/android/os/SystemConfigManager.java @@ -147,4 +147,18 @@ public class SystemConfigManager { throw e.rethrowFromSystemServer(); } } + + /** + * Return the components that are enabled by default as VR mode listener services. + * @hide + */ + @RequiresPermission(android.Manifest.permission.QUERY_ALL_PACKAGES) + public List getDefaultVrComponents() { + try { + return mInterface.getDefaultVrComponents(); + } catch (RemoteException e) { + e.rethrowFromSystemServer(); + } + return Collections.emptyList(); + } } diff --git a/packages/SettingsProvider/AndroidManifest.xml b/packages/SettingsProvider/AndroidManifest.xml index c5bea2ea6791f..79677eeac4296 100644 --- a/packages/SettingsProvider/AndroidManifest.xml +++ b/packages/SettingsProvider/AndroidManifest.xml @@ -4,6 +4,7 @@ android:sharedUserId="android.uid.system"> + l = - SystemConfig.getInstance().getDefaultVrComponents(); + List l = mSysConfigManager.getDefaultVrComponents(); if (l != null && !l.isEmpty()) { StringBuilder b = new StringBuilder(); diff --git a/core/java/com/android/server/SystemConfig.java b/services/core/java/com/android/server/SystemConfig.java similarity index 99% rename from core/java/com/android/server/SystemConfig.java rename to services/core/java/com/android/server/SystemConfig.java index 2c9ef4f3c059c..b7f8d38171a22 100644 --- a/core/java/com/android/server/SystemConfig.java +++ b/services/core/java/com/android/server/SystemConfig.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2014 The Android Open Source Project + * Copyright (C) 2022 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -72,6 +72,8 @@ import java.util.Set; * Loads global system configuration info. * Note: Initializing this class hits the disk and is slow. This class should generally only be * accessed by the system_server process. + * + * @hide */ public class SystemConfig { static final String TAG = "SystemConfig"; diff --git a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java index be3a4dab6152f..6b3155504f5fc 100644 --- a/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java +++ b/services/core/java/com/android/server/pm/parsing/PackageInfoUtils.java @@ -54,6 +54,7 @@ import android.util.Slog; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; +import com.android.server.SystemConfig; import com.android.server.pm.parsing.pkg.AndroidPackageUtils; import com.android.server.pm.parsing.pkg.PackageImpl; import com.android.server.pm.pkg.AndroidPackage; @@ -1005,11 +1006,14 @@ public class PackageInfoUtils { /** @see ApplicationInfo#privateFlagsExt */ public static int appInfoPrivateFlagsExt(AndroidPackage pkg, @Nullable PackageStateInternal pkgSetting) { + var isAllowlistedForHiddenApis = SystemConfig.getInstance().getHiddenApiWhitelistedApps() + .contains(pkg.getPackageName()); // @formatter:off int pkgWithoutStateFlags = flag(pkg.isProfileable(), ApplicationInfo.PRIVATE_FLAG_EXT_PROFILEABLE) | flag(pkg.hasRequestForegroundServiceExemption(), ApplicationInfo.PRIVATE_FLAG_EXT_REQUEST_FOREGROUND_SERVICE_EXEMPTION) | flag(pkg.areAttributionsUserVisible(), ApplicationInfo.PRIVATE_FLAG_EXT_ATTRIBUTIONS_ARE_USER_VISIBLE) - | flag(pkg.isOnBackInvokedCallbackEnabled(), ApplicationInfo.PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK); + | flag(pkg.isOnBackInvokedCallbackEnabled(), ApplicationInfo.PRIVATE_FLAG_EXT_ENABLE_ON_BACK_INVOKED_CALLBACK) + | flag(isAllowlistedForHiddenApis, ApplicationInfo.PRIVATE_FLAG_EXT_ALLOWLISTED_FOR_HIDDEN_APIS); return appInfoPrivateFlagsExt(pkgWithoutStateFlags, pkgSetting); // @formatter:on } diff --git a/services/java/com/android/server/SystemConfigService.java b/services/java/com/android/server/SystemConfigService.java index cb52e5f72d5fe..6e82907d43611 100644 --- a/services/java/com/android/server/SystemConfigService.java +++ b/services/java/com/android/server/SystemConfigService.java @@ -101,6 +101,13 @@ public class SystemConfigService extends SystemService { } return enabledComponent; } + + @Override + public List getDefaultVrComponents() { + getContext().enforceCallingOrSelfPermission(Manifest.permission.QUERY_ALL_PACKAGES, + "Caller must hold " + Manifest.permission.QUERY_ALL_PACKAGES); + return new ArrayList<>(SystemConfig.getInstance().getDefaultVrComponents()); + } }; public SystemConfigService(Context context) { diff --git a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt index cc57b9f913e3d..dc7bcd625ee3a 100644 --- a/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt +++ b/services/tests/mockingservicestests/src/com/android/server/pm/MockSystem.kt @@ -38,6 +38,7 @@ import android.os.UserManager import android.os.incremental.IncrementalManager import android.provider.DeviceConfig import android.util.ArrayMap +import android.util.ArraySet import android.util.DisplayMetrics import android.util.EventLog import android.view.Display @@ -294,6 +295,8 @@ class MockSystem(withSession: (StaticMockitoSessionBuilder) -> Unit = {}) { wheneverStatic { SystemConfig.getInstance() }.thenReturn(mocks.systemConfig) whenever(mocks.systemConfig.availableFeatures).thenReturn(DEFAULT_AVAILABLE_FEATURES_MAP) whenever(mocks.systemConfig.sharedLibraries).thenReturn(DEFAULT_SHARED_LIBRARIES_LIST) + whenever(mocks.systemConfig.defaultVrComponents).thenReturn(ArraySet()) + whenever(mocks.systemConfig.hiddenApiWhitelistedApps).thenReturn(ArraySet()) wheneverStatic { SystemProperties.getBoolean("fw.free_cache_v2", true) }.thenReturn(true) wheneverStatic { Environment.getPackageCacheDirectory() }.thenReturn(packageCacheDirectory) wheneverStatic { SystemProperties.digestOf("ro.build.fingerprint") }.thenReturn("cacheName")