diff options
Diffstat (limited to 'services')
133 files changed, 1504 insertions, 650 deletions
diff --git a/services/Android.bp b/services/Android.bp index a7cb9bb9af24..473911f08cf7 100644 --- a/services/Android.bp +++ b/services/Android.bp @@ -312,9 +312,11 @@ system_java_library { "services.wifi", "service-blobstore", "service-jobscheduler", - "service-connectivity-b-pre-jarjar", // Move it to mainline module "android.hidl.base-V1.0-java", - ], + ] + select(release_flag("RELEASE_MOVE_VCN_TO_MAINLINE"), { + true: [], + default: ["service-connectivity-b-platform"], + }), libs: [ "android.hidl.manager-V1.0-java", diff --git a/services/accessibility/OWNERS b/services/accessibility/OWNERS index 4e1175034b5b..ab1e9ffe3bfe 100644 --- a/services/accessibility/OWNERS +++ b/services/accessibility/OWNERS @@ -1,4 +1,7 @@ -# Bug component: 44215 +# Bug component: 1530954 +# +# The above component is for automated test bugs. If you are a human looking to report +# a bug in this codebase then please use component 44215. # Android Accessibility Framework owners danielnorman@google.com diff --git a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java index 3441d94facda..9ceca5d1dbfe 100644 --- a/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java +++ b/services/accessibility/java/com/android/server/accessibility/AbstractAccessibilityServiceConnection.java @@ -1589,7 +1589,13 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ * lock because this calls out to WindowManagerService. */ void addWindowTokensForAllDisplays() { - final Display[] displays = mDisplayManager.getDisplays(); + Display[] displays = {}; + final long identity = Binder.clearCallingIdentity(); + try { + displays = mDisplayManager.getDisplays(); + } finally { + Binder.restoreCallingIdentity(identity); + } for (int i = 0; i < displays.length; i++) { final int displayId = displays[i].getDisplayId(); addWindowTokenForDisplay(displayId); @@ -1625,7 +1631,13 @@ abstract class AbstractAccessibilityServiceConnection extends IAccessibilityServ } public void onRemoved() { - final Display[] displays = mDisplayManager.getDisplays(); + Display[] displays = {}; + final long identity = Binder.clearCallingIdentity(); + try { + displays = mDisplayManager.getDisplays(); + } finally { + Binder.restoreCallingIdentity(identity); + } for (int i = 0; i < displays.length; i++) { final int displayId = displays[i].getDisplayId(); onDisplayRemoved(displayId); diff --git a/services/accessibility/java/com/android/server/accessibility/magnification/OWNERS b/services/accessibility/java/com/android/server/accessibility/magnification/OWNERS new file mode 100644 index 000000000000..ff812ad7e7e6 --- /dev/null +++ b/services/accessibility/java/com/android/server/accessibility/magnification/OWNERS @@ -0,0 +1,8 @@ +# Bug component: 1530954 +# +# The above component is for automated test bugs. If you are a human looking to report +# a bug in this codebase then please use component 770744. + +juchengchou@google.com +chenjean@google.com +chihtinglo@google.com diff --git a/services/art-wear-profile b/services/art-wear-profile index 1e3090f9bf00..f080715643ca 100644 --- a/services/art-wear-profile +++ b/services/art-wear-profile @@ -7419,7 +7419,7 @@ PLcom/android/server/app/GameManagerService;->sendUserMessage(IILjava/lang/Strin PLcom/android/server/app/GameManagerService;->updateConfigsForUser(IZ[Ljava/lang/String;)V PLcom/android/server/app/GameManagerService;->writeGameModeInterventionsToFile(I)V PLcom/android/server/app/GameManagerSettings;-><init>(Ljava/io/File;)V -HPLcom/android/server/app/GameManagerSettings;->getConfigOverride(Ljava/lang/String;)Lcom/android/server/app/GameManagerService$GamePackageConfiguration; +HPLcom/android/server/app/GameManagerSettings;->getConfigOverrideLocked(Ljava/lang/String;)Lcom/android/server/app/GameManagerService$GamePackageConfiguration; HPLcom/android/server/app/GameManagerSettings;->getGameModeLocked(Ljava/lang/String;)I PLcom/android/server/app/GameManagerSettings;->readPersistentDataLocked()Z PLcom/android/server/appbinding/AppBindingConstants;-><init>(Ljava/lang/String;)V diff --git a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java index 6729231d68ab..e631403a9972 100644 --- a/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java +++ b/services/companion/java/com/android/server/companion/virtual/VirtualDeviceManagerService.java @@ -855,13 +855,12 @@ public class VirtualDeviceManagerService extends SystemService { @Override public void onAuthenticationPrompt(int uid) { - synchronized (mVirtualDeviceManagerLock) { - for (int i = 0; i < mVirtualDevices.size(); i++) { - VirtualDeviceImpl device = mVirtualDevices.valueAt(i); - device.showToastWhereUidIsRunning(uid, - R.string.app_streaming_blocked_message_for_fingerprint_dialog, - Toast.LENGTH_LONG, Looper.getMainLooper()); - } + ArrayList<VirtualDeviceImpl> virtualDevicesSnapshot = getVirtualDevicesSnapshot(); + for (int i = 0; i < virtualDevicesSnapshot.size(); i++) { + VirtualDeviceImpl device = virtualDevicesSnapshot.get(i); + device.showToastWhereUidIsRunning(uid, + R.string.app_streaming_blocked_message_for_fingerprint_dialog, + Toast.LENGTH_LONG, Looper.getMainLooper()); } } diff --git a/services/core/Android.bp b/services/core/Android.bp index b3d85f8aac48..34a47ac4b416 100644 --- a/services/core/Android.bp +++ b/services/core/Android.bp @@ -37,6 +37,7 @@ filegroup { ":framework_native_aidl", ":gsiservice_aidl", ":installd_aidl", + ":mmd_aidl", ":storaged_aidl", ":vold_aidl", ], @@ -149,6 +150,9 @@ java_library_static { // Java/AIDL sources to be moved out to CrashRecovery module ":services-crashrecovery-sources", + + // Indicate whether VCN is in platform or mainline + ":vcn-location-sources", ], libs: [ @@ -244,6 +248,8 @@ java_library_static { "aconfig_new_storage_flags_lib", "powerstats_flags_lib", "locksettings_flags_lib", + "MmdProperties", + "mmd_flags_lib", "profiling_flags_lib", "android.adpf.sessionmanager_aidl-java", "uprobestats_flags_java_lib", @@ -284,9 +290,15 @@ java_genrule { out: ["services.core.priorityboosted.jar"], } +java_genrule_combiner { + name: "services.core.combined", + static_libs: ["services.core.priorityboosted"], + headers: ["services.core.unboosted"], +} + java_library { name: "services.core", - static_libs: ["services.core.priorityboosted"], + static_libs: ["services.core.combined"], } java_library_host { diff --git a/services/core/java/com/android/server/BinaryTransparencyService.java b/services/core/java/com/android/server/BinaryTransparencyService.java index 36dff89d9d61..ec0e57a2ccf0 100644 --- a/services/core/java/com/android/server/BinaryTransparencyService.java +++ b/services/core/java/com/android/server/BinaryTransparencyService.java @@ -1697,7 +1697,7 @@ public class BinaryTransparencyService extends SystemService { private class PackageUpdatedReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { - if (!intent.getAction().equals(Intent.ACTION_PACKAGE_ADDED)) { + if (!Intent.ACTION_PACKAGE_ADDED.equals(intent.getAction())) { return; } diff --git a/services/core/java/com/android/server/BootReceiver.java b/services/core/java/com/android/server/BootReceiver.java index 1588e0421675..4713a8d23b18 100644 --- a/services/core/java/com/android/server/BootReceiver.java +++ b/services/core/java/com/android/server/BootReceiver.java @@ -50,6 +50,7 @@ import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; import com.android.server.am.DropboxRateLimiter; +import libcore.io.IoUtils; import org.xmlpull.v1.XmlPullParser; import org.xmlpull.v1.XmlPullParserException; @@ -148,6 +149,10 @@ public class BootReceiver extends BroadcastReceiver { @Override public void onReceive(final Context context, Intent intent) { + if (!Intent.ACTION_BOOT_COMPLETED.equals(intent.getAction())) { + return; + } + // Log boot events in the background to avoid blocking the main thread with I/O new Thread() { @Override @@ -213,6 +218,8 @@ public class BootReceiver extends BroadcastReceiver { } catch (Exception e) { Slog.wtf(TAG, "Error watching for trace events", e); return 0; // Unregister the handler. + } finally { + IoUtils.closeQuietly(fd); } return OnFileDescriptorEventListener.EVENT_INPUT; } diff --git a/services/core/java/com/android/server/OWNERS b/services/core/java/com/android/server/OWNERS index c15cf34b8955..6858e2941ff9 100644 --- a/services/core/java/com/android/server/OWNERS +++ b/services/core/java/com/android/server/OWNERS @@ -31,6 +31,7 @@ per-file *Storage* = file:/core/java/android/os/storage/OWNERS per-file *TimeUpdate* = file:/services/core/java/com/android/server/timezonedetector/OWNERS per-file DynamicSystemService.java = file:/packages/DynamicSystemInstallationService/OWNERS per-file GestureLauncherService.java = file:platform/packages/apps/EmergencyInfo:/OWNERS +per-file GestureLauncherService.java = file:/INPUT_OWNERS per-file MmsServiceBroker.java = file:/telephony/OWNERS per-file NetIdManager.java = file:/services/core/java/com/android/server/net/OWNERS per-file PackageWatchdog.java = file:/services/core/java/com/android/server/crashrecovery/OWNERS diff --git a/services/core/java/com/android/server/StorageManagerService.java b/services/core/java/com/android/server/StorageManagerService.java index b7bc4e4827ef..350ecab1dd5f 100644 --- a/services/core/java/com/android/server/StorageManagerService.java +++ b/services/core/java/com/android/server/StorageManagerService.java @@ -41,6 +41,7 @@ import static android.os.storage.OnObbStateChangeListener.ERROR_NOT_MOUNTED; import static android.os.storage.OnObbStateChangeListener.ERROR_PERMISSION_DENIED; import static android.os.storage.OnObbStateChangeListener.MOUNTED; import static android.os.storage.OnObbStateChangeListener.UNMOUNTED; +import static android.mmd.flags.Flags.mmdEnabled; import static com.android.internal.util.XmlUtils.readStringAttribute; import static com.android.internal.util.XmlUtils.writeStringAttribute; @@ -126,6 +127,7 @@ import android.provider.Downloads; import android.provider.MediaStore; import android.provider.Settings; import android.service.storage.ExternalStorageService; +import android.sysprop.MmdProperties; import android.text.TextUtils; import android.text.format.DateUtils; import android.util.ArrayMap; @@ -155,6 +157,7 @@ import com.android.internal.util.IndentingPrintWriter; import com.android.internal.util.Preconditions; import com.android.modules.utils.TypedXmlPullParser; import com.android.modules.utils.TypedXmlSerializer; +import com.android.server.memory.ZramMaintenance; import com.android.server.pm.Installer; import com.android.server.pm.UserManagerInternal; import com.android.server.storage.AppFuseBridge; @@ -933,24 +936,28 @@ class StorageManagerService extends IStorageManager.Stub // Start scheduling nominally-daily fstrim operations MountServiceIdler.scheduleIdlePass(mContext); - // Toggle zram-enable system property in response to settings - mContext.getContentResolver().registerContentObserver( - Settings.Global.getUriFor(Settings.Global.ZRAM_ENABLED), - false /*notifyForDescendants*/, - new ContentObserver(null /* current thread */) { - @Override - public void onChange(boolean selfChange) { - refreshZramSettings(); - } - }); - refreshZramSettings(); + if (mmdEnabled() && MmdProperties.mmd_zram_enabled().orElse(false)) { + ZramMaintenance.startZramMaintenance(mContext); + } else { + // Toggle zram-enable system property in response to settings + mContext.getContentResolver().registerContentObserver( + Settings.Global.getUriFor(Settings.Global.ZRAM_ENABLED), + false /*notifyForDescendants*/, + new ContentObserver(null /* current thread */) { + @Override + public void onChange(boolean selfChange) { + refreshZramSettings(); + } + }); + refreshZramSettings(); - // Schedule zram writeback unless zram is disabled by persist.sys.zram_enabled - String zramPropValue = SystemProperties.get(ZRAM_ENABLED_PROPERTY); - if (!zramPropValue.equals("0") - && mContext.getResources().getBoolean( + // Schedule zram writeback unless zram is disabled by persist.sys.zram_enabled + String zramPropValue = SystemProperties.get(ZRAM_ENABLED_PROPERTY); + if (!zramPropValue.equals("0") + && mContext.getResources().getBoolean( com.android.internal.R.bool.config_zramWriteback)) { - ZramWriteback.scheduleZramWriteback(mContext); + ZramWriteback.scheduleZramWriteback(mContext); + } } configureTranscoding(); diff --git a/services/core/java/com/android/server/SystemTimeZone.java b/services/core/java/com/android/server/SystemTimeZone.java index dd07081bda12..c8810f672320 100644 --- a/services/core/java/com/android/server/SystemTimeZone.java +++ b/services/core/java/com/android/server/SystemTimeZone.java @@ -133,6 +133,7 @@ public final class SystemTimeZone { boolean timeZoneChanged = false; synchronized (SystemTimeZone.class) { String currentTimeZoneId = getTimeZoneId(); + @TimeZoneConfidence int currentConfidence = getTimeZoneConfidence(); if (currentTimeZoneId == null || !currentTimeZoneId.equals(timeZoneId)) { SystemProperties.set(TIME_ZONE_SYSTEM_PROPERTY, timeZoneId); if (DEBUG) { @@ -145,6 +146,8 @@ public final class SystemTimeZone { String logMsg = "Time zone or confidence set: " + " (new) timeZoneId=" + timeZoneId + ", (new) confidence=" + confidence + + ", (old) timeZoneId=" + currentTimeZoneId + + ", (old) confidence=" + currentConfidence + ", logInfo=" + logInfo; addDebugLogEntry(logMsg); } diff --git a/services/core/java/com/android/server/am/ActivityManagerService.java b/services/core/java/com/android/server/am/ActivityManagerService.java index cd929c1883d0..ce8dd66c1011 100644 --- a/services/core/java/com/android/server/am/ActivityManagerService.java +++ b/services/core/java/com/android/server/am/ActivityManagerService.java @@ -12851,6 +12851,28 @@ public class ActivityManagerService extends IActivityManager.Stub } } + final long kernelCmaUsage = Debug.getKernelCmaUsageKb(); + if (kernelCmaUsage >= 0) { + pw.print(" Kernel CMA: "); + pw.println(stringifyKBSize(kernelCmaUsage)); + // CMA memory can be in one of the following four states: + // + // 1. Free, in which case it is accounted for as part of MemFree, which + // is already considered in the lostRAM calculation below. + // + // 2. Allocated as part of a userspace allocated, in which case it is + // already accounted for in the total PSS value that was computed. + // + // 3. Allocated for storing compressed memory (ZRAM) on Android kernels. + // This is accounted for by calculating the amount of memory ZRAM + // consumes and including it in the lostRAM calculuation. + // + // 4. Allocated by a kernel driver, in which case, it is currently not + // attributed to any term that has been derived thus far. Since the + // allocations come from a kernel driver, add it to kernelUsed. + kernelUsed += kernelCmaUsage; + } + // Note: ION/DMA-BUF heap pools are reclaimable and hence, they are included as part of // memInfo.getCachedSizeKb(). final long lostRAM = memInfo.getTotalSizeKb() @@ -13368,12 +13390,32 @@ public class ActivityManagerService extends IActivityManager.Stub proto.write(MemInfoDumpProto.CACHED_KERNEL_KB, memInfo.getCachedSizeKb()); proto.write(MemInfoDumpProto.FREE_KB, memInfo.getFreeSizeKb()); } + // CMA memory can be in one of the following four states: + // + // 1. Free, in which case it is accounted for as part of MemFree, which + // is already considered in the lostRAM calculation below. + // + // 2. Allocated as part of a userspace allocated, in which case it is + // already accounted for in the total PSS value that was computed. + // + // 3. Allocated for storing compressed memory (ZRAM) on Android Kernels. + // This is accounted for by calculating hte amount of memory ZRAM + // consumes and including it in the lostRAM calculation. + // + // 4. Allocated by a kernel driver, in which case, it is currently not + // attributed to any term that has been derived thus far, so subtract + // it from lostRAM. + long kernelCmaUsage = Debug.getKernelCmaUsageKb(); + if (kernelCmaUsage < 0) { + kernelCmaUsage = 0; + } long lostRAM = memInfo.getTotalSizeKb() - (ss[INDEX_TOTAL_PSS] - ss[INDEX_TOTAL_SWAP_PSS]) - memInfo.getFreeSizeKb() - memInfo.getCachedSizeKb() // NR_SHMEM is subtracted twice (getCachedSizeKb() and getKernelUsedSizeKb()) + memInfo.getShmemSizeKb() - - memInfo.getKernelUsedSizeKb() - memInfo.getZramTotalSizeKb(); + - memInfo.getKernelUsedSizeKb() - memInfo.getZramTotalSizeKb() + - kernelCmaUsage; proto.write(MemInfoDumpProto.USED_PSS_KB, ss[INDEX_TOTAL_PSS] - cachedPss); proto.write(MemInfoDumpProto.USED_KERNEL_KB, memInfo.getKernelUsedSizeKb()); proto.write(MemInfoDumpProto.LOST_RAM_KB, lostRAM); diff --git a/services/core/java/com/android/server/am/AppBatteryTracker.java b/services/core/java/com/android/server/am/AppBatteryTracker.java index 374abe0256c1..0bc816e78e7b 100644 --- a/services/core/java/com/android/server/am/AppBatteryTracker.java +++ b/services/core/java/com/android/server/am/AppBatteryTracker.java @@ -818,8 +818,10 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> void dump(PrintWriter pw, String prefix) { pw.print(prefix); pw.println("APP BATTERY STATE TRACKER:"); - // Force an update. - updateBatteryUsageStatsIfNecessary(mInjector.currentTimeMillis(), true); + if (mInjector.getActivityManagerInternal().isBooted()) { + // Force an update. + updateBatteryUsageStatsIfNecessary(mInjector.currentTimeMillis(), true); + } // Force a check. scheduleBgBatteryUsageStatsCheck(); // Wait for its completion (as it runs in handler thread for the sake of thread safe) @@ -878,8 +880,10 @@ final class AppBatteryTracker extends BaseAppStateTracker<AppBatteryPolicy> @Override void dumpAsProto(ProtoOutputStream proto, int uid) { - // Force an update. - updateBatteryUsageStatsIfNecessary(mInjector.currentTimeMillis(), true); + if (mInjector.getActivityManagerInternal().isBooted()) { + // Force an update. + updateBatteryUsageStatsIfNecessary(mInjector.currentTimeMillis(), true); + } synchronized (mLock) { final SparseArray<ImmutableBatteryUsage> uidConsumers = mUidBatteryUsageInWindow; if (uid != android.os.Process.INVALID_UID) { diff --git a/services/core/java/com/android/server/am/ContentProviderHelper.java b/services/core/java/com/android/server/am/ContentProviderHelper.java index 6e09a84e0f8c..e4e53f4124f3 100644 --- a/services/core/java/com/android/server/am/ContentProviderHelper.java +++ b/services/core/java/com/android/server/am/ContentProviderHelper.java @@ -1434,7 +1434,7 @@ public class ContentProviderHelper { } } } - } catch (RemoteException ignored) { + } catch (RemoteException|SecurityException ignored) { } }); } diff --git a/services/core/java/com/android/server/am/OWNERS b/services/core/java/com/android/server/am/OWNERS index 1a6051b6ac9c..4b6d6bc955cc 100644 --- a/services/core/java/com/android/server/am/OWNERS +++ b/services/core/java/com/android/server/am/OWNERS @@ -21,6 +21,7 @@ per-file FgsTempAllowList.java = file:/ACTIVITY_MANAGER_OWNERS per-file HostingRecord.java = file:/ACTIVITY_MANAGER_OWNERS per-file App*ExitInfo* = file:/ACTIVITY_MANAGER_OWNERS per-file appexitinfo.proto = file:/ACTIVITY_MANAGER_OWNERS +per-file UidObserverController* = file:/ACTIVITY_MANAGER_OWNERS per-file App*StartInfo* = file:/PERFORMANCE_OWNERS per-file appstartinfo.proto = file:/PERFORMANCE_OWNERS @@ -67,7 +68,7 @@ per-file CarUserSwitchingDialog.java = file:platform/packages/services/Car:/OWNE per-file ActivityManager* = file:/ACTIVITY_SECURITY_OWNERS # Aconfig Flags -per-file flags.aconfig = yamasani@google.com, bills@google.com, nalini@google.com +per-file flags.aconfig = yamasani@google.com, nalini@google.com # Londoners michaelwr@google.com #{LAST_RESORT_SUGGESTION} @@ -76,4 +77,4 @@ narayan@google.com #{LAST_RESORT_SUGGESTION} # Default yamasani@google.com hackbod@google.com #{LAST_RESORT_SUGGESTION} -omakoto@google.com #{LAST_RESORT_SUGGESTION}
\ No newline at end of file +omakoto@google.com #{LAST_RESORT_SUGGESTION} diff --git a/services/core/java/com/android/server/am/PhantomProcessList.java b/services/core/java/com/android/server/am/PhantomProcessList.java index 123780fb7567..99bdd10ff71b 100644 --- a/services/core/java/com/android/server/am/PhantomProcessList.java +++ b/services/core/java/com/android/server/am/PhantomProcessList.java @@ -112,23 +112,10 @@ public final class PhantomProcessList { private final ActivityManagerService mService; private final Handler mKillHandler; - private static final int CGROUP_V1 = 0; - private static final int CGROUP_V2 = 1; - private static final String[] CGROUP_PATH_PREFIXES = { - "/acct/uid_" /* cgroup v1 */, - "/sys/fs/cgroup/uid_" /* cgroup v2 */ - }; - private static final String CGROUP_PID_PREFIX = "/pid_"; - private static final String CGROUP_PROCS = "/cgroup.procs"; - - @VisibleForTesting - int mCgroupVersion = CGROUP_V1; - PhantomProcessList(final ActivityManagerService service) { mService = service; mKillHandler = service.mProcessList.sKillHandler; mInjector = new Injector(); - probeCgroupVersion(); } @VisibleForTesting @@ -157,9 +144,15 @@ public final class PhantomProcessList { final int appPid = app.getPid(); InputStream input = mCgroupProcsFds.get(appPid); if (input == null) { - final String path = getCgroupFilePath(app.info.uid, appPid); + String path = null; try { + path = getCgroupFilePath(app.info.uid, appPid); input = mInjector.openCgroupProcs(path); + } catch (IllegalArgumentException e) { + if (DEBUG_PROCESSES) { + Slog.w(TAG, "Unable to obtain cgroup.procs path ", e); + } + return; } catch (FileNotFoundException | SecurityException e) { if (DEBUG_PROCESSES) { Slog.w(TAG, "Unable to open " + path, e); @@ -207,18 +200,9 @@ public final class PhantomProcessList { } } - private void probeCgroupVersion() { - for (int i = CGROUP_PATH_PREFIXES.length - 1; i >= 0; i--) { - if ((new File(CGROUP_PATH_PREFIXES[i] + Process.SYSTEM_UID)).exists()) { - mCgroupVersion = i; - break; - } - } - } - @VisibleForTesting String getCgroupFilePath(int uid, int pid) { - return CGROUP_PATH_PREFIXES[mCgroupVersion] + uid + CGROUP_PID_PREFIX + pid + CGROUP_PROCS; + return nativeGetCgroupProcsPath(uid, pid); } static String getProcessName(int pid) { @@ -630,4 +614,7 @@ public final class PhantomProcessList { return PhantomProcessList.getProcessName(pid); } } + + private static native String nativeGetCgroupProcsPath(int uid, int pid) + throws IllegalArgumentException; } diff --git a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java index 87f87c76725e..2905403931ab 100644 --- a/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java +++ b/services/core/java/com/android/server/am/SettingsToPropertiesMapper.java @@ -115,6 +115,7 @@ public class SettingsToPropertiesMapper { DeviceConfig.NAMESPACE_LMKD_NATIVE, DeviceConfig.NAMESPACE_MEDIA_NATIVE, DeviceConfig.NAMESPACE_MGLRU_NATIVE, + DeviceConfig.NAMESPACE_MMD_NATIVE, DeviceConfig.NAMESPACE_NETD_NATIVE, DeviceConfig.NAMESPACE_NNAPI_NATIVE, DeviceConfig.NAMESPACE_PROFCOLLECT_NATIVE_BOOT, diff --git a/services/core/java/com/android/server/am/UidObserverController.java b/services/core/java/com/android/server/am/UidObserverController.java index 7eeec32cf24a..f13bfac58e77 100644 --- a/services/core/java/com/android/server/am/UidObserverController.java +++ b/services/core/java/com/android/server/am/UidObserverController.java @@ -77,6 +77,7 @@ public class UidObserverController { * This is for verifying the UID report flow. */ private static final boolean VALIDATE_UID_STATES = true; + @GuardedBy("mLock") private final ActiveUids mValidateUids; UidObserverController(@NonNull Handler handler) { @@ -282,31 +283,30 @@ public class UidObserverController { } mUidObservers.finishBroadcast(); - if (VALIDATE_UID_STATES && mUidObservers.getRegisteredCallbackCount() > 0) { - for (int j = 0; j < numUidChanges; ++j) { - final ChangeRecord item = mActiveUidChanges[j]; - if ((item.change & UidRecord.CHANGE_GONE) != 0) { - mValidateUids.remove(item.uid); - } else { - UidRecord validateUid = mValidateUids.get(item.uid); - if (validateUid == null) { - validateUid = new UidRecord(item.uid, null); - mValidateUids.put(item.uid, validateUid); - } - if ((item.change & UidRecord.CHANGE_IDLE) != 0) { - validateUid.setIdle(true); - } else if ((item.change & UidRecord.CHANGE_ACTIVE) != 0) { - validateUid.setIdle(false); + synchronized (mLock) { + if (VALIDATE_UID_STATES && mUidObservers.getRegisteredCallbackCount() > 0) { + for (int j = 0; j < numUidChanges; ++j) { + final ChangeRecord item = mActiveUidChanges[j]; + if ((item.change & UidRecord.CHANGE_GONE) != 0) { + mValidateUids.remove(item.uid); + } else { + UidRecord validateUid = mValidateUids.get(item.uid); + if (validateUid == null) { + validateUid = new UidRecord(item.uid, null); + mValidateUids.put(item.uid, validateUid); + } + if ((item.change & UidRecord.CHANGE_IDLE) != 0) { + validateUid.setIdle(true); + } else if ((item.change & UidRecord.CHANGE_ACTIVE) != 0) { + validateUid.setIdle(false); + } + validateUid.setSetProcState(item.procState); + validateUid.setCurProcState(item.procState); + validateUid.setSetCapability(item.capability); + validateUid.setCurCapability(item.capability); } - validateUid.setSetProcState(item.procState); - validateUid.setCurProcState(item.procState); - validateUid.setSetCapability(item.capability); - validateUid.setCurCapability(item.capability); } } - } - - synchronized (mLock) { for (int j = 0; j < numUidChanges; j++) { final ChangeRecord changeRecord = mActiveUidChanges[j]; changeRecord.isPending = false; @@ -433,7 +433,9 @@ public class UidObserverController { } UidRecord getValidateUidRecord(int uid) { - return mValidateUids.get(uid); + synchronized (mLock) { + return mValidateUids.get(uid); + } } void dump(@NonNull PrintWriter pw, @Nullable String dumpPackage) { @@ -488,12 +490,16 @@ public class UidObserverController { boolean dumpValidateUids(@NonNull PrintWriter pw, @Nullable String dumpPackage, int dumpAppId, @NonNull String header, boolean needSep) { - return mValidateUids.dump(pw, dumpPackage, dumpAppId, header, needSep); + synchronized (mLock) { + return mValidateUids.dump(pw, dumpPackage, dumpAppId, header, needSep); + } } void dumpValidateUidsProto(@NonNull ProtoOutputStream proto, @Nullable String dumpPackage, int dumpAppId, long fieldId) { - mValidateUids.dumpProto(proto, dumpPackage, dumpAppId, fieldId); + synchronized (mLock) { + mValidateUids.dumpProto(proto, dumpPackage, dumpAppId, fieldId); + } } static final class ChangeRecord { diff --git a/services/core/java/com/android/server/app/GameManagerService.java b/services/core/java/com/android/server/app/GameManagerService.java index 6f8dc105850d..c0a97db7275b 100644 --- a/services/core/java/com/android/server/app/GameManagerService.java +++ b/services/core/java/com/android/server/app/GameManagerService.java @@ -1423,10 +1423,10 @@ public final class GameManagerService extends IGameManagerService.Stub { } final GameManagerSettings settings = mSettings.get(userId); // look for the existing GamePackageConfiguration override - configOverride = settings.getConfigOverride(packageName); + configOverride = settings.getConfigOverrideLocked(packageName); if (configOverride == null) { configOverride = new GamePackageConfiguration(packageName); - settings.setConfigOverride(packageName, configOverride); + settings.setConfigOverrideLocked(packageName, configOverride); } } GamePackageConfiguration.GameModeConfiguration internalConfig = @@ -1759,10 +1759,10 @@ public final class GameManagerService extends IGameManagerService.Stub { } final GameManagerSettings settings = mSettings.get(userId); // look for the existing GamePackageConfiguration override - configOverride = settings.getConfigOverride(packageName); + configOverride = settings.getConfigOverrideLocked(packageName); if (configOverride == null) { configOverride = new GamePackageConfiguration(packageName); - settings.setConfigOverride(packageName, configOverride); + settings.setConfigOverrideLocked(packageName, configOverride); } } // modify GameModeConfiguration intervention settings @@ -1801,7 +1801,7 @@ public final class GameManagerService extends IGameManagerService.Stub { } final GameManagerSettings settings = mSettings.get(userId); if (gameModeToReset != -1) { - final GamePackageConfiguration configOverride = settings.getConfigOverride( + final GamePackageConfiguration configOverride = settings.getConfigOverrideLocked( packageName); if (configOverride == null) { return; @@ -1812,10 +1812,10 @@ public final class GameManagerService extends IGameManagerService.Stub { } configOverride.removeModeConfig(gameModeToReset); if (!configOverride.hasActiveGameModeConfig()) { - settings.removeConfigOverride(packageName); + settings.removeConfigOverrideLocked(packageName); } } else { - settings.removeConfigOverride(packageName); + settings.removeConfigOverrideLocked(packageName); } } @@ -2030,7 +2030,7 @@ public final class GameManagerService extends IGameManagerService.Stub { synchronized (mLock) { if (mSettings.containsKey(userId)) { - overrideConfig = mSettings.get(userId).getConfigOverride(packageName); + overrideConfig = mSettings.get(userId).getConfigOverrideLocked(packageName); } } if (overrideConfig == null || config == null) { @@ -2075,7 +2075,7 @@ public final class GameManagerService extends IGameManagerService.Stub { } synchronized (mLock) { if (mSettings.containsKey(userId)) { - mSettings.get(userId).removeGame(packageName); + mSettings.get(userId).removeGameLocked(packageName); } sendUserMessage(userId, WRITE_SETTINGS, Intent.ACTION_PACKAGE_REMOVED, WRITE_DELAY_MILLIS); diff --git a/services/core/java/com/android/server/app/GameManagerSettings.java b/services/core/java/com/android/server/app/GameManagerSettings.java index b084cf3c3b12..c57a1f73d7d7 100644 --- a/services/core/java/com/android/server/app/GameManagerSettings.java +++ b/services/core/java/com/android/server/app/GameManagerSettings.java @@ -116,7 +116,7 @@ public class GameManagerSettings { * Removes all game settings of a given package. * This operation must be synced with an external lock. */ - void removeGame(String packageName) { + void removeGameLocked(String packageName) { mGameModes.remove(packageName); mConfigOverrides.remove(packageName); } @@ -125,7 +125,7 @@ public class GameManagerSettings { * Returns the game config override of a given package or null if absent. * This operation must be synced with an external lock. */ - GamePackageConfiguration getConfigOverride(String packageName) { + GamePackageConfiguration getConfigOverrideLocked(String packageName) { return mConfigOverrides.get(packageName); } @@ -133,7 +133,7 @@ public class GameManagerSettings { * Sets the game config override of a given package. * This operation must be synced with an external lock. */ - void setConfigOverride(String packageName, GamePackageConfiguration configOverride) { + void setConfigOverrideLocked(String packageName, GamePackageConfiguration configOverride) { mConfigOverrides.put(packageName, configOverride); } @@ -141,7 +141,7 @@ public class GameManagerSettings { * Removes the game mode config override of a given package. * This operation must be synced with an external lock. */ - void removeConfigOverride(String packageName) { + void removeConfigOverrideLocked(String packageName) { mConfigOverrides.remove(packageName); } diff --git a/services/core/java/com/android/server/appop/AppOpsService.java b/services/core/java/com/android/server/appop/AppOpsService.java index 06c586f5e9c2..144799383fbb 100644 --- a/services/core/java/com/android/server/appop/AppOpsService.java +++ b/services/core/java/com/android/server/appop/AppOpsService.java @@ -2587,7 +2587,6 @@ public class AppOpsService extends IAppOpsService.Stub { Map<String, Ops> packages = uidState.pkgOps; Iterator<Map.Entry<String, Ops>> it = packages.entrySet().iterator(); - boolean uidChanged = false; while (it.hasNext()) { Map.Entry<String, Ops> ent = it.next(); String packageName = ent.getKey(); @@ -2620,7 +2619,6 @@ public class AppOpsService extends IAppOpsService.Stub { newMode, UserHandle.getUserId(curOp.uid)); changed = true; - uidChanged = true; final int uid = curOp.uidState.uid; callbacks = addCallbacks(callbacks, curOp.op, uid, packageName, previousMode, mOpModeWatchers.get(curOp.op)); diff --git a/services/core/java/com/android/server/audio/AudioService.java b/services/core/java/com/android/server/audio/AudioService.java index 09b8e212bfad..3cc89a5744c7 100644 --- a/services/core/java/com/android/server/audio/AudioService.java +++ b/services/core/java/com/android/server/audio/AudioService.java @@ -11820,7 +11820,7 @@ public class AudioService extends IAudioService.Stub private AudioDeviceAttributes anonymizeAudioDeviceAttributesUnchecked( AudioDeviceAttributes ada) { - if (!AudioSystem.isBluetoothDevice(ada.getInternalType())) { + if (ada == null || !AudioSystem.isBluetoothDevice(ada.getInternalType())) { return ada; } AudioDeviceAttributes res = new AudioDeviceAttributes(ada); @@ -12928,10 +12928,10 @@ public class AudioService extends IAudioService.Stub int uid = intent.getIntExtra(Intent.EXTRA_UID, Process.INVALID_UID); if (intent.getBooleanExtra(EXTRA_REPLACING, false) || intent.getBooleanExtra(EXTRA_ARCHIVAL, false)) return; - if (action.equals(ACTION_PACKAGE_ADDED)) { + if (ACTION_PACKAGE_ADDED.equals(action)) { audioserverExecutor.execute(() -> provider.onModifyPackageState(uid, pkgName, false /* isRemoved */)); - } else if (action.equals(ACTION_PACKAGE_REMOVED)) { + } else if (ACTION_PACKAGE_REMOVED.equals(action)) { audioserverExecutor.execute(() -> provider.onModifyPackageState(uid, pkgName, true /* isRemoved */)); } @@ -14575,6 +14575,7 @@ public class AudioService extends IAudioService.Stub for (AudioMix mix : mMixes) { mix.setVirtualDeviceId(mAttributionSource.getDeviceId()); } + mAudioSystem.registerPolicyMixes(mMixes, false); return mAudioSystem.registerPolicyMixes(mMixes, true); } finally { Binder.restoreCallingIdentity(identity); @@ -15099,11 +15100,13 @@ public class AudioService extends IAudioService.Stub final String key = "additional_output_device_delay"; final String reply = AudioSystem.getParameters( key + "=" + device.getInternalType() + "," + device.getAddress()); - long delayMillis; - try { - delayMillis = Long.parseLong(reply.substring(key.length() + 1)); - } catch (NullPointerException e) { - delayMillis = 0; + long delayMillis = 0; + if (reply.contains(key)) { + try { + delayMillis = Long.parseLong(reply.substring(key.length() + 1)); + } catch (NullPointerException e) { + delayMillis = 0; + } } return delayMillis; } @@ -15129,11 +15132,13 @@ public class AudioService extends IAudioService.Stub final String key = "max_additional_output_device_delay"; final String reply = AudioSystem.getParameters( key + "=" + device.getInternalType() + "," + device.getAddress()); - long delayMillis; - try { - delayMillis = Long.parseLong(reply.substring(key.length() + 1)); - } catch (NullPointerException e) { - delayMillis = 0; + long delayMillis = 0; + if (reply.contains(key)) { + try { + delayMillis = Long.parseLong(reply.substring(key.length() + 1)); + } catch (NullPointerException e) { + delayMillis = 0; + } } return delayMillis; } diff --git a/services/core/java/com/android/server/audio/FadeOutManager.java b/services/core/java/com/android/server/audio/FadeOutManager.java index 4d5bce559a91..fedfe511b747 100644 --- a/services/core/java/com/android/server/audio/FadeOutManager.java +++ b/services/core/java/com/android/server/audio/FadeOutManager.java @@ -199,7 +199,9 @@ public final class FadeOutManager { for (AudioPlaybackConfiguration apc : players) { final VolumeShaper.Configuration volShaper = mFadeConfigurations.getFadeOutVolumeShaperConfig(apc.getAudioAttributes()); - fa.addFade(apc, /* skipRamp= */ false, volShaper); + if (volShaper != null) { + fa.addFade(apc, /* skipRamp= */ false, volShaper); + } } } } @@ -249,7 +251,7 @@ public final class FadeOutManager { final VolumeShaper.Configuration volShaper = mFadeConfigurations.getFadeOutVolumeShaperConfig(apc.getAudioAttributes()); final FadedOutApp fa = mUidToFadedAppsMap.get(apc.getClientUid()); - if (fa == null) { + if (fa == null || volShaper == null) { return; } fa.addFade(apc, /* skipRamp= */ true, volShaper); diff --git a/services/core/java/com/android/server/biometrics/AuthService.java b/services/core/java/com/android/server/biometrics/AuthService.java index 2d802b21cf03..b6768c9c087a 100644 --- a/services/core/java/com/android/server/biometrics/AuthService.java +++ b/services/core/java/com/android/server/biometrics/AuthService.java @@ -38,7 +38,6 @@ import android.hardware.biometrics.AuthenticationStateListener; import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricManager; import android.hardware.biometrics.ComponentInfoInternal; -import android.hardware.biometrics.Flags; import android.hardware.biometrics.IAuthService; import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback; import android.hardware.biometrics.IBiometricService; @@ -399,12 +398,6 @@ public class AuthService extends SystemService { final long identity = Binder.clearCallingIdentity(); try { - // We can't do this above because we need the READ_DEVICE_CONFIG permission, which - // the calling user may not possess. - if (!Flags.lastAuthenticationTime()) { - throw new UnsupportedOperationException(); - } - return mBiometricService.getLastAuthenticationTime(userId, authenticators); } finally { Binder.restoreCallingIdentity(identity); diff --git a/services/core/java/com/android/server/biometrics/BiometricService.java b/services/core/java/com/android/server/biometrics/BiometricService.java index b365ef7ff61c..402448209860 100644 --- a/services/core/java/com/android/server/biometrics/BiometricService.java +++ b/services/core/java/com/android/server/biometrics/BiometricService.java @@ -43,7 +43,6 @@ import android.hardware.biometrics.BiometricAuthenticator; import android.hardware.biometrics.BiometricConstants; import android.hardware.biometrics.BiometricPrompt; import android.hardware.biometrics.BiometricStateListener; -import android.hardware.biometrics.Flags; import android.hardware.biometrics.IBiometricAuthenticator; import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback; import android.hardware.biometrics.IBiometricSensorReceiver; @@ -100,8 +99,8 @@ import java.util.List; import java.util.Map; import java.util.Random; import java.util.Set; -import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.CopyOnWriteArrayList; +import java.util.concurrent.atomic.AtomicLong; import java.util.function.Supplier; /** @@ -810,10 +809,6 @@ public class BiometricService extends SystemService { int userId, @Authenticators.Types int authenticators) { super.getLastAuthenticationTime_enforcePermission(); - if (!Flags.lastAuthenticationTime()) { - throw new UnsupportedOperationException(); - } - Slogf.d(TAG, "getLastAuthenticationTime(userId=%d, authenticators=0x%x)", userId, authenticators); diff --git a/services/core/java/com/android/server/compat/CompatConfig.java b/services/core/java/com/android/server/compat/CompatConfig.java index e89f43bd7196..20c33275b8f1 100644 --- a/services/core/java/com/android/server/compat/CompatConfig.java +++ b/services/core/java/com/android/server/compat/CompatConfig.java @@ -876,7 +876,28 @@ final class CompatConfig { } @Nullable + @android.ravenwood.annotation.RavenwoodReplace( + blockedBy = PackageManager.class, + reason = "PackageManager.getApplicationInfo() isn't supported yet") private Long getVersionCodeOrNull(String packageName) { + return getVersionCodeOrNullImpl(packageName); + } + + @SuppressWarnings("unused") + @Nullable + private Long getVersionCodeOrNull$ravenwood(String packageName) { + try { + // It's possible that the context is mocked, try the real method first + return getVersionCodeOrNullImpl(packageName); + } catch (Throwable e) { + // For now, Ravenwood doesn't support the concept of "app updates", so let's + // just use a fixed version code for all packages. + return 1L; + } + } + + @Nullable + private Long getVersionCodeOrNullImpl(String packageName) { try { ApplicationInfo applicationInfo = mContext.getPackageManager().getApplicationInfo( packageName, MATCH_ANY_USER); diff --git a/services/core/java/com/android/server/connectivity/Vpn.java b/services/core/java/com/android/server/connectivity/Vpn.java index 4c5f65285a9e..ac0892b92646 100644 --- a/services/core/java/com/android/server/connectivity/Vpn.java +++ b/services/core/java/com/android/server/connectivity/Vpn.java @@ -1960,6 +1960,10 @@ public class Vpn { public void onUserAdded(int userId) { // If the user is restricted tie them to the parent user's VPN UserInfo user = mUserManager.getUserInfo(userId); + if (user == null) { + Log.e(TAG, "Can not retrieve UserInfo for userId=" + userId); + return; + } if (user.isRestricted() && user.restrictedProfileParentId == mUserId) { synchronized(Vpn.this) { final Set<Range<Integer>> existingRanges = mNetworkCapabilities.getUids(); @@ -1989,6 +1993,14 @@ public class Vpn { public void onUserRemoved(int userId) { // clean up if restricted UserInfo user = mUserManager.getUserInfo(userId); + // TODO: Retrieving UserInfo upon receiving the USER_REMOVED intent is not guaranteed. + // This could prevent the removal of associated ranges. To ensure proper range removal, + // store the user info when adding ranges. This allows using the user ID in the + // USER_REMOVED intent to handle the removal process. + if (user == null) { + Log.e(TAG, "Can not retrieve UserInfo for userId=" + userId); + return; + } if (user.isRestricted() && user.restrictedProfileParentId == mUserId) { synchronized(Vpn.this) { final Set<Range<Integer>> existingRanges = mNetworkCapabilities.getUids(); diff --git a/services/core/java/com/android/server/crashrecovery/OWNERS b/services/core/java/com/android/server/crashrecovery/OWNERS index daa02111f71f..02df9860030d 100644 --- a/services/core/java/com/android/server/crashrecovery/OWNERS +++ b/services/core/java/com/android/server/crashrecovery/OWNERS @@ -1,3 +1,2 @@ -ancr@google.com harshitmahajan@google.com robertogil@google.com diff --git a/services/core/java/com/android/server/display/LocalDisplayAdapter.java b/services/core/java/com/android/server/display/LocalDisplayAdapter.java index d37dd3018fde..798f4d9abeff 100644 --- a/services/core/java/com/android/server/display/LocalDisplayAdapter.java +++ b/services/core/java/com/android/server/display/LocalDisplayAdapter.java @@ -50,7 +50,6 @@ import android.view.RoundedCorners; import android.view.SurfaceControl; import com.android.internal.R; -import com.android.internal.annotations.KeepForWeakReference; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.display.BrightnessSynchronizer; import com.android.internal.util.function.pooled.PooledLambda; @@ -764,6 +763,11 @@ final class LocalDisplayAdapter extends DisplayAdapter { if (isDisplayPrivate(physicalAddress)) { mInfo.flags |= DisplayDeviceInfo.FLAG_PRIVATE; } + + if (isDisplayStealTopFocusDisabled(physicalAddress)) { + mInfo.flags |= DisplayDeviceInfo.FLAG_OWN_FOCUS; + mInfo.flags |= DisplayDeviceInfo.FLAG_STEAL_TOP_FOCUS_DISABLED; + } } if (DisplayCutout.getMaskBuiltInDisplayCutout(res, mInfo.uniqueId)) { @@ -1022,7 +1026,9 @@ final class LocalDisplayAdapter extends DisplayAdapter { void handleHdrSdrNitsChanged(float displayNits, float sdrNits) { final float newHdrSdrRatio; - if (displayNits != INVALID_NITS && sdrNits != INVALID_NITS) { + if (displayNits != INVALID_NITS && sdrNits != INVALID_NITS + && (mBacklightAdapter.mUseSurfaceControlBrightness || + mBacklightAdapter.mForceSurfaceControl)) { // Ensure the ratio stays >= 1.0f as values below that are nonsensical newHdrSdrRatio = Math.max(1.f, displayNits / sdrNits); } else { @@ -1450,6 +1456,23 @@ final class LocalDisplayAdapter extends DisplayAdapter { } return false; } + + private boolean isDisplayStealTopFocusDisabled(DisplayAddress.Physical physicalAddress) { + if (physicalAddress == null) { + return false; + } + final Resources res = getOverlayContext().getResources(); + int[] ports = res.getIntArray(R.array.config_localNotStealTopFocusDisplayPorts); + if (ports != null) { + int port = physicalAddress.getPort(); + for (int p : ports) { + if (p == port) { + return true; + } + } + } + return false; + } } private boolean hdrTypesEqual(int[] modeHdrTypes, int[] recordHdrTypes) { @@ -1501,9 +1524,7 @@ final class LocalDisplayAdapter extends DisplayAdapter { } public static class Injector { - // Ensure the callback is kept to preserve native weak reference lifecycle semantics. @SuppressWarnings("unused") - @KeepForWeakReference private ProxyDisplayEventReceiver mReceiver; public void setDisplayEventListenerLocked(Looper looper, DisplayEventListener listener) { mReceiver = new ProxyDisplayEventReceiver(looper, listener); diff --git a/services/core/java/com/android/server/display/color/OWNERS b/services/core/java/com/android/server/display/color/OWNERS index 27adf127d880..8f5a9a0c10eb 100644 --- a/services/core/java/com/android/server/display/color/OWNERS +++ b/services/core/java/com/android/server/display/color/OWNERS @@ -1,4 +1,3 @@ christyfranks@google.com -justinklaassen@google.com -per-file DisplayTransformManager.java=michaelwr@google.com
\ No newline at end of file +per-file DisplayTransformManager.java=michaelwr@google.com diff --git a/services/core/java/com/android/server/infra/OWNERS b/services/core/java/com/android/server/infra/OWNERS index 4fea05d295b6..0f0d382e28f8 100644 --- a/services/core/java/com/android/server/infra/OWNERS +++ b/services/core/java/com/android/server/infra/OWNERS @@ -1,3 +1,4 @@ # Bug component: 655446 srazdan@google.com +reemabajwa@google.com diff --git a/services/core/java/com/android/server/inputmethod/OWNERS b/services/core/java/com/android/server/inputmethod/OWNERS index e507c6ba40a1..9d8aef943fa5 100644 --- a/services/core/java/com/android/server/inputmethod/OWNERS +++ b/services/core/java/com/android/server/inputmethod/OWNERS @@ -1,7 +1,6 @@ set noparent roosa@google.com -yukawa@google.com tarandeep@google.com fstern@google.com cosminbaies@google.com diff --git a/services/core/java/com/android/server/integrity/OWNERS b/services/core/java/com/android/server/integrity/OWNERS index 33561fd728f9..352724aa0425 100644 --- a/services/core/java/com/android/server/integrity/OWNERS +++ b/services/core/java/com/android/server/integrity/OWNERS @@ -1,5 +1,4 @@ omernebil@google.com khelmy@google.com mdchurchill@google.com -sturla@google.com diff --git a/services/core/java/com/android/server/locales/LocaleManagerService.java b/services/core/java/com/android/server/locales/LocaleManagerService.java index 7e80cbcb583e..0944a5470ba0 100644 --- a/services/core/java/com/android/server/locales/LocaleManagerService.java +++ b/services/core/java/com/android/server/locales/LocaleManagerService.java @@ -48,7 +48,6 @@ import android.util.AtomicFile; import android.util.Slog; import android.util.Xml; -import com.android.internal.annotations.KeepForWeakReference; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.content.PackageMonitor; import com.android.internal.util.FrameworkStatsLog; @@ -101,7 +100,6 @@ public class LocaleManagerService extends SystemService { private LocaleManagerBackupHelper mBackupHelper; - @KeepForWeakReference private final PackageMonitor mPackageMonitor; private final Object mWriteLock = new Object(); diff --git a/services/core/java/com/android/server/location/fudger/LocationFudger.java b/services/core/java/com/android/server/location/fudger/LocationFudger.java index 0da1514872d6..44eb9063b44e 100644 --- a/services/core/java/com/android/server/location/fudger/LocationFudger.java +++ b/services/core/java/com/android/server/location/fudger/LocationFudger.java @@ -282,6 +282,15 @@ public class LocationFudger { // requires latitude since longitudinal distances change with distance from equator. private static double metersToDegreesLongitude(double distance, double lat) { - return distance / APPROXIMATE_METERS_PER_DEGREE_AT_EQUATOR / Math.cos(Math.toRadians(lat)); + // Needed to convert from longitude distance to longitude degree. + // X meters near the poles is more degrees than at the equator. + double cosLat = Math.cos(Math.toRadians(lat)); + // If we are right on top of the pole, the degree is always 0. + // We return a very small value instead to avoid divide by zero errors + // later on. + if (cosLat == 0.0) { + return 0.0001; + } + return distance / APPROXIMATE_METERS_PER_DEGREE_AT_EQUATOR / cosLat; } } diff --git a/services/core/java/com/android/server/locksettings/LockSettingsService.java b/services/core/java/com/android/server/locksettings/LockSettingsService.java index c314ab06fbad..a0e543300ce7 100644 --- a/services/core/java/com/android/server/locksettings/LockSettingsService.java +++ b/services/core/java/com/android/server/locksettings/LockSettingsService.java @@ -137,6 +137,7 @@ import com.android.internal.annotations.GuardedBy; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.internal.notification.SystemNotificationChannels; +import com.android.internal.pm.RoSystemFeatures; import com.android.internal.util.ArrayUtils; import com.android.internal.util.DumpUtils; import com.android.internal.util.IndentingPrintWriter; @@ -369,16 +370,7 @@ public class LockSettingsService extends ILockSettings.Stub { @Override public void onBootPhase(int phase) { super.onBootPhase(phase); - if (phase == PHASE_ACTIVITY_MANAGER_READY) { - mLockSettingsService.migrateOldDataAfterSystemReady(); - mLockSettingsService.deleteRepairModePersistentDataIfNeeded(); - } else if (phase == PHASE_BOOT_COMPLETED) { - // In the case of an upgrade, PHASE_BOOT_COMPLETED means that a rollback to the old - // build can no longer occur. This is the time to destroy any migrated protectors. - mLockSettingsService.destroyMigratedProtectors(); - - mLockSettingsService.loadEscrowData(); - } + mLockSettingsService.onBootPhase(phase); } @Override @@ -397,6 +389,21 @@ public class LockSettingsService extends ILockSettings.Stub { } } + private void onBootPhase(int phase) { + if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) { + migrateOldDataAfterSystemReady(); + deleteRepairModePersistentDataIfNeeded(); + } else if (phase == SystemService.PHASE_BOOT_COMPLETED) { + mHandler.post(() -> { + // In the case of an upgrade, PHASE_BOOT_COMPLETED means that a rollback to the old + // build can no longer occur. This is the time to destroy any migrated protectors. + destroyMigratedProtectors(); + + loadEscrowData(); + }); + } + } + @VisibleForTesting protected static class SynchronizedStrongAuthTracker extends LockPatternUtils.StrongAuthTracker { @@ -432,9 +439,9 @@ public class LockSettingsService extends ILockSettings.Stub { } LockscreenCredential credential = LockscreenCredential.createUnifiedProfilePassword(newPassword); - Arrays.fill(newPasswordChars, '\u0000'); - Arrays.fill(newPassword, (byte) 0); - Arrays.fill(randomLockSeed, (byte) 0); + LockPatternUtils.zeroize(newPasswordChars); + LockPatternUtils.zeroize(newPassword); + LockPatternUtils.zeroize(randomLockSeed); return credential; } @@ -445,6 +452,7 @@ public class LockSettingsService extends ILockSettings.Stub { * @param profileUserId profile user Id * @param profileUserPassword profile original password (when it has separated lock). */ + @GuardedBy("mSpManager") private void tieProfileLockIfNecessary(int profileUserId, LockscreenCredential profileUserPassword) { // Only for profiles that shares credential with parent @@ -903,14 +911,8 @@ public class LockSettingsService extends ILockSettings.Stub { // Hide notification first, as tie profile lock takes time hideEncryptionNotification(new UserHandle(userId)); - if (android.app.admin.flags.Flags.fixRaceConditionInTieProfileLock()) { - synchronized (mSpManager) { - tieProfileLockIfNecessary(userId, LockscreenCredential.createNone()); - } - } else { - if (isCredentialSharableWithParent(userId)) { - tieProfileLockIfNecessary(userId, LockscreenCredential.createNone()); - } + synchronized (mSpManager) { + tieProfileLockIfNecessary(userId, LockscreenCredential.createNone()); } } }); @@ -1324,7 +1326,7 @@ public class LockSettingsService extends ILockSettings.Stub { mContext.enforceCallingOrSelfPermission( Manifest.permission.MANAGE_WEAK_ESCROW_TOKEN, "Requires MANAGE_WEAK_ESCROW_TOKEN permission."); - if (!mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) { + if (!RoSystemFeatures.hasFeatureAutomotive(mContext)) { throw new IllegalArgumentException( "Weak escrow token are only for automotive devices."); } @@ -1374,11 +1376,7 @@ public class LockSettingsService extends ILockSettings.Stub { mStorage.removeChildProfileLock(userId); removeKeystoreProfileKey(userId); } else { - if (android.app.admin.flags.Flags.fixRaceConditionInTieProfileLock()) { - synchronized (mSpManager) { - tieProfileLockIfNecessary(userId, profileUserPassword); - } - } else { + synchronized (mSpManager) { tieProfileLockIfNecessary(userId, profileUserPassword); } } @@ -1540,7 +1538,7 @@ public class LockSettingsService extends ILockSettings.Stub { + userId); } } finally { - Arrays.fill(password, (byte) 0); + LockPatternUtils.zeroize(password); } } @@ -1573,7 +1571,7 @@ public class LockSettingsService extends ILockSettings.Stub { decryptionResult = cipher.doFinal(encryptedPassword); LockscreenCredential credential = LockscreenCredential.createUnifiedProfilePassword( decryptionResult); - Arrays.fill(decryptionResult, (byte) 0); + LockPatternUtils.zeroize(decryptionResult); try { long parentSid = getGateKeeperService().getSecureUserId( mUserManager.getProfileParent(userId).id); @@ -2266,7 +2264,7 @@ public class LockSettingsService extends ILockSettings.Stub { } catch (RemoteException e) { Slogf.wtf(TAG, e, "Failed to unlock CE storage for %s user %d", userType, userId); } finally { - Arrays.fill(secret, (byte) 0); + LockPatternUtils.zeroize(secret); } } @@ -3616,7 +3614,7 @@ public class LockSettingsService extends ILockSettings.Stub { } // Escrow tokens are enabled on automotive builds. - if (mContext.getPackageManager().hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) { + if (RoSystemFeatures.hasFeatureAutomotive(mContext)) { return; } diff --git a/services/core/java/com/android/server/locksettings/UnifiedProfilePasswordCache.java b/services/core/java/com/android/server/locksettings/UnifiedProfilePasswordCache.java index 21caf76d30d0..3d64f1890073 100644 --- a/services/core/java/com/android/server/locksettings/UnifiedProfilePasswordCache.java +++ b/services/core/java/com/android/server/locksettings/UnifiedProfilePasswordCache.java @@ -26,6 +26,7 @@ import android.util.SparseArray; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.util.ArrayUtils; +import com.android.internal.widget.LockPatternUtils; import com.android.internal.widget.LockscreenCredential; import java.security.GeneralSecurityException; @@ -154,7 +155,7 @@ public class UnifiedProfilePasswordCache { } LockscreenCredential result = LockscreenCredential.createUnifiedProfilePassword(credential); - Arrays.fill(credential, (byte) 0); + LockPatternUtils.zeroize(credential); return result; } } @@ -175,7 +176,7 @@ public class UnifiedProfilePasswordCache { Slog.d(TAG, "Cannot delete key", e); } if (mEncryptedPasswords.contains(userId)) { - Arrays.fill(mEncryptedPasswords.get(userId), (byte) 0); + LockPatternUtils.zeroize(mEncryptedPasswords.get(userId)); mEncryptedPasswords.remove(userId); } } diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java index bf1b3c3f0b35..85dc811a7811 100644 --- a/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/KeySyncTask.java @@ -162,7 +162,7 @@ public class KeySyncTask implements Runnable { Log.e(TAG, "Unexpected exception thrown during KeySyncTask", e); } finally { if (mCredential != null) { - Arrays.fill(mCredential, (byte) 0); // no longer needed. + LockPatternUtils.zeroize(mCredential); // no longer needed. } } } @@ -506,7 +506,7 @@ public class KeySyncTask implements Runnable { try { byte[] hash = MessageDigest.getInstance(LOCK_SCREEN_HASH_ALGORITHM).digest(bytes); - Arrays.fill(bytes, (byte) 0); + LockPatternUtils.zeroize(bytes); return hash; } catch (NoSuchAlgorithmException e) { // Impossible, SHA-256 must be supported on Android. diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/OWNERS b/services/core/java/com/android/server/locksettings/recoverablekeystore/OWNERS index bb487fb52c9f..ebf7e6bed064 100644 --- a/services/core/java/com/android/server/locksettings/recoverablekeystore/OWNERS +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/OWNERS @@ -1,4 +1,3 @@ aseemk@google.com bozhu@google.com dementyev@google.com -robertberry@google.com diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java index 54303c01890a..7d8300a8148a 100644 --- a/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManager.java @@ -1082,7 +1082,7 @@ public class RecoverableKeyStoreManager { int keyguardCredentialsType = lockPatternUtilsToKeyguardType(savedCredentialType); try (LockscreenCredential credential = createLockscreenCredential(keyguardCredentialsType, decryptedCredentials)) { - Arrays.fill(decryptedCredentials, (byte) 0); + LockPatternUtils.zeroize(decryptedCredentials); decryptedCredentials = null; VerifyCredentialResponse verifyResponse = lockSettingsService.verifyCredential(credential, userId, 0); diff --git a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverySessionStorage.java b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverySessionStorage.java index 0e66746f4160..f1ef333d223a 100644 --- a/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverySessionStorage.java +++ b/services/core/java/com/android/server/locksettings/recoverablekeystore/storage/RecoverySessionStorage.java @@ -19,8 +19,9 @@ package com.android.server.locksettings.recoverablekeystore.storage; import android.annotation.Nullable; import android.util.SparseArray; +import com.android.internal.widget.LockPatternUtils; + import java.util.ArrayList; -import java.util.Arrays; import javax.security.auth.Destroyable; @@ -187,8 +188,8 @@ public class RecoverySessionStorage implements Destroyable { */ @Override public void destroy() { - Arrays.fill(mLskfHash, (byte) 0); - Arrays.fill(mKeyClaimant, (byte) 0); + LockPatternUtils.zeroize(mLskfHash); + LockPatternUtils.zeroize(mKeyClaimant); } } } diff --git a/services/core/java/com/android/server/logcat/OWNERS b/services/core/java/com/android/server/logcat/OWNERS index 33e1873d91fa..2913cc9bf19e 100644 --- a/services/core/java/com/android/server/logcat/OWNERS +++ b/services/core/java/com/android/server/logcat/OWNERS @@ -3,6 +3,5 @@ cbrubaker@google.com eunjeongshin@google.com georgechan@google.com -jsharkey@google.com wenhaowang@google.com xiaozhenl@google.com diff --git a/services/core/java/com/android/server/media/TEST_MAPPING b/services/core/java/com/android/server/media/TEST_MAPPING index 43e2afd8827d..dbf9915c6e0c 100644 --- a/services/core/java/com/android/server/media/TEST_MAPPING +++ b/services/core/java/com/android/server/media/TEST_MAPPING @@ -1,7 +1,10 @@ { "presubmit": [ { - "name": "CtsMediaBetterTogetherTestCases" + "name": "CtsMediaRouterTestCases" + }, + { + "name": "CtsMediaSessionTestCases" }, { "name": "MediaRouterServiceTests" diff --git a/services/core/java/com/android/server/memory/OWNERS b/services/core/java/com/android/server/memory/OWNERS new file mode 100644 index 000000000000..dc0e89892e43 --- /dev/null +++ b/services/core/java/com/android/server/memory/OWNERS @@ -0,0 +1,3 @@ +include /MEMORY_OWNERS + +per-file ZramMaintenance.java = kawasin@google.com diff --git a/services/core/java/com/android/server/memory/ZramMaintenance.java b/services/core/java/com/android/server/memory/ZramMaintenance.java new file mode 100644 index 000000000000..560d2d741dd9 --- /dev/null +++ b/services/core/java/com/android/server/memory/ZramMaintenance.java @@ -0,0 +1,172 @@ +/* + * Copyright (C) 2024 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.memory; + +import android.app.job.JobInfo; +import android.app.job.JobParameters; +import android.app.job.JobScheduler; +import android.app.job.JobService; +import android.content.ComponentName; +import android.content.Context; +import android.os.IBinder; +import android.os.IMmd; +import android.os.PersistableBundle; +import android.os.RemoteException; +import android.os.ServiceManager; +import android.os.SystemProperties; +import android.provider.DeviceConfig; +import android.util.Slog; + +import com.android.internal.annotations.VisibleForTesting; + +import java.time.Duration; + +/** + * Schedules zram maintenance (e.g. zram writeback, zram recompression). + * + * <p>ZramMaintenance notifies mmd the good timing to execute zram maintenance based on: + * + * <ul> + * <li>Enough interval has passed. + * <li>The system is idle. + * <li>The battery is not low. + * </ul> + */ +public class ZramMaintenance extends JobService { + private static final String TAG = ZramMaintenance.class.getName(); + // Job id must be unique across all clients of the same uid. ZramMaintenance uses the bug number + // as the job id. + @VisibleForTesting + public static final int JOB_ID = 375432472; + private static final ComponentName sZramMaintenance = + new ComponentName("android", ZramMaintenance.class.getName()); + @VisibleForTesting + public static final String KEY_CHECK_STATUS = "check_status"; + + private static final String SYSTEM_PROPERTY_PREFIX = "mm."; + private static final String FIRST_DELAY_SECONDS_PROP = + "zram.maintenance.first_delay_seconds"; + // The default is 1 hour. + private static final long DEFAULT_FIRST_DELAY_SECONDS = 3600; + private static final String PERIODIC_DELAY_SECONDS_PROP = + "zram.maintenance.periodic_delay_seconds"; + // The default is 1 hour. + private static final long DEFAULT_PERIODIC_DELAY_SECONDS = 3600; + private static final String REQUIRE_DEVICE_IDLE_PROP = + "zram.maintenance.require_device_idle"; + private static final boolean DEFAULT_REQUIRE_DEVICE_IDLE = + true; + private static final String REQUIRE_BATTERY_NOT_LOW_PROP = + "zram.maintenance.require_battery_not_low"; + private static final boolean DEFAULT_REQUIRE_BATTERY_NOT_LOW = + true; + + @Override + public boolean onStartJob(JobParameters params) { + new Thread("ZramMaintenance") { + @Override + public void run() { + try { + IBinder binder = ServiceManager.getService("mmd"); + IMmd mmd = IMmd.Stub.asInterface(binder); + startJob(ZramMaintenance.this, params, mmd); + } finally { + jobFinished(params, false); + } + } + }.start(); + return true; + } + + @Override + public boolean onStopJob(JobParameters params) { + return false; + } + + /** + * This is public to test ZramMaintenance logic. + * + * <p> + * We need to pass mmd as parameter because we can't mock "IMmd.Stub.asInterface". + * + * <p> + * Since IMmd.isZramMaintenanceSupported() is blocking call, this method should be executed on + * a worker thread. + */ + @VisibleForTesting + public static void startJob(Context context, JobParameters params, IMmd mmd) { + boolean checkStatus = params.getExtras().getBoolean(KEY_CHECK_STATUS); + if (mmd != null) { + try { + if (checkStatus && !mmd.isZramMaintenanceSupported()) { + Slog.i(TAG, "zram maintenance is not supported"); + return; + } + // Status check is required before the first doZramMaintenanceAsync() call once. + checkStatus = false; + + mmd.doZramMaintenanceAsync(); + } catch (RemoteException e) { + Slog.e(TAG, "Failed to binder call to mmd", e); + } + } else { + Slog.w(TAG, "binder not found"); + } + Duration delay = Duration.ofSeconds(getLongProperty(PERIODIC_DELAY_SECONDS_PROP, + DEFAULT_PERIODIC_DELAY_SECONDS)); + scheduleZramMaintenance(context, delay, checkStatus); + } + + /** + * Starts periodical zram maintenance. + */ + public static void startZramMaintenance(Context context) { + Duration delay = Duration.ofSeconds( + getLongProperty(FIRST_DELAY_SECONDS_PROP, DEFAULT_FIRST_DELAY_SECONDS)); + scheduleZramMaintenance(context, delay, true); + } + + private static void scheduleZramMaintenance(Context context, Duration delay, + boolean checkStatus) { + JobScheduler js = context.getSystemService(JobScheduler.class); + + if (js != null) { + final PersistableBundle bundle = new PersistableBundle(); + bundle.putBoolean(KEY_CHECK_STATUS, checkStatus); + js.schedule(new JobInfo.Builder(JOB_ID, sZramMaintenance) + .setMinimumLatency(delay.toMillis()) + .setRequiresDeviceIdle( + getBooleanProperty(REQUIRE_DEVICE_IDLE_PROP, + DEFAULT_REQUIRE_DEVICE_IDLE)) + .setRequiresBatteryNotLow( + getBooleanProperty(REQUIRE_BATTERY_NOT_LOW_PROP, + DEFAULT_REQUIRE_BATTERY_NOT_LOW)) + .setExtras(bundle) + .build()); + } + } + + private static long getLongProperty(String name, long defaultValue) { + return DeviceConfig.getLong(DeviceConfig.NAMESPACE_MM, name, + SystemProperties.getLong(SYSTEM_PROPERTY_PREFIX + name, defaultValue)); + } + + private static boolean getBooleanProperty(String name, boolean defaultValue) { + return DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_MM, name, + SystemProperties.getBoolean(SYSTEM_PROPERTY_PREFIX + name, defaultValue)); + } +} diff --git a/services/core/java/com/android/server/notification/OWNERS b/services/core/java/com/android/server/notification/OWNERS index 9f16662fd749..43c68d10b3ce 100644 --- a/services/core/java/com/android/server/notification/OWNERS +++ b/services/core/java/com/android/server/notification/OWNERS @@ -2,8 +2,7 @@ juliacr@google.com yurilin@google.com -aroederer@google.com matiashe@google.com valiiftime@google.com jeffdq@google.com -dsandler@android.com
\ No newline at end of file +dsandler@android.com diff --git a/services/core/java/com/android/server/om/OverlayManagerService.java b/services/core/java/com/android/server/om/OverlayManagerService.java index 6303ecd53dbb..253365fba595 100644 --- a/services/core/java/com/android/server/om/OverlayManagerService.java +++ b/services/core/java/com/android/server/om/OverlayManagerService.java @@ -81,7 +81,6 @@ import android.util.Slog; import android.util.SparseArray; import com.android.internal.annotations.GuardedBy; -import com.android.internal.annotations.KeepForWeakReference; import com.android.internal.content.PackageMonitor; import com.android.internal.content.om.OverlayConfig; import com.android.internal.util.ArrayUtils; @@ -263,7 +262,6 @@ public final class OverlayManagerService extends SystemService { private final OverlayActorEnforcer mActorEnforcer; - @KeepForWeakReference private final PackageMonitor mPackageMonitor = new OverlayManagerPackageMonitor(); private int mPrevStartedUserId = -1; diff --git a/services/core/java/com/android/server/pm/InstallPackageHelper.java b/services/core/java/com/android/server/pm/InstallPackageHelper.java index b48b39c2edd5..502384d81a4a 100644 --- a/services/core/java/com/android/server/pm/InstallPackageHelper.java +++ b/services/core/java/com/android/server/pm/InstallPackageHelper.java @@ -1533,7 +1533,7 @@ final class InstallPackageHelper { boolean systemApp = false; boolean replace = false; synchronized (mPm.mLock) { - final PackageSetting ps = mPm.mSettings.getPackageLPr(pkgName); + PackageSetting ps = mPm.mSettings.getPackageLPr(pkgName); // Check if installing already existing package if ((installFlags & PackageManager.INSTALL_REPLACE_EXISTING) != 0) { String oldName = mPm.mSettings.getRenamedPackageLPr(pkgName); @@ -1544,14 +1544,15 @@ final class InstallPackageHelper { // name. We must continue using the original name, so // rename the new package here. parsedPackage.setPackageName(oldName); - pkgName = parsedPackage.getPackageName(); - replace = true; + pkgName = oldName; + ps = mPm.mSettings.getPackageLPr(oldName); if (DEBUG_INSTALL) { Slog.d(TAG, "Replacing existing renamed package: oldName=" + oldName + " pkgName=" + pkgName); } - } else if (ps != null) { - // This package, under its official name, already exists + } + if (ps != null) { + // This package, under its official name or its old name, already exists // on the device; we should replace it. replace = true; if (DEBUG_INSTALL) Slog.d(TAG, "Replace existing package: " + pkgName); diff --git a/services/core/java/com/android/server/pm/OWNERS b/services/core/java/com/android/server/pm/OWNERS index 62b89f3252e6..f98ec04f84d8 100644 --- a/services/core/java/com/android/server/pm/OWNERS +++ b/services/core/java/com/android/server/pm/OWNERS @@ -1,7 +1,6 @@ hackbod@android.com hackbod@google.com jsharkey@android.com -jsharkey@google.com narayan@google.com include /PACKAGE_MANAGER_OWNERS diff --git a/services/core/java/com/android/server/pm/PackageInstallerSession.java b/services/core/java/com/android/server/pm/PackageInstallerSession.java index 891d66a5d238..c799b8b969c8 100644 --- a/services/core/java/com/android/server/pm/PackageInstallerSession.java +++ b/services/core/java/com/android/server/pm/PackageInstallerSession.java @@ -5218,7 +5218,9 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { "Session " + sessionId + " is a parent of multi-package session and " + "requestUserPreapproval on the parent session isn't supported."); } - + if (statusReceiver == null) { + throw new IllegalArgumentException("Status receiver cannot be null."); + } synchronized (mLock) { assertPreparedAndNotSealedLocked("request of session " + sessionId); mPreapprovalDetails = details; @@ -5571,6 +5573,10 @@ public class PackageInstallerSession extends IPackageInstallerSession.Stub { */ private static void sendOnUserActionRequired(Context context, IntentSender target, int sessionId, Intent intent) { + if (target == null) { + Slog.e(TAG, "Missing receiver for pending user action."); + return; + } final Intent fillIn = new Intent(); fillIn.putExtra(PackageInstaller.EXTRA_SESSION_ID, sessionId); fillIn.putExtra(PackageInstaller.EXTRA_STATUS, PackageInstaller.STATUS_PENDING_USER_ACTION); diff --git a/services/core/java/com/android/server/pm/PackageManagerService.java b/services/core/java/com/android/server/pm/PackageManagerService.java index aadf11227d89..2154d37698a2 100644 --- a/services/core/java/com/android/server/pm/PackageManagerService.java +++ b/services/core/java/com/android/server/pm/PackageManagerService.java @@ -1476,7 +1476,7 @@ public class PackageManagerService implements PackageSender, TestUtilityService ArchiveState archiveState; synchronized (mLock) { PackageSetting ps = mSettings.getPackageLPr(packageName); - if (ps == null) { + if (ps == null || snapshot.shouldFilterApplication(ps, binderUid, userId)) { return null; } var psi = ps.getUserStateOrDefault(userId); @@ -3020,6 +3020,16 @@ public class PackageManagerService implements PackageSender, TestUtilityService mDexOptHelper.performPackageDexOptUpgradeIfNeeded(); } + public void updateMetricsIfNeeded() { + final DisplayManager displayManager = mContext.getSystemService(DisplayManager.class); + if (displayManager != null) { + final Display display = displayManager.getDisplay(Display.DEFAULT_DISPLAY); + if (display != null) { + display.getMetrics(mMetrics); + } + } + } + private void notifyPackageUseInternal(String packageName, int reason) { long time = System.currentTimeMillis(); synchronized (mLock) { @@ -4238,8 +4248,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService CarrierAppUtils.disableCarrierAppsUntilPrivileged( mContext.getOpPackageName(), UserHandle.USER_SYSTEM, mContext); - disableSkuSpecificApps(); - // Read the compatibilty setting when the system is ready. boolean compatibilityModeEnabled = android.provider.Settings.Global.getInt( mContext.getContentResolver(), @@ -4372,29 +4380,6 @@ public class PackageManagerService implements PackageSender, TestUtilityService } } - //TODO: b/111402650 - private void disableSkuSpecificApps() { - String[] apkList = mContext.getResources().getStringArray( - R.array.config_disableApksUnlessMatchedSku_apk_list); - String[] skuArray = mContext.getResources().getStringArray( - R.array.config_disableApkUnlessMatchedSku_skus_list); - if (ArrayUtils.isEmpty(apkList)) { - return; - } - String sku = SystemProperties.get("ro.boot.hardware.sku"); - if (!TextUtils.isEmpty(sku) && ArrayUtils.contains(skuArray, sku)) { - return; - } - final Computer snapshot = snapshotComputer(); - for (String packageName : apkList) { - setSystemAppHiddenUntilInstalled(snapshot, packageName, true); - final List<UserInfo> users = mInjector.getUserManagerInternal().getUsers(false); - for (int i = 0; i < users.size(); i++) { - setSystemAppInstallState(snapshot, packageName, false, users.get(i).id); - } - } - } - public PackageFreezer freezePackage(String packageName, int userId, String killReason, int exitInfoReason, InstallRequest request) { return freezePackage(packageName, userId, killReason, exitInfoReason, request, diff --git a/services/core/java/com/android/server/pm/dex/OWNERS b/services/core/java/com/android/server/pm/dex/OWNERS index 5ca8ddd1fe17..70af4e7d36b2 100644 --- a/services/core/java/com/android/server/pm/dex/OWNERS +++ b/services/core/java/com/android/server/pm/dex/OWNERS @@ -1,4 +1,3 @@ -alanstokes@google.com jiakaiz@google.com ngeoffray@google.com mast@google.com diff --git a/services/core/java/com/android/server/policy/AppOpsPolicy.java b/services/core/java/com/android/server/policy/AppOpsPolicy.java index ecffd382f542..3f9144f0d980 100644 --- a/services/core/java/com/android/server/policy/AppOpsPolicy.java +++ b/services/core/java/com/android/server/policy/AppOpsPolicy.java @@ -136,7 +136,8 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat final LocationManagerInternal locationManagerInternal = LocalServices.getService( LocationManagerInternal.class); - locationManagerInternal.setLocationPackageTagsListener( + if (locationManagerInternal != null) { + locationManagerInternal.setLocationPackageTagsListener( (uid, packageTagsList) -> { synchronized (mLock) { if (packageTagsList.isEmpty()) { @@ -158,6 +159,7 @@ public final class AppOpsPolicy implements AppOpsManagerInternal.CheckOpsDelegat mLocationTags); } }); + } final IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED); diff --git a/services/core/java/com/android/server/power/OWNERS b/services/core/java/com/android/server/power/OWNERS index c1fad33fef0f..a1531a810c3c 100644 --- a/services/core/java/com/android/server/power/OWNERS +++ b/services/core/java/com/android/server/power/OWNERS @@ -2,6 +2,8 @@ michaelwr@google.com santoscordon@google.com petsjonkin@google.com brup@google.com +flc@google.com +wilczynskip@google.com per-file ThermalManagerService.java=file:/THERMAL_OWNERS per-file LowPowerStandbyController.java=qingxun@google.com diff --git a/services/core/java/com/android/server/power/ShutdownCheckPoints.java b/services/core/java/com/android/server/power/ShutdownCheckPoints.java index dafaa7d5f134..399e214aa955 100644 --- a/services/core/java/com/android/server/power/ShutdownCheckPoints.java +++ b/services/core/java/com/android/server/power/ShutdownCheckPoints.java @@ -350,17 +350,23 @@ public final class ShutdownCheckPoints { private final ShutdownCheckPoints mInstance; private final File mBaseFile; + private final File mBaseDir; private final int mFileCountLimit; FileDumperThread(ShutdownCheckPoints instance, File baseFile, int fileCountLimit) { mInstance = instance; mBaseFile = baseFile; + mBaseDir = baseFile.getParentFile(); mFileCountLimit = fileCountLimit; } @Override public void run() { - mBaseFile.getParentFile().mkdirs(); + if (!mBaseDir.exists()) { + mBaseDir.mkdirs(); + mBaseDir.setExecutable(true, false); + mBaseDir.setReadable(true, false); + } File[] checkPointFiles = listCheckPointsFiles(); int filesToDelete = checkPointFiles.length - mFileCountLimit + 1; @@ -375,7 +381,7 @@ public final class ShutdownCheckPoints { private File[] listCheckPointsFiles() { String filePrefix = mBaseFile.getName() + "-"; - File[] files = mBaseFile.getParentFile().listFiles(new FilenameFilter() { + File[] files = mBaseDir.listFiles(new FilenameFilter() { @Override public boolean accept(File dir, String name) { if (!name.startsWith(filePrefix)) { @@ -412,6 +418,7 @@ public final class ShutdownCheckPoints { } } mBaseFile.renameTo(file); + file.setReadable(true, false); } } } diff --git a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java index 6f1810711b3a..0dc8fe19745a 100644 --- a/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java +++ b/services/core/java/com/android/server/power/stats/BatteryStatsImpl.java @@ -749,34 +749,29 @@ public class BatteryStatsImpl extends BatteryStats { @Override public void handleMessage(Message msg) { BatteryCallback cb = mCallback; + if (cb == null) { + return; + } switch (msg.what) { case MSG_REPORT_CPU_UPDATE_NEEDED: - if (cb != null) { - cb.batteryNeedsCpuUpdate(); - } + cb.batteryNeedsCpuUpdate(); break; case MSG_REPORT_POWER_CHANGE: - if (cb != null) { - cb.batteryPowerChanged(msg.arg1 != 0); - } + cb.batteryPowerChanged(msg.arg1 != 0); break; case MSG_REPORT_CHARGING: - if (cb != null) { - final String action; - synchronized (BatteryStatsImpl.this) { - action = mCharging ? BatteryManager.ACTION_CHARGING - : BatteryManager.ACTION_DISCHARGING; - } - Intent intent = new Intent(action); - intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); - cb.batterySendBroadcast(intent); + final String action; + synchronized (BatteryStatsImpl.this) { + action = mCharging ? BatteryManager.ACTION_CHARGING + : BatteryManager.ACTION_DISCHARGING; } + Intent intent = new Intent(action); + intent.addFlags(Intent.FLAG_RECEIVER_REGISTERED_ONLY_BEFORE_BOOT); + cb.batterySendBroadcast(intent); break; case MSG_REPORT_RESET_STATS: - if (cb != null) { - cb.batteryStatsReset(); - } - } + cb.batteryStatsReset(); + } } } diff --git a/services/core/java/com/android/server/power/stats/OWNERS b/services/core/java/com/android/server/power/stats/OWNERS index 4068e2bc03b7..208b2ddb5e54 100644 --- a/services/core/java/com/android/server/power/stats/OWNERS +++ b/services/core/java/com/android/server/power/stats/OWNERS @@ -1 +1,4 @@ +# Bug component: 987260 +set noparent + include /BATTERY_STATS_OWNERS diff --git a/services/core/java/com/android/server/powerstats/PowerStatsLogger.java b/services/core/java/com/android/server/powerstats/PowerStatsLogger.java index e80a86d73f90..4fd026a6dc52 100644 --- a/services/core/java/com/android/server/powerstats/PowerStatsLogger.java +++ b/services/core/java/com/android/server/powerstats/PowerStatsLogger.java @@ -285,14 +285,20 @@ public final class PowerStatsLogger extends Handler { } private void updateCacheFile(String cacheFilename, byte[] data) { + AtomicFile atomicCachedFile = null; + FileOutputStream fos = null; try { - final AtomicFile atomicCachedFile = + atomicCachedFile = new AtomicFile(new File(mDataStoragePath, cacheFilename)); - final FileOutputStream fos = atomicCachedFile.startWrite(); + fos = atomicCachedFile.startWrite(); fos.write(data); atomicCachedFile.finishWrite(fos); } catch (IOException e) { Slog.e(TAG, "Failed to write current data to cached file", e); + if (fos != null) { + atomicCachedFile.failWrite(fos); + } + return; } } diff --git a/services/core/java/com/android/server/rollback/RollbackStore.java b/services/core/java/com/android/server/rollback/RollbackStore.java index 14539d544bf9..50db1e4ac30e 100644 --- a/services/core/java/com/android/server/rollback/RollbackStore.java +++ b/services/core/java/com/android/server/rollback/RollbackStore.java @@ -84,8 +84,12 @@ class RollbackStore { */ private static List<Rollback> loadRollbacks(File rollbackDataDir) { List<Rollback> rollbacks = new ArrayList<>(); - rollbackDataDir.mkdirs(); - for (File rollbackDir : rollbackDataDir.listFiles()) { + File[] rollbackDirs = rollbackDataDir.listFiles(); + if (rollbackDirs == null) { + Slog.e(TAG, "Folder doesn't exist: " + rollbackDataDir); + return rollbacks; + } + for (File rollbackDir : rollbackDirs) { if (rollbackDir.isDirectory()) { try { rollbacks.add(loadRollback(rollbackDir)); diff --git a/services/core/java/com/android/server/security/OWNERS b/services/core/java/com/android/server/security/OWNERS index fa4bf228c683..7a31a0006bb9 100644 --- a/services/core/java/com/android/server/security/OWNERS +++ b/services/core/java/com/android/server/security/OWNERS @@ -3,5 +3,6 @@ include /core/java/android/security/OWNERS per-file *AttestationVerification* = file:/core/java/android/security/attestationverification/OWNERS +per-file *CertificateRevocationStatus* = file:/core/java/android/security/attestationverification/OWNERS per-file FileIntegrity*.java = victorhsieh@google.com per-file KeyChainSystemService.java = file:platform/packages/apps/KeyChain:/OWNERS diff --git a/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java b/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java index 81217014bafe..a64e38e60ad1 100644 --- a/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java +++ b/services/core/java/com/android/server/sensorprivacy/SensorPrivacyService.java @@ -131,7 +131,6 @@ import android.util.proto.ProtoOutputStream; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; -import com.android.internal.annotations.KeepForWeakReference; import com.android.internal.camera.flags.Flags; import com.android.internal.messages.nano.SystemMessageProto.SystemMessage; import com.android.internal.os.BackgroundThread; @@ -536,8 +535,12 @@ public final class SensorPrivacyService extends SystemService { user.getIdentifier()); String inputMethodPackageName = null; if (inputMethodComponent != null) { - inputMethodPackageName = ComponentName.unflattenFromString( - inputMethodComponent).getPackageName(); + ComponentName component = ComponentName.unflattenFromString(inputMethodComponent); + if (component != null) { + inputMethodPackageName = component.getPackageName(); + } else { + Log.w(TAG, "Failed to parse inputMethodComponent: " + inputMethodComponent); + } } int capability; @@ -2004,11 +2007,7 @@ public final class SensorPrivacyService extends SystemService { } private class CallStateHelper { - // TelephonyCallback instances are only weakly referenced when registered, so we need - // to ensure these fields are kept during optimization to preserve lifecycle semantics. - @KeepForWeakReference private final OutgoingEmergencyStateCallback mEmergencyStateCallback; - @KeepForWeakReference private final CallStateCallback mCallStateCallback; private boolean mIsInEmergencyCall; diff --git a/services/core/java/com/android/server/stats/pull/AggregatedMobileDataStatsPuller.java b/services/core/java/com/android/server/stats/pull/AggregatedMobileDataStatsPuller.java index 2088e411f842..383135233049 100644 --- a/services/core/java/com/android/server/stats/pull/AggregatedMobileDataStatsPuller.java +++ b/services/core/java/com/android/server/stats/pull/AggregatedMobileDataStatsPuller.java @@ -142,11 +142,8 @@ class AggregatedMobileDataStatsPuller { private final RateLimiter mRateLimiter; AggregatedMobileDataStatsPuller(@NonNull NetworkStatsManager networkStatsManager) { - if (DEBUG) { - if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { - Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, - TAG + "-AggregatedMobileDataStatsPullerInit"); - } + if (DEBUG && Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { + Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, TAG + "-Init"); } mRateLimiter = new RateLimiter(/* window= */ Duration.ofSeconds(1)); @@ -173,10 +170,16 @@ class AggregatedMobileDataStatsPuller { public void noteUidProcessState(int uid, int state, long unusedElapsedRealtime, long unusedUptime) { - mMobileDataStatsHandler.post( + if (mRateLimiter.tryAcquire()) { + mMobileDataStatsHandler.post( () -> { noteUidProcessStateImpl(uid, state); }); + } else { + synchronized (mLock) { + mUidPreviousState.put(uid, state); + } + } } public int pullDataBytesTransfer(List<StatsEvent> data) { @@ -209,29 +212,27 @@ class AggregatedMobileDataStatsPuller { } private void noteUidProcessStateImpl(int uid, int state) { - if (mRateLimiter.tryAcquire()) { - // noteUidProcessStateImpl can be called back to back several times while - // the updateNetworkStats loops over several stats for multiple uids - // and during the first call in a batch of proc state change event it can - // contain info for uid with unknown previous state yet which can happen due to a few - // reasons: - // - app was just started - // - app was started before the ActivityManagerService - // as result stats would be created with state == ActivityManager.PROCESS_STATE_UNKNOWN - if (mNetworkStatsManager != null) { - updateNetworkStats(mNetworkStatsManager); - } else { - Slog.w(TAG, "noteUidProcessStateLocked() can not get mNetworkStatsManager"); - } + // noteUidProcessStateImpl can be called back to back several times while + // the updateNetworkStats loops over several stats for multiple uids + // and during the first call in a batch of proc state change event it can + // contain info for uid with unknown previous state yet which can happen due to a few + // reasons: + // - app was just started + // - app was started before the ActivityManagerService + // as result stats would be created with state == ActivityManager.PROCESS_STATE_UNKNOWN + if (mNetworkStatsManager != null) { + updateNetworkStats(mNetworkStatsManager); + } else { + Slog.w(TAG, "noteUidProcessStateLocked() can not get mNetworkStatsManager"); + } + synchronized (mLock) { + mUidPreviousState.put(uid, state); } - mUidPreviousState.put(uid, state); } private void updateNetworkStats(NetworkStatsManager networkStatsManager) { - if (DEBUG) { - if (Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { - Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, TAG + "-updateNetworkStats"); - } + if (DEBUG && Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { + Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, TAG + "-updateNetworkStats"); } final NetworkStats latestStats = networkStatsManager.getMobileUidStats(); @@ -256,20 +257,25 @@ class AggregatedMobileDataStatsPuller { } private void updateNetworkStatsDelta(NetworkStats delta) { + if (DEBUG && Trace.isTagEnabled(Trace.TRACE_TAG_SYSTEM_SERVER)) { + Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, TAG + "-updateNetworkStatsDelta"); + } synchronized (mLock) { for (NetworkStats.Entry entry : delta) { - if (entry.getRxPackets() == 0 && entry.getTxPackets() == 0) { - continue; - } - MobileDataStats stats = getUidStatsForPreviousStateLocked(entry.getUid()); - if (stats != null) { - stats.addTxBytes(entry.getTxBytes()); - stats.addRxBytes(entry.getRxBytes()); - stats.addTxPackets(entry.getTxPackets()); - stats.addRxPackets(entry.getRxPackets()); + if (entry.getRxPackets() != 0 || entry.getTxPackets() != 0) { + MobileDataStats stats = getUidStatsForPreviousStateLocked(entry.getUid()); + if (stats != null) { + stats.addTxBytes(entry.getTxBytes()); + stats.addRxBytes(entry.getRxBytes()); + stats.addTxPackets(entry.getTxPackets()); + stats.addRxPackets(entry.getRxPackets()); + } } } } + if (DEBUG) { + Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER); + } } @GuardedBy("mLock") @@ -298,18 +304,12 @@ class AggregatedMobileDataStatsPuller { } private static boolean isEmpty(NetworkStats stats) { - long totalRxPackets = 0; - long totalTxPackets = 0; for (NetworkStats.Entry entry : stats) { - if (entry.getRxPackets() == 0 && entry.getTxPackets() == 0) { - continue; + if (entry.getRxPackets() != 0 || entry.getTxPackets() != 0) { + // at least one non empty entry located + return false; } - totalRxPackets += entry.getRxPackets(); - totalTxPackets += entry.getTxPackets(); - // at least one non empty entry located - break; } - final long totalPackets = totalRxPackets + totalTxPackets; - return totalPackets == 0; + return true; } } diff --git a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java index 40ea9319c6be..21e02f3f7898 100644 --- a/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java +++ b/services/core/java/com/android/server/stats/pull/StatsPullAtomService.java @@ -4893,7 +4893,7 @@ public class StatsPullAtomService extends SystemService { Slog.e(TAG, "Disconnected from keystore service. Cannot pull.", e); return StatsManager.PULL_SKIP; } catch (ServiceSpecificException e) { - Slog.e(TAG, "pulling keystore metrics failed", e); + Slog.e(TAG, "Pulling keystore atom with tag " + atomTag + " failed", e); return StatsManager.PULL_SKIP; } finally { Binder.restoreCallingIdentity(callingToken); diff --git a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java index f8877ad912b5..a05e7e0acd8d 100644 --- a/services/core/java/com/android/server/statusbar/StatusBarManagerService.java +++ b/services/core/java/com/android/server/statusbar/StatusBarManagerService.java @@ -1517,10 +1517,13 @@ public class StatusBarManagerService extends IStatusBarService.Stub implements D getUiState(displayId).setImeWindowState(vis, backDisposition, showImeSwitcher); mHandler.post(() -> { - if (mBar == null) return; - try { - mBar.setImeWindowStatus(displayId, vis, backDisposition, showImeSwitcher); - } catch (RemoteException ex) { } + IStatusBar bar = mBar; + if (bar != null) { + try { + bar.setImeWindowStatus(displayId, vis, backDisposition, showImeSwitcher); + } catch (RemoteException ex) { + } + } }); } } diff --git a/services/core/java/com/android/server/uri/OWNERS b/services/core/java/com/android/server/uri/OWNERS index cdc07ed7c67a..6599db7936c0 100644 --- a/services/core/java/com/android/server/uri/OWNERS +++ b/services/core/java/com/android/server/uri/OWNERS @@ -1,3 +1,2 @@ jsharkey@android.com -jsharkey@google.com varunshah@google.com diff --git a/services/core/java/com/android/server/wm/ActivityRecord.java b/services/core/java/com/android/server/wm/ActivityRecord.java index 3467f947ece4..496e64f5f7a1 100644 --- a/services/core/java/com/android/server/wm/ActivityRecord.java +++ b/services/core/java/com/android/server/wm/ActivityRecord.java @@ -359,7 +359,6 @@ import android.window.WindowOnBackInvokedDispatcher; import com.android.internal.R; import com.android.internal.annotations.GuardedBy; -import com.android.internal.annotations.KeepForWeakReference; import com.android.internal.annotations.VisibleForTesting; import com.android.internal.app.ResolverActivity; import com.android.internal.content.ReferrerIntent; @@ -893,8 +892,6 @@ final class ActivityRecord extends WindowToken implements WindowManagerService.A private RemoteCallbackList<IScreenCaptureObserver> mCaptureCallbacks; - // Ensure the field is kept during optimization to preserve downstream weak refs. - @KeepForWeakReference private final ColorDisplayService.ColorTransformController mColorTransformController = (matrix, translation) -> mWmService.mH.post(() -> { synchronized (mWmService.mGlobalLock) { diff --git a/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java b/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java index 1208b6ef396f..08ceb61e14a8 100644 --- a/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java +++ b/services/core/java/com/android/server/wm/ActivityServiceConnectionsHolder.java @@ -142,6 +142,8 @@ public class ActivityServiceConnectionsHolder<T> { /** Used by {@link ActivityRecord#dump}. */ @Override public String toString() { - return String.valueOf(mConnections); + synchronized (mActivity) { + return String.valueOf(mConnections); + } } } diff --git a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java index a077a0b9a2ca..b20558ff79cc 100644 --- a/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java +++ b/services/core/java/com/android/server/wm/ActivityTaskSupervisor.java @@ -1662,6 +1662,12 @@ public class ActivityTaskSupervisor implements RecentTasks.Callbacks { activityIdleInternal(null /* idleActivity */, false /* fromTimeout */, true /* processPausingActivities */, null /* configuration */); + if (rootTask.getParent() == null) { + // The activities in the task may already be finishing. Then the task could be removed + // when performing the idle check. + return; + } + // Reparent all the tasks to the bottom of the display final DisplayContent toDisplay = mRootWindowContainer.getDisplayContent(DEFAULT_DISPLAY); diff --git a/services/core/java/com/android/server/wm/CameraStateMonitor.java b/services/core/java/com/android/server/wm/CameraStateMonitor.java index 3aa355869d85..00279921953d 100644 --- a/services/core/java/com/android/server/wm/CameraStateMonitor.java +++ b/services/core/java/com/android/server/wm/CameraStateMonitor.java @@ -110,8 +110,10 @@ class CameraStateMonitor { } void startListeningToCameraState() { - mCameraManager.registerAvailabilityCallback( - mWmService.mContext.getMainExecutor(), mAvailabilityCallback); + if (mCameraManager != null) { + mCameraManager.registerAvailabilityCallback( + mWmService.mContext.getMainExecutor(), mAvailabilityCallback); + } mIsRunning = true; } diff --git a/services/core/java/com/android/server/wm/ContentRecorder.java b/services/core/java/com/android/server/wm/ContentRecorder.java index 6ccceb9cf564..e05a87d2ceb5 100644 --- a/services/core/java/com/android/server/wm/ContentRecorder.java +++ b/services/core/java/com/android/server/wm/ContentRecorder.java @@ -368,6 +368,15 @@ final class ContentRecorder implements WindowContainerListener { return; } + final SurfaceControl sourceSurface = mRecordedWindowContainer.getSurfaceControl(); + if (sourceSurface == null || !sourceSurface.isValid()) { + ProtoLog.v(WM_DEBUG_CONTENT_RECORDING, + "Content Recording: Unable to start recording for display %d since the " + + "surface is null or have been released.", + mDisplayContent.getDisplayId()); + return; + } + final int contentToRecord = mContentRecordingSession.getContentToRecord(); // TODO(b/297514518) Do not start capture if the app is in PIP, the bounds are inaccurate. @@ -395,8 +404,7 @@ final class ContentRecorder implements WindowContainerListener { mDisplayContent.getDisplayId(), mDisplayContent.getDisplayInfo().state); // Create a mirrored hierarchy for the SurfaceControl of the DisplayArea to capture. - mRecordedSurface = SurfaceControl.mirrorSurface( - mRecordedWindowContainer.getSurfaceControl()); + mRecordedSurface = SurfaceControl.mirrorSurface(sourceSurface); SurfaceControl.Transaction transaction = mDisplayContent.mWmService.mTransactionFactory.get() // Set the mMirroredSurface's parent to the root SurfaceControl for this @@ -473,16 +481,18 @@ final class ContentRecorder implements WindowContainerListener { case RECORD_CONTENT_TASK: // Given the WindowToken of the region to record, retrieve the associated // SurfaceControl. - if (tokenToRecord == null) { + final WindowContainer wc = tokenToRecord != null + ? WindowContainer.fromBinder(tokenToRecord) : null; + if (wc == null) { handleStartRecordingFailed(); ProtoLog.v(WM_DEBUG_CONTENT_RECORDING, - "Content Recording: Unable to start recording due to null token for " - + "display %d", + "Content Recording: Unable to start recording due to null token or " + + "null window container for " + "display %d", mDisplayContent.getDisplayId()); return null; } - Task taskToRecord = WindowContainer.fromBinder(tokenToRecord).asTask(); - if (taskToRecord == null) { + final Task taskToRecord = wc.asTask(); + if (taskToRecord == null || !taskToRecord.isAttached()) { handleStartRecordingFailed(); ProtoLog.v(WM_DEBUG_CONTENT_RECORDING, "Content Recording: Unable to retrieve task to start recording for " diff --git a/services/core/java/com/android/server/wm/DisplayContent.java b/services/core/java/com/android/server/wm/DisplayContent.java index c2141a7103be..2f646fbde35a 100644 --- a/services/core/java/com/android/server/wm/DisplayContent.java +++ b/services/core/java/com/android/server/wm/DisplayContent.java @@ -841,11 +841,12 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp */ private final ToBooleanFunction<WindowState> mFindFocusedWindow = w -> { final ActivityRecord focusedApp = mFocusedApp; + final boolean canReceiveKeys = w.canReceiveKeys(); ProtoLog.v(WM_DEBUG_FOCUS, "Looking for focus: %s, flags=%d, canReceive=%b, reason=%s", - w, w.mAttrs.flags, w.canReceiveKeys(), + w, w.mAttrs.flags, canReceiveKeys, w.canReceiveKeysReason(false /* fromUserTouch */)); - if (!w.canReceiveKeys()) { + if (!canReceiveKeys) { return false; } @@ -3877,7 +3878,6 @@ class DisplayContent extends RootDisplayArea implements WindowManagerPolicy.Disp if (mTmpWindow == null) { ProtoLog.v(WM_DEBUG_FOCUS_LIGHT, "findFocusedWindow: No focusable windows, display=%d", getDisplayId()); - return null; } return mTmpWindow; } diff --git a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java index 4230cd868c03..98ed6f76b2f9 100644 --- a/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/ImeInsetsSourceProvider.java @@ -101,7 +101,8 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider { // isLeashReadyForDispatching (used to dispatch the leash of the control) is // depending on mGivenInsetsReady. Therefore, triggering notifyControlChanged here // again, so that the control with leash can be eventually dispatched - if (!mGivenInsetsReady && isServerVisible() && !givenInsetsPending) { + if (!mGivenInsetsReady && isServerVisible() && !givenInsetsPending + && mControlTarget != null) { mGivenInsetsReady = true; ImeTracker.forLogging().onProgress(mStatsToken, ImeTracker.PHASE_WM_POST_LAYOUT_NOTIFY_CONTROLS_CHANGED); @@ -324,7 +325,8 @@ final class ImeInsetsSourceProvider extends InsetsSourceProvider { if (target != imeControlTarget) { // TODO(b/353463205): check if fromUser=false is correct here boolean imeVisible = target.isRequestedVisible(WindowInsets.Type.ime()); - ImeTracker.Token statsToken = ImeTracker.forLogging().onStart(ImeTracker.TYPE_HIDE, + ImeTracker.Token statsToken = ImeTracker.forLogging().onStart( + imeVisible ? ImeTracker.TYPE_SHOW : ImeTracker.TYPE_HIDE, ImeTracker.ORIGIN_SERVER, imeVisible ? SoftInputShowHideReason.SHOW_INPUT_TARGET_CHANGED : SoftInputShowHideReason.HIDE_INPUT_TARGET_CHANGED, diff --git a/services/core/java/com/android/server/wm/InsetsSourceProvider.java b/services/core/java/com/android/server/wm/InsetsSourceProvider.java index 7276007481ab..d1585d06ae40 100644 --- a/services/core/java/com/android/server/wm/InsetsSourceProvider.java +++ b/services/core/java/com/android/server/wm/InsetsSourceProvider.java @@ -384,7 +384,7 @@ class InsetsSourceProvider { } final boolean serverVisibleChanged = mServerVisible != isServerVisible; setServerVisible(isServerVisible); - if (mControl != null) { + if (mControl != null && mControlTarget != null) { final boolean positionChanged = updateInsetsControlPosition(windowState); if (!(positionChanged || mHasPendingPosition) // The insets hint would be updated while changing the position. Here updates it diff --git a/services/core/java/com/android/server/wm/InsetsStateController.java b/services/core/java/com/android/server/wm/InsetsStateController.java index cf145f94f787..cd3398950099 100644 --- a/services/core/java/com/android/server/wm/InsetsStateController.java +++ b/services/core/java/com/android/server/wm/InsetsStateController.java @@ -371,7 +371,7 @@ class InsetsStateController { array.add(provider); } - void notifyControlChanged(InsetsControlTarget target, InsetsSourceProvider provider) { + void notifyControlChanged(@NonNull InsetsControlTarget target, InsetsSourceProvider provider) { addToPendingControlMaps(target, provider); notifyPendingInsetsControlChanged(); diff --git a/services/core/java/com/android/server/wm/OWNERS b/services/core/java/com/android/server/wm/OWNERS index 98521d36ad44..243a5326b545 100644 --- a/services/core/java/com/android/server/wm/OWNERS +++ b/services/core/java/com/android/server/wm/OWNERS @@ -3,7 +3,6 @@ set noparent ogunwale@google.com jjaggi@google.com racarr@google.com -chaviw@google.com vishnun@google.com akulian@google.com roosa@google.com @@ -21,6 +20,7 @@ jiamingliu@google.com pdwilliams@google.com charlesccchen@google.com marziana@google.com +mcarli@google.com # Files related to background activity launches per-file Background*Start* = set noparent diff --git a/services/core/java/com/android/server/wm/PinnedTaskController.java b/services/core/java/com/android/server/wm/PinnedTaskController.java index 755d4c8c9fc5..6dd7d35856df 100644 --- a/services/core/java/com/android/server/wm/PinnedTaskController.java +++ b/services/core/java/com/android/server/wm/PinnedTaskController.java @@ -348,12 +348,14 @@ class PinnedTaskController { * Notifies listeners that the PIP needs to be adjusted for the IME. */ private void notifyImeVisibilityChanged(boolean imeVisible, int imeHeight) { - if (mPinnedTaskListener != null) { - try { - mPinnedTaskListener.onImeVisibilityChanged(imeVisible, imeHeight); - } catch (RemoteException e) { - Slog.e(TAG_WM, "Error delivering bounds changed event.", e); - } + if (mPinnedTaskListener == null) { + return; + } + + try { + mPinnedTaskListener.onImeVisibilityChanged(imeVisible, imeHeight); + } catch (RemoteException e) { + Slog.e(TAG_WM, "Error delivering ime visibility changed event.", e); } } @@ -361,15 +363,14 @@ class PinnedTaskController { * Notifies listeners that the PIP movement bounds have changed. */ private void notifyMovementBoundsChanged(boolean fromImeAdjustment) { - synchronized (mService.mGlobalLock) { - if (mPinnedTaskListener == null) { - return; - } - try { - mPinnedTaskListener.onMovementBoundsChanged(fromImeAdjustment); - } catch (RemoteException e) { - Slog.e(TAG_WM, "Error delivering actions changed event.", e); - } + if (mPinnedTaskListener == null) { + return; + } + + try { + mPinnedTaskListener.onMovementBoundsChanged(fromImeAdjustment); + } catch (RemoteException e) { + Slog.e(TAG_WM, "Error delivering movement bounds changed event.", e); } } diff --git a/services/core/java/com/android/server/wm/RecentTasks.java b/services/core/java/com/android/server/wm/RecentTasks.java index 7fdc2c67b5ce..44f000da3d73 100644 --- a/services/core/java/com/android/server/wm/RecentTasks.java +++ b/services/core/java/com/android/server/wm/RecentTasks.java @@ -1515,9 +1515,9 @@ class RecentTasks { boolean skipExcludedCheck) { if (!skipExcludedCheck) { // Keep the most recent task of home display even if it is excluded from recents. - final boolean isExcludeFromRecents = - (task.getBaseIntent().getFlags() & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) - == FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; + final boolean isExcludeFromRecents = task.getBaseIntent() != null + && (task.getBaseIntent().getFlags() & FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS) + == FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS; if (isExcludeFromRecents) { if (DEBUG_RECENTS_TRIM_TASKS) { Slog.d(TAG, diff --git a/services/core/java/com/android/server/wm/ScreenRecordingCallbackController.java b/services/core/java/com/android/server/wm/ScreenRecordingCallbackController.java index 38e011509885..efc68aac0323 100644 --- a/services/core/java/com/android/server/wm/ScreenRecordingCallbackController.java +++ b/services/core/java/com/android/server/wm/ScreenRecordingCallbackController.java @@ -95,8 +95,9 @@ public class ScreenRecordingCallbackController { if (mediaProjectionInfo.getLaunchCookie() == null) { mRecordedWC = (WindowContainer) mWms.mRoot.getDefaultDisplay(); } else { - mRecordedWC = mWms.mRoot.getActivity(activity -> activity.mLaunchCookie - == mediaProjectionInfo.getLaunchCookie().binder).getTask(); + final ActivityRecord matchingActivity = mWms.mRoot.getActivity(activity -> + activity.mLaunchCookie == mediaProjectionInfo.getLaunchCookie().binder); + mRecordedWC = matchingActivity != null ? matchingActivity.getTask() : null; } } diff --git a/services/core/java/com/android/server/wm/SnapshotPersistQueue.java b/services/core/java/com/android/server/wm/SnapshotPersistQueue.java index a5454546341b..3eb13c52cca6 100644 --- a/services/core/java/com/android/server/wm/SnapshotPersistQueue.java +++ b/services/core/java/com/android/server/wm/SnapshotPersistQueue.java @@ -407,10 +407,8 @@ class SnapshotPersistQueue { bitmap.recycle(); final File file = mPersistInfoProvider.getHighResolutionBitmapFile(mId, mUserId); - try { - FileOutputStream fos = new FileOutputStream(file); + try (FileOutputStream fos = new FileOutputStream(file)) { swBitmap.compress(JPEG, COMPRESS_QUALITY, fos); - fos.close(); } catch (IOException e) { Slog.e(TAG, "Unable to open " + file + " for persisting.", e); return false; @@ -428,10 +426,8 @@ class SnapshotPersistQueue { swBitmap.recycle(); final File lowResFile = mPersistInfoProvider.getLowResolutionBitmapFile(mId, mUserId); - try { - FileOutputStream lowResFos = new FileOutputStream(lowResFile); + try (FileOutputStream lowResFos = new FileOutputStream(lowResFile)) { lowResBitmap.compress(JPEG, COMPRESS_QUALITY, lowResFos); - lowResFos.close(); } catch (IOException e) { Slog.e(TAG, "Unable to open " + lowResFile + " for persisting.", e); return false; diff --git a/services/core/java/com/android/server/wm/TaskDisplayArea.java b/services/core/java/com/android/server/wm/TaskDisplayArea.java index c1a33c468cee..2bec0f414a0c 100644 --- a/services/core/java/com/android/server/wm/TaskDisplayArea.java +++ b/services/core/java/com/android/server/wm/TaskDisplayArea.java @@ -844,7 +844,7 @@ final class TaskDisplayArea extends DisplayArea<WindowContainer> { */ void positionTaskBehindHome(Task task) { final Task home = getOrCreateRootHomeTask(); - final WindowContainer homeParent = home.getParent(); + final WindowContainer homeParent = home != null ? home.getParent() : null; final Task homeParentTask = homeParent != null ? homeParent.asTask() : null; if (homeParentTask == null) { // reparent throws if parent didn't change... diff --git a/services/core/java/com/android/server/wm/TaskPersister.java b/services/core/java/com/android/server/wm/TaskPersister.java index d89dc0b8e81c..91cd9498a356 100644 --- a/services/core/java/com/android/server/wm/TaskPersister.java +++ b/services/core/java/com/android/server/wm/TaskPersister.java @@ -245,18 +245,20 @@ public class TaskPersister implements PersisterQueue.Listener { private static String fileToString(File file) { final String newline = System.lineSeparator(); + BufferedReader reader = null; try { - BufferedReader reader = new BufferedReader(new FileReader(file)); + reader = new BufferedReader(new FileReader(file)); StringBuffer sb = new StringBuffer((int) file.length() * 2); String line; while ((line = reader.readLine()) != null) { sb.append(line + newline); } - reader.close(); return sb.toString(); } catch (IOException ioe) { Slog.e(TAG, "Couldn't read file " + file.getName()); return null; + } finally { + IoUtils.closeQuietly(reader); } } diff --git a/services/core/java/com/android/server/wm/Transition.java b/services/core/java/com/android/server/wm/Transition.java index 1fc609b7d03a..43e45e18f01e 100644 --- a/services/core/java/com/android/server/wm/Transition.java +++ b/services/core/java/com/android/server/wm/Transition.java @@ -1415,6 +1415,7 @@ class Transition implements BLASTSyncEngine.TransactionReadyListener { if (!tr.isAttached() || !tr.isVisibleRequested() || !tr.inPinnedWindowingMode()) return; final ActivityRecord currTop = tr.getTopNonFinishingActivity(); + if (currTop == null) return; if (currTop.inPinnedWindowingMode()) return; Slog.e(TAG, "Enter-PIP was started but not completed, this is a Shell/SysUI" + " bug. This state breaks gesture-nav, so attempting clean-up."); diff --git a/services/core/java/com/android/server/wm/WindowManagerService.java b/services/core/java/com/android/server/wm/WindowManagerService.java index 0b6ca75c5f0d..6238d4bd8fb8 100644 --- a/services/core/java/com/android/server/wm/WindowManagerService.java +++ b/services/core/java/com/android/server/wm/WindowManagerService.java @@ -726,8 +726,14 @@ public class WindowManagerService extends IWindowManager.Stub new WallpaperVisibilityListeners(); IDisplayChangeWindowController mDisplayChangeController = null; - private final DeathRecipient mDisplayChangeControllerDeath = - () -> mDisplayChangeController = null; + private final DeathRecipient mDisplayChangeControllerDeath = new DeathRecipient() { + @Override + public void binderDied() { + synchronized (mGlobalLock) { + mDisplayChangeController = null; + } + } + }; final DisplayWindowListenerController mDisplayNotificationController; final TaskSystemBarsListenerController mTaskSystemBarsListenerController; @@ -10062,9 +10068,10 @@ public class WindowManagerService extends IWindowManager.Stub throw new SecurityException("Access denied to process: " + pid + ", must have permission " + Manifest.permission.ACCESS_FPS_COUNTER); } - - if (mRoot.anyTaskForId(taskId) == null) { - throw new IllegalArgumentException("no task with taskId: " + taskId); + synchronized (mGlobalLock) { + if (mRoot.anyTaskForId(taskId) == null) { + throw new IllegalArgumentException("no task with taskId: " + taskId); + } } mTaskFpsCallbackController.registerListener(taskId, callback); diff --git a/services/core/java/com/android/server/wm/WindowState.java b/services/core/java/com/android/server/wm/WindowState.java index cebe790bb1b9..eb30514006f1 100644 --- a/services/core/java/com/android/server/wm/WindowState.java +++ b/services/core/java/com/android/server/wm/WindowState.java @@ -3303,7 +3303,8 @@ class WindowState extends WindowContainer<WindowState> implements WindowManagerP // just kill it. And if it is a window of foreground activity, the activity can be // restarted automatically if needed. Slog.w(TAG, "Exception thrown during dispatchAppVisibility " + this, e); - if (android.os.Process.getUidForPid(mSession.mPid) == mSession.mUid) { + if (android.os.Process.getUidForPid(mSession.mPid) == mSession.mUid + && android.os.Process.getThreadGroupLeader(mSession.mPid) == mSession.mPid) { android.os.Process.killProcess(mSession.mPid); } } diff --git a/services/core/jni/Android.bp b/services/core/jni/Android.bp index 4c0cee404b68..85169b8a8752 100644 --- a/services/core/jni/Android.bp +++ b/services/core/jni/Android.bp @@ -11,7 +11,6 @@ cc_library_static { name: "libservices.core", defaults: ["libservices.core-libs"], - cpp_std: "c++2a", cflags: [ "-Wall", "-Werror", @@ -80,6 +79,7 @@ cc_library_static { ":lib_oomConnection_native", ":lib_anrTimer_native", ":lib_lazilyRegisteredServices_native", + ":lib_phantomProcessList_native", ], include_dirs: [ @@ -265,3 +265,10 @@ filegroup { "com_android_server_vr_VrManagerService.cpp", ], } + +filegroup { + name: "lib_phantomProcessList_native", + srcs: [ + "com_android_server_am_PhantomProcessList.cpp", + ], +} diff --git a/services/core/jni/BroadcastRadio/OWNERS b/services/core/jni/BroadcastRadio/OWNERS index ea4421eae96a..a993823f88f7 100644 --- a/services/core/jni/BroadcastRadio/OWNERS +++ b/services/core/jni/BroadcastRadio/OWNERS @@ -1,2 +1 @@ twasilczyk@google.com -randolphs@google.com diff --git a/services/core/jni/com_android_server_am_PhantomProcessList.cpp b/services/core/jni/com_android_server_am_PhantomProcessList.cpp new file mode 100644 index 000000000000..0c5e6d85919a --- /dev/null +++ b/services/core/jni/com_android_server_am_PhantomProcessList.cpp @@ -0,0 +1,49 @@ +/* + * Copyright (C) 2024 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <jni.h> +#include <nativehelper/JNIHelp.h> +#include <processgroup/processgroup.h> + +namespace android { +namespace { + +jstring getCgroupProcsPath(JNIEnv* env, jobject clazz, jint uid, jint pid) { + if (uid < 0) { + jniThrowExceptionFmt(env, "java/lang/IllegalArgumentException", "uid is negative: %d", uid); + return nullptr; + } + + std::string path; + if (!CgroupGetAttributePathForProcess("CgroupProcs", uid, pid, path)) { + path.clear(); + } + + return env->NewStringUTF(path.c_str()); +} + +const JNINativeMethod sMethods[] = { + {"nativeGetCgroupProcsPath", "(II)Ljava/lang/String;", (void*)getCgroupProcsPath}, +}; + +} // anonymous namespace + +int register_android_server_am_PhantomProcessList(JNIEnv* env) { + const char* className = "com/android/server/am/PhantomProcessList"; + return jniRegisterNativeMethods(env, className, sMethods, NELEM(sMethods)); +} + +} // namespace android
\ No newline at end of file diff --git a/services/core/jni/onload.cpp b/services/core/jni/onload.cpp index 09fd8d4ac02e..ddcff7bfafaf 100644 --- a/services/core/jni/onload.cpp +++ b/services/core/jni/onload.cpp @@ -71,6 +71,7 @@ int register_com_android_server_display_DisplayControl(JNIEnv* env); int register_com_android_server_SystemClockTime(JNIEnv* env); int register_android_server_display_smallAreaDetectionController(JNIEnv* env); int register_com_android_server_accessibility_BrailleDisplayConnection(JNIEnv* env); +int register_android_server_am_PhantomProcessList(JNIEnv* env); // Note: Consider adding new JNI entrypoints for optional services to // LazyJniRegistrar instead, and relying on lazy registration. @@ -137,5 +138,6 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) register_com_android_server_SystemClockTime(env); register_android_server_display_smallAreaDetectionController(env); register_com_android_server_accessibility_BrailleDisplayConnection(env); + register_android_server_am_PhantomProcessList(env); return JNI_VERSION_1_4; } diff --git a/services/core/jni/stats/OWNERS b/services/core/jni/stats/OWNERS index 2611e5b6cee2..8d87925fbe45 100644 --- a/services/core/jni/stats/OWNERS +++ b/services/core/jni/stats/OWNERS @@ -1,8 +1,6 @@ jeffreyhuang@google.com -jtnguyen@google.com muhammadq@google.com sharaieko@google.com singhtejinder@google.com tsaichristine@google.com yaochen@google.com -yro@google.com diff --git a/services/foldables/devicestateprovider/src/com/android/server/policy/feature/Android.bp b/services/foldables/devicestateprovider/src/com/android/server/policy/feature/Android.bp index 6393e11b7432..1db9e8d545e4 100644 --- a/services/foldables/devicestateprovider/src/com/android/server/policy/feature/Android.bp +++ b/services/foldables/devicestateprovider/src/com/android/server/policy/feature/Android.bp @@ -1,7 +1,7 @@ aconfig_declarations { name: "device_state_flags", package: "com.android.server.policy.feature.flags", - container: "system", + container: "system_ext", srcs: [ "device_state_flags.aconfig", ], diff --git a/services/foldables/devicestateprovider/src/com/android/server/policy/feature/device_state_flags.aconfig b/services/foldables/devicestateprovider/src/com/android/server/policy/feature/device_state_flags.aconfig index 21e33dd1b99a..f827b5508015 100644 --- a/services/foldables/devicestateprovider/src/com/android/server/policy/feature/device_state_flags.aconfig +++ b/services/foldables/devicestateprovider/src/com/android/server/policy/feature/device_state_flags.aconfig @@ -1,5 +1,5 @@ package: "com.android.server.policy.feature.flags" -container: "system" +container: "system_ext" flag { name: "enable_dual_display_blocking" diff --git a/services/incremental/IncrementalService.cpp b/services/incremental/IncrementalService.cpp index a8e6f689b424..dae481a3c215 100644 --- a/services/incremental/IncrementalService.cpp +++ b/services/incremental/IncrementalService.cpp @@ -1999,9 +1999,9 @@ bool IncrementalService::configureNativeBinaries(StorageId storage, std::string_ // Create new lib file without signature info incfs::NewFileParams libFileParams = { .size = entry.uncompressed_length, - .signature = {}, // Metadata of the new lib file is its relative path .metadata = {targetLibPath.c_str(), (IncFsSize)targetLibPath.size()}, + .signature = {}, }; incfs::FileId libFileId = idFromMetadata(targetLibPath); if (auto res = mIncFs->makeFile(ifs->control, targetLibPathAbsolute, 0755, libFileId, diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 92dbf63b3cf7..1472da687199 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -293,6 +293,7 @@ import com.android.server.usage.StorageStatsService; import com.android.server.usage.UsageStatsService; import com.android.server.usb.UsbService; import com.android.server.utils.TimingsTraceAndSlog; +import com.android.server.vcn.VcnLocation; import com.android.server.vibrator.VibratorManagerService; import com.android.server.voiceinteraction.VoiceInteractionManagerService; import com.android.server.vr.VrManagerService; @@ -438,7 +439,7 @@ public final class SystemServer implements Dumpable { "/apex/com.android.uwb/javalib/service-uwb.jar"; private static final String UWB_SERVICE_CLASS = "com.android.server.uwb.UwbService"; private static final String BLUETOOTH_APEX_SERVICE_JAR_PATH = - "/apex/com.android.btservices/javalib/service-bluetooth.jar"; + "/apex/com.android.bt/javalib/service-bluetooth.jar"; private static final String BLUETOOTH_SERVICE_CLASS = "com.android.server.bluetooth.BluetoothService"; private static final String DEVICE_LOCK_SERVICE_CLASS = @@ -885,6 +886,17 @@ public final class SystemServer implements Dumpable { SystemServiceRegistry.sEnableServiceNotFoundWtf = true; + // Prepare the thread pool for init tasks that can be parallelized + SystemServerInitThreadPool tp = SystemServerInitThreadPool.start(); + mDumper.addDumpable(tp); + + if (android.server.Flags.earlySystemConfigInit()) { + // SystemConfig init is expensive, so enqueue the work as early as possible to allow + // concurrent execution before it's needed (typically by ActivityManagerService). + // As native library loading is also expensive, this is a good place to start. + startSystemConfigInit(t); + } + // Initialize native services. System.loadLibrary("android_servers"); @@ -917,9 +929,6 @@ public final class SystemServer implements Dumpable { mDumper.addDumpable(mSystemServiceManager); LocalServices.addService(SystemServiceManager.class, mSystemServiceManager); - // Prepare the thread pool for init tasks that can be parallelized - SystemServerInitThreadPool tp = SystemServerInitThreadPool.start(); - mDumper.addDumpable(tp); // Lazily load the pre-installed system font map in SystemServer only if we're not doing // the optimized font loading in the FontManagerService. @@ -1073,6 +1082,14 @@ public final class SystemServer implements Dumpable { } } + private void startSystemConfigInit(TimingsTraceAndSlog t) { + Slog.i(TAG, "Reading configuration..."); + final String tagSystemConfig = "ReadingSystemConfig"; + t.traceBegin(tagSystemConfig); + SystemServerInitThreadPool.submit(SystemConfig::getInstance, tagSystemConfig); + t.traceEnd(); + } + private void createSystemContext() { ActivityThread activityThread = ActivityThread.systemMain(); mSystemContext = activityThread.getSystemContext(); @@ -1111,11 +1128,11 @@ public final class SystemServer implements Dumpable { mDumper.addDumpable(watchdog); t.traceEnd(); - Slog.i(TAG, "Reading configuration..."); - final String TAG_SYSTEM_CONFIG = "ReadingSystemConfig"; - t.traceBegin(TAG_SYSTEM_CONFIG); - SystemServerInitThreadPool.submit(SystemConfig::getInstance, TAG_SYSTEM_CONFIG); - t.traceEnd(); + // Legacy entry point for starting SystemConfig init, only needed if the early init flag is + // disabled and we haven't already triggered init before bootstrap services. + if (!android.server.Flags.earlySystemConfigInit()) { + startSystemConfigInit(t); + } // Orchestrates some ProtoLogging functionality. if (android.tracing.Flags.clientSideProtoLogging()) { @@ -1929,6 +1946,10 @@ public final class SystemServer implements Dumpable { } t.traceEnd(); + t.traceBegin("UpdateMetricsIfNeeded"); + mPackageManagerService.updateMetricsIfNeeded(); + t.traceEnd(); + t.traceBegin("PerformFstrimIfNeeded"); try { mPackageManagerService.performFstrimIfNeeded(); @@ -2234,10 +2255,13 @@ public final class SystemServer implements Dumpable { t.traceBegin("StartVcnManagementService"); try { - // TODO: b/375213246 When VCN is in mainline module, load it from the apex path. - // Whether VCN will be in apex or in the platform will be gated by a build system - // flag. - mSystemServiceManager.startService(CONNECTIVITY_SERVICE_INITIALIZER_B_CLASS); + if (VcnLocation.IS_VCN_IN_MAINLINE) { + mSystemServiceManager.startServiceFromJar( + CONNECTIVITY_SERVICE_INITIALIZER_B_CLASS, + CONNECTIVITY_SERVICE_APEX_PATH); + } else { + mSystemServiceManager.startService(CONNECTIVITY_SERVICE_INITIALIZER_B_CLASS); + } } catch (Throwable e) { reportWtf("starting VCN Management Service", e); } @@ -3093,18 +3117,13 @@ public final class SystemServer implements Dumpable { if (com.android.ranging.flags.Flags.rangingStackEnabled()) { if (context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_UWB) || context.getPackageManager().hasSystemFeature( - PackageManager.FEATURE_WIFI_RTT) + PackageManager.FEATURE_WIFI_AWARE) || (com.android.ranging.flags.Flags.rangingCsEnabled() && context.getPackageManager().hasSystemFeature( - PackageManager.FEATURE_BLUETOOTH_LE_CHANNEL_SOUNDING))) { + PackageManager.FEATURE_BLUETOOTH_LE))) { t.traceBegin("RangingService"); - // TODO: b/375264320 - Remove after RELEASE_RANGING_STACK is ramped to next. - try { - mSystemServiceManager.startServiceFromJar(RANGING_SERVICE_CLASS, - RANGING_APEX_SERVICE_JAR_PATH); - } catch (Throwable e) { - Slog.d(TAG, "service-ranging.jar not found, not starting RangingService"); - } + mSystemServiceManager.startServiceFromJar(RANGING_SERVICE_CLASS, + RANGING_APEX_SERVICE_JAR_PATH); t.traceEnd(); } } diff --git a/services/java/com/android/server/flags.aconfig b/services/java/com/android/server/flags.aconfig index 0d222fb4409e..141966dd6306 100644 --- a/services/java/com/android/server/flags.aconfig +++ b/services/java/com/android/server/flags.aconfig @@ -10,6 +10,13 @@ flag { } flag { + namespace: "system_performance" + name: "early_system_config_init" + description: "Perform earlier initialization of SystemConfig in system server startup." + bug: "383869534" +} + +flag { name: "remove_text_service" namespace: "wear_frameworks" description: "Remove TextServiceManagerService on Wear" diff --git a/services/musicrecognition/OWNERS b/services/musicrecognition/OWNERS index 037b04831260..820be004efd5 100644 --- a/services/musicrecognition/OWNERS +++ b/services/musicrecognition/OWNERS @@ -1,5 +1,4 @@ # Bug component: 830636 oni@google.com -volnov@google.com diff --git a/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt b/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt index d2c91ff2ef60..232bb83fdf9f 100644 --- a/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt +++ b/services/permission/java/com/android/server/permission/access/permission/AppIdPermissionPolicy.kt @@ -286,14 +286,21 @@ class AppIdPermissionPolicy : SchemePolicy() { return@forEach } var newFlags = oldFlags + val isSystemOrInstalled = + packageState.isSystem || packageState.getUserStateOrDefault(userId).isInstalled newFlags = if ( - newFlags.hasBits(PermissionFlags.ROLE) || - newFlags.hasBits(PermissionFlags.PREGRANT) + isSystemOrInstalled && ( + newFlags.hasBits(PermissionFlags.ROLE) || + newFlags.hasBits(PermissionFlags.PREGRANT) + ) ) { newFlags or PermissionFlags.RUNTIME_GRANTED } else { - newFlags andInv PermissionFlags.RUNTIME_GRANTED + newFlags andInv ( + PermissionFlags.RUNTIME_GRANTED or PermissionFlags.ROLE or + PermissionFlags.PREGRANT + ) } newFlags = newFlags andInv USER_SETTABLE_MASK if (newFlags.hasBits(PermissionFlags.LEGACY_GRANTED)) { diff --git a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java index 228e32e98cc7..fc585c9e0f96 100644 --- a/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java +++ b/services/profcollect/src/com/android/server/profcollect/ProfcollectForwardingService.java @@ -16,6 +16,11 @@ package com.android.server.profcollect; +import static android.content.Intent.ACTION_BATTERY_LOW; +import static android.content.Intent.ACTION_BATTERY_OKAY; +import static android.content.Intent.ACTION_SCREEN_OFF; +import static android.content.Intent.ACTION_SCREEN_ON; + import android.Manifest; import android.annotation.RequiresPermission; import android.app.job.JobInfo; @@ -32,6 +37,7 @@ import android.hardware.usb.UsbManager; import android.os.Handler; import android.os.IBinder.DeathRecipient; import android.os.Looper; +import android.os.PowerManager; import android.os.RemoteException; import android.os.ServiceManager; import android.os.SystemProperties; @@ -70,10 +76,12 @@ public final class ProfcollectForwardingService extends SystemService { private int mUsageSetting; private boolean mUploadEnabled; - private static boolean sVerityEnforced; - private boolean mAdbActive; + static boolean sVerityEnforced; + static boolean sIsInteractive; + static boolean sAdbActive; + static boolean sIsBatteryLow; - private IProfCollectd mIProfcollect; + private static IProfCollectd sIProfcollect; private static ProfcollectForwardingService sSelfService; private final Handler mHandler = new ProfcollectdHandler(IoThread.getHandler().getLooper()); @@ -86,17 +94,28 @@ public final class ProfcollectForwardingService extends SystemService { private final BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { - if (INTENT_UPLOAD_PROFILES.equals(intent.getAction())) { + if (ACTION_BATTERY_LOW.equals(intent.getAction())) { + sIsBatteryLow = true; + } else if (ACTION_BATTERY_OKAY.equals(intent.getAction())) { + sIsBatteryLow = false; + } else if (ACTION_SCREEN_ON.equals(intent.getAction())) { + Log.d(LOG_TAG, "Received broadcast that the device became interactive, was " + + sIsInteractive); + sIsInteractive = true; + } else if (ACTION_SCREEN_OFF.equals(intent.getAction())) { + Log.d(LOG_TAG, "Received broadcast that the device became noninteractive, was " + + sIsInteractive); + sIsInteractive = false; + } else if (INTENT_UPLOAD_PROFILES.equals(intent.getAction())) { Log.d(LOG_TAG, "Received broadcast to pack and upload reports"); createAndUploadReport(sSelfService); - } - if (UsbManager.ACTION_USB_STATE.equals(intent.getAction())) { + } else if (UsbManager.ACTION_USB_STATE.equals(intent.getAction())) { boolean isADB = intent.getBooleanExtra(UsbManager.USB_FUNCTION_ADB, false); if (isADB) { boolean connected = intent.getBooleanExtra(UsbManager.USB_CONNECTED, false); Log.d(LOG_TAG, "Received broadcast that ADB became " + connected - + ", was " + mAdbActive); - mAdbActive = connected; + + ", was " + sAdbActive); + sAdbActive = connected; } } } @@ -129,6 +148,10 @@ public final class ProfcollectForwardingService extends SystemService { context.getResources().getBoolean(R.bool.config_profcollectReportUploaderEnabled); final IntentFilter filter = new IntentFilter(); + filter.addAction(ACTION_BATTERY_LOW); + filter.addAction(ACTION_BATTERY_OKAY); + filter.addAction(ACTION_SCREEN_ON); + filter.addAction(ACTION_SCREEN_OFF); filter.addAction(INTENT_UPLOAD_PROFILES); filter.addAction(UsbManager.ACTION_USB_STATE); context.registerReceiver(mBroadcastReceiver, filter, Context.RECEIVER_NOT_EXPORTED); @@ -153,14 +176,24 @@ public final class ProfcollectForwardingService extends SystemService { if (phase == PHASE_SYSTEM_SERVICES_READY) { UsbManager usbManager = getContext().getSystemService(UsbManager.class); if (usbManager == null) { - mAdbActive = false; - return; + sAdbActive = false; + Log.d(LOG_TAG, "USBManager is not ready"); + } else { + sAdbActive = ((usbManager.getCurrentFunctions() & UsbManager.FUNCTION_ADB) == 1); + Log.d(LOG_TAG, "ADB is " + sAdbActive + " on system startup"); + } + + PowerManager powerManager = getContext().getSystemService(PowerManager.class); + if (powerManager == null) { + sIsInteractive = true; + Log.d(LOG_TAG, "PowerManager is not ready"); + } else { + sIsInteractive = powerManager.isInteractive(); + Log.d(LOG_TAG, "Device is interactive " + sIsInteractive + " on system startup"); } - mAdbActive = ((usbManager.getCurrentFunctions() & UsbManager.FUNCTION_ADB) == 1); - Log.d(LOG_TAG, "ADB is " + mAdbActive + " on system startup"); } if (phase == PHASE_BOOT_COMPLETED) { - if (mIProfcollect == null) { + if (sIProfcollect == null) { return; } BackgroundThread.get().getThreadHandler().post(() -> { @@ -172,22 +205,22 @@ public final class ProfcollectForwardingService extends SystemService { } private void registerProviderStatusCallback() { - if (mIProfcollect == null) { + if (sIProfcollect == null) { return; } try { - mIProfcollect.registerProviderStatusCallback(mProviderStatusCallback); + sIProfcollect.registerProviderStatusCallback(mProviderStatusCallback); } catch (RemoteException e) { Log.e(LOG_TAG, "Failed to register provider status callback: " + e.getMessage()); } } private boolean serviceHasSupportedTraceProvider() { - if (mIProfcollect == null) { + if (sIProfcollect == null) { return false; } try { - return !mIProfcollect.get_supported_provider().isEmpty(); + return !sIProfcollect.get_supported_provider().isEmpty(); } catch (RemoteException e) { Log.e(LOG_TAG, "Failed to get supported provider: " + e.getMessage()); return false; @@ -209,7 +242,7 @@ public final class ProfcollectForwardingService extends SystemService { IProfCollectd.Stub.asInterface( ServiceManager.getServiceOrThrow("profcollectd")); profcollectd.asBinder().linkToDeath(new ProfcollectdDeathRecipient(), /*flags*/0); - mIProfcollect = profcollectd; + sIProfcollect = profcollectd; return true; } catch (ServiceManager.ServiceNotFoundException | RemoteException e) { Log.w(LOG_TAG, "Failed to connect profcollectd binder service."); @@ -233,7 +266,8 @@ public final class ProfcollectForwardingService extends SystemService { break; case MESSAGE_REGISTER_SCHEDULERS: registerObservers(); - ProfcollectBGJobService.schedule(getContext()); + PeriodicTraceJobService.schedule(getContext()); + ReportProcessJobService.schedule(getContext()); break; default: throw new AssertionError("Unknown message: " + message); @@ -246,27 +280,66 @@ public final class ProfcollectForwardingService extends SystemService { public void binderDied() { Log.w(LOG_TAG, "profcollectd has died"); - mIProfcollect = null; + sIProfcollect = null; tryConnectNativeService(); } } /** - * Background trace process service. + * Background report process and upload service. */ - public static class ProfcollectBGJobService extends JobService { - // Unique ID in system service - private static final int JOB_IDLE_PROCESS = 260817; + public static class PeriodicTraceJobService extends JobService { + // Unique ID in system server + private static final int PERIODIC_TRACE_JOB_ID = 241207; private static final ComponentName JOB_SERVICE_NAME = new ComponentName( "android", - ProfcollectBGJobService.class.getName()); + PeriodicTraceJobService.class.getName()); /** * Attach the service to the system job scheduler. */ public static void schedule(Context context) { + final int interval = DeviceConfig.getInt(DeviceConfig.NAMESPACE_PROFCOLLECT_NATIVE_BOOT, + "collection_interval", 600); JobScheduler js = context.getSystemService(JobScheduler.class); - js.schedule(new JobInfo.Builder(JOB_IDLE_PROCESS, JOB_SERVICE_NAME) + js.schedule(new JobInfo.Builder(PERIODIC_TRACE_JOB_ID, JOB_SERVICE_NAME) + .setPeriodic(TimeUnit.SECONDS.toMillis(interval)) + // PRIORITY_DEFAULT is the highest priority we can request for a periodic job. + .setPriority(JobInfo.PRIORITY_DEFAULT) + .build()); + } + + @Override + public boolean onStartJob(JobParameters params) { + if (sIProfcollect != null) { + Utils.traceSystem(sIProfcollect, "periodic"); + } + jobFinished(params, false); + return true; + } + + @Override + public boolean onStopJob(JobParameters params) { + return false; + } + } + + /** + * Background report process and upload service. + */ + public static class ReportProcessJobService extends JobService { + // Unique ID in system server + private static final int REPORT_PROCESS_JOB_ID = 260817; + private static final ComponentName JOB_SERVICE_NAME = new ComponentName( + "android", + ReportProcessJobService.class.getName()); + + /** + * Attach the service to the system job scheduler. + */ + public static void schedule(Context context) { + JobScheduler js = context.getSystemService(JobScheduler.class); + js.schedule(new JobInfo.Builder(REPORT_PROCESS_JOB_ID, JOB_SERVICE_NAME) .setRequiresDeviceIdle(true) .setRequiresCharging(true) .setPeriodic(BG_PROCESS_INTERVAL) @@ -283,7 +356,6 @@ public final class ProfcollectForwardingService extends SystemService { @Override public boolean onStopJob(JobParameters params) { - // TODO: Handle this? return false; } } @@ -311,14 +383,8 @@ public final class ProfcollectForwardingService extends SystemService { private class AppLaunchObserver extends ActivityMetricsLaunchObserver { @Override public void onIntentStarted(Intent intent, long timestampNanos) { - if (mIProfcollect == null) { - return; - } - if (mAdbActive) { - return; - } if (Utils.withFrequency("applaunch_trace_freq", 5)) { - Utils.traceSystem(mIProfcollect, "applaunch"); + Utils.traceSystem(sIProfcollect, "applaunch"); } } } @@ -336,15 +402,9 @@ public final class ProfcollectForwardingService extends SystemService { } private void traceOnDex2oatStart() { - if (mIProfcollect == null) { - return; - } - if (mAdbActive) { - return; - } if (Utils.withFrequency("dex2oat_trace_freq", 25)) { // Dex2oat could take a while before it starts. Add a short delay before start tracing. - Utils.traceSystem(mIProfcollect, "dex2oat", /* delayMs */ 1000); + Utils.traceSystem(sIProfcollect, "dex2oat", /* delayMs */ 1000); } } @@ -367,12 +427,12 @@ public final class ProfcollectForwardingService extends SystemService { private static void createAndUploadReport(ProfcollectForwardingService pfs) { BackgroundThread.get().getThreadHandler().post(() -> { - if (pfs.mIProfcollect == null) { + if (pfs.sIProfcollect == null) { return; } String reportName; try { - reportName = pfs.mIProfcollect.report(pfs.mUsageSetting) + ".zip"; + reportName = pfs.sIProfcollect.report(pfs.mUsageSetting) + ".zip"; } catch (RemoteException e) { Log.e(LOG_TAG, "Failed to create report: " + e.getMessage()); return; @@ -411,7 +471,7 @@ public final class ProfcollectForwardingService extends SystemService { return; } if (Utils.withFrequency("camera_trace_freq", 10)) { - Utils.traceProcess(mIProfcollect, + Utils.traceProcess(sIProfcollect, "camera", "android.hardware.camera.provider", /* durationMs */ 5000); diff --git a/services/profcollect/src/com/android/server/profcollect/Utils.java b/services/profcollect/src/com/android/server/profcollect/Utils.java index a8016a0b641e..c109f5cf05b6 100644 --- a/services/profcollect/src/com/android/server/profcollect/Utils.java +++ b/services/profcollect/src/com/android/server/profcollect/Utils.java @@ -28,28 +28,29 @@ import com.android.internal.os.BackgroundThread; import java.time.Instant; import java.util.concurrent.ThreadLocalRandom; -public final class Utils { +final class Utils { private static Instant lastTraceTime = Instant.EPOCH; private static final int TRACE_COOLDOWN_SECONDS = 30; - public static boolean withFrequency(String configName, int defaultFrequency) { + static boolean withFrequency(String configName, int defaultFrequency) { int threshold = DeviceConfig.getInt( DeviceConfig.NAMESPACE_PROFCOLLECT_NATIVE_BOOT, configName, defaultFrequency); int randomNum = ThreadLocalRandom.current().nextInt(100); return randomNum < threshold; } - public static boolean traceSystem(IProfCollectd mIProfcollect, String eventName) { - if (mIProfcollect == null) { - return false; - } - if (isInCooldownOrReset()) { + /** + * Request a system-wide trace. + * Will be ignored if the device does not meet trace criteria or is being rate limited. + */ + static boolean traceSystem(IProfCollectd iprofcollectd, String eventName) { + if (!checkPrerequisites(iprofcollectd)) { return false; } BackgroundThread.get().getThreadHandler().post(() -> { try { - mIProfcollect.trace_system(eventName); + iprofcollectd.trace_system(eventName); } catch (RemoteException | ServiceSpecificException e) { Log.e(LOG_TAG, "Failed to initiate trace: " + e.getMessage()); } @@ -57,16 +58,17 @@ public final class Utils { return true; } - public static boolean traceSystem(IProfCollectd mIProfcollect, String eventName, int delayMs) { - if (mIProfcollect == null) { - return false; - } - if (isInCooldownOrReset()) { + /** + * Request a system-wide trace after a delay. + * Will be ignored if the device does not meet trace criteria or is being rate limited. + */ + static boolean traceSystem(IProfCollectd iprofcollectd, String eventName, int delayMs) { + if (!checkPrerequisites(iprofcollectd)) { return false; } BackgroundThread.get().getThreadHandler().postDelayed(() -> { try { - mIProfcollect.trace_system(eventName); + iprofcollectd.trace_system(eventName); } catch (RemoteException | ServiceSpecificException e) { Log.e(LOG_TAG, "Failed to initiate trace: " + e.getMessage()); } @@ -74,17 +76,18 @@ public final class Utils { return true; } - public static boolean traceProcess(IProfCollectd mIProfcollect, + /** + * Request a single-process trace. + * Will be ignored if the device does not meet trace criteria or is being rate limited. + */ + static boolean traceProcess(IProfCollectd iprofcollectd, String eventName, String processName, int durationMs) { - if (mIProfcollect == null) { - return false; - } - if (isInCooldownOrReset()) { + if (!checkPrerequisites(iprofcollectd)) { return false; } BackgroundThread.get().getThreadHandler().post(() -> { try { - mIProfcollect.trace_process(eventName, + iprofcollectd.trace_process(eventName, processName, durationMs); } catch (RemoteException | ServiceSpecificException e) { @@ -105,4 +108,17 @@ public final class Utils { } return true; } + + private static boolean checkPrerequisites(IProfCollectd iprofcollectd) { + if (iprofcollectd == null) { + return false; + } + if (isInCooldownOrReset()) { + return false; + } + return ProfcollectForwardingService.sVerityEnforced + && !ProfcollectForwardingService.sAdbActive + && ProfcollectForwardingService.sIsInteractive + && !ProfcollectForwardingService.sIsBatteryLow; + } } diff --git a/services/proguard.flags b/services/proguard.flags index 0e1f68e03d7d..8d8b418ced0b 100644 --- a/services/proguard.flags +++ b/services/proguard.flags @@ -15,7 +15,10 @@ # APIs referenced by dependent JAR files and modules # TODO(b/300514883): Pull @SystemApi keep rules from system-api.pro. --keep interface android.annotation.SystemApi +# TODO(b/373579455): Evaluate if <init> needs to be kept. +-keep interface android.annotation.SystemApi { + void <init>(); +} -keep @android.annotation.SystemApi class * { public protected *; } diff --git a/services/robotests/Android.bp b/services/robotests/Android.bp index 6c4158e60ebb..8e0eb6b14432 100644 --- a/services/robotests/Android.bp +++ b/services/robotests/Android.bp @@ -63,7 +63,6 @@ android_robolectric_test { instrumentation_for: "FrameworksServicesLib", - upstream: true, strict_mode: false, } diff --git a/services/robotests/backup/Android.bp b/services/robotests/backup/Android.bp index 3ace3fb11506..95b38e56f276 100644 --- a/services/robotests/backup/Android.bp +++ b/services/robotests/backup/Android.bp @@ -66,7 +66,6 @@ android_robolectric_test { instrumentation_for: "BackupFrameworksServicesLib", - upstream: true, strict_mode: false, diff --git a/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyPermissionResetTest.kt b/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyPermissionResetTest.kt index 12370954e9a5..8b357862dcbc 100644 --- a/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyPermissionResetTest.kt +++ b/services/tests/PermissionServiceMockingTests/src/com/android/server/permission/test/AppIdPermissionPolicyPermissionResetTest.kt @@ -72,7 +72,8 @@ class AppIdPermissionPolicyPermissionResetTest : BasePermissionPolicyTest() { } else { mockPackageState( APP_ID_1, - mockAndroidPackage(PACKAGE_NAME_1, requestedPermissions = setOf(PERMISSION_NAME_0)) + mockAndroidPackage(PACKAGE_NAME_1, requestedPermissions = setOf(PERMISSION_NAME_0)), + true ) } setPermissionFlags(APP_ID_1, USER_ID_0, PERMISSION_NAME_0, oldFlags) diff --git a/services/tests/VpnTests/java/com/android/server/connectivity/VpnTest.java b/services/tests/VpnTests/java/com/android/server/connectivity/VpnTest.java index 5db6a8f12e52..9117cc8e5ab8 100644 --- a/services/tests/VpnTests/java/com/android/server/connectivity/VpnTest.java +++ b/services/tests/VpnTests/java/com/android/server/connectivity/VpnTest.java @@ -918,6 +918,30 @@ public class VpnTest extends VpnTestBase { } @Test + public void testOnUserAddedAndRemoved_nullUserInfo() throws Exception { + final Vpn vpn = createVpn(PRIMARY_USER.id); + final Set<Range<Integer>> initialRange = rangeSet(PRIMARY_USER_RANGE); + // Note since mVpnProfile is a Ikev2VpnProfile, this starts an IkeV2VpnRunner. + startLegacyVpn(vpn, mVpnProfile); + // Set an initial Uid range and mock the network agent + vpn.mNetworkCapabilities.setUids(initialRange); + vpn.mNetworkAgent = mMockNetworkAgent; + + // Add the restricted user and then remove it immediately. So the getUserInfo() will return + // null for the given restricted user id. + setMockedUsers(PRIMARY_USER, RESTRICTED_PROFILE_A); + doReturn(null).when(mUserManager).getUserInfo(RESTRICTED_PROFILE_A.id); + vpn.onUserAdded(RESTRICTED_PROFILE_A.id); + // Expect no range change to the NetworkCapabilities. + assertEquals(initialRange, vpn.mNetworkCapabilities.getUids()); + + // Remove the restricted user + vpn.onUserRemoved(RESTRICTED_PROFILE_A.id); + // Expect no range change to the NetworkCapabilities. + assertEquals(initialRange, vpn.mNetworkCapabilities.getUids()); + } + + @Test public void testPrepare_throwSecurityExceptionWhenGivenPackageDoesNotBelongToTheCaller() throws Exception { mTestDeps.mIgnoreCallingUidChecks = false; diff --git a/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java b/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java index f5bed999d5a0..1eb96d2256f1 100644 --- a/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java +++ b/services/tests/displayservicetests/src/com/android/server/display/LocalDisplayAdapterTest.java @@ -388,6 +388,34 @@ public class LocalDisplayAdapterTest { PORT_C, false); } + /** + * Confirm that display is marked as trusted, has own focus, disables steal top focus when it + * is listed in com.android.internal.R.array.config_localNotStealTopFocusDisplayPorts. + */ + @Test + public void testStealTopFocusDisabledDisplay() throws Exception { + setUpDisplay(new FakeDisplay(PORT_A)); + setUpDisplay(new FakeDisplay(PORT_B)); + setUpDisplay(new FakeDisplay(PORT_C)); + updateAvailableDisplays(); + + doReturn(new int[]{ PORT_B }).when(mMockedResources).getIntArray( + com.android.internal.R.array.config_localNotStealTopFocusDisplayPorts); + mAdapter.registerLocked(); + + waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); + + // This should not have the flags + assertNotStealTopFocusFlag(mListener.addedDisplays.get(0).getDisplayDeviceInfoLocked(), + PORT_A, false); + // This should have the flags + assertNotStealTopFocusFlag(mListener.addedDisplays.get(1).getDisplayDeviceInfoLocked(), + PORT_B, true); + // This should not have the flags + assertNotStealTopFocusFlag(mListener.addedDisplays.get(2).getDisplayDeviceInfoLocked(), + PORT_C, false); + } + @Test public void testSupportedDisplayModesGetOverriddenWhenDisplayIsUpdated() throws InterruptedException { @@ -452,6 +480,42 @@ public class LocalDisplayAdapterTest { } /** + * Confirm that all local displays are not trusted, do not have their own focus, and do not + * steal top focus when config_localNotStealTopFocusDisplayPorts is empty: + */ + @Test + public void testDisplayFlagsForNoConfigLocalNotStealTopFocusDisplayPorts() throws Exception { + setUpDisplay(new FakeDisplay(PORT_A)); + setUpDisplay(new FakeDisplay(PORT_C)); + updateAvailableDisplays(); + + // config_localNotStealTopFocusDisplayPorts is null + mAdapter.registerLocked(); + + waitForHandlerToComplete(mHandler, HANDLER_WAIT_MS); + + // This should not have the flags + assertNotStealTopFocusFlag(mListener.addedDisplays.get(0).getDisplayDeviceInfoLocked(), + PORT_A, false); + // This should not have the flags + assertNotStealTopFocusFlag(mListener.addedDisplays.get(1).getDisplayDeviceInfoLocked(), + PORT_C, false); + } + + private static void assertNotStealTopFocusFlag( + DisplayDeviceInfo info, int expectedPort, boolean shouldHaveFlags) { + final DisplayAddress.Physical address = (DisplayAddress.Physical) info.address; + assertNotNull(address); + assertEquals(expectedPort, address.getPort()); + assertEquals(DISPLAY_MODEL, address.getModel()); + assertEquals(shouldHaveFlags, + (info.flags & DisplayDeviceInfo.FLAG_STEAL_TOP_FOCUS_DISABLED) != 0); + assertEquals(shouldHaveFlags, (info.flags & DisplayDeviceInfo.FLAG_OWN_FOCUS) != 0); + // display is always trusted since it is created by the system + assertEquals(true, (info.flags & DisplayDeviceInfo.FLAG_TRUSTED) != 0); + } + + /** * Confirm that external display uses physical density. */ @Test diff --git a/services/tests/mockingservicestests/jni/Android.bp b/services/tests/mockingservicestests/jni/Android.bp index 94d4b9522d60..03bd73c52083 100644 --- a/services/tests/mockingservicestests/jni/Android.bp +++ b/services/tests/mockingservicestests/jni/Android.bp @@ -24,6 +24,7 @@ cc_library_shared { ":lib_freezer_native", ":lib_oomConnection_native", ":lib_lazilyRegisteredServices_native", + ":lib_phantomProcessList_native", "onload.cpp", ], diff --git a/services/tests/mockingservicestests/jni/onload.cpp b/services/tests/mockingservicestests/jni/onload.cpp index 9b4c8178b092..30fa7de94af1 100644 --- a/services/tests/mockingservicestests/jni/onload.cpp +++ b/services/tests/mockingservicestests/jni/onload.cpp @@ -28,6 +28,7 @@ int register_android_server_am_CachedAppOptimizer(JNIEnv* env); int register_android_server_am_Freezer(JNIEnv* env); int register_android_server_am_OomConnection(JNIEnv* env); int register_android_server_utils_LazyJniRegistrar(JNIEnv* env); +int register_android_server_am_PhantomProcessList(JNIEnv* env); }; using namespace android; @@ -46,5 +47,6 @@ extern "C" jint JNI_OnLoad(JavaVM* vm, void* /* reserved */) register_android_server_am_Freezer(env); register_android_server_am_OomConnection(env); register_android_server_utils_LazyJniRegistrar(env); + register_android_server_am_PhantomProcessList(env); return JNI_VERSION_1_4; } diff --git a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java index d203de537b81..cf83396d059a 100644 --- a/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java +++ b/services/tests/mockingservicestests/src/com/android/server/am/CachedAppOptimizerTest.java @@ -397,6 +397,12 @@ public final class CachedAppOptimizerTest { // When we override new reasonable throttle values after init... mCountDown = new CountDownLatch(8); DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + CachedAppOptimizer.KEY_COMPACT_THROTTLE_MIN_OOM_ADJ, + Long.toString(CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_MIN_OOM_ADJ + 1), false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, + CachedAppOptimizer.KEY_COMPACT_THROTTLE_MAX_OOM_ADJ, + Long.toString(CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_MAX_OOM_ADJ - 1), false); + DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, CachedAppOptimizer.KEY_COMPACT_THROTTLE_1, Long.toString(CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_1 + 1), false); DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, @@ -414,12 +420,6 @@ public final class CachedAppOptimizerTest { DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, CachedAppOptimizer.KEY_COMPACT_THROTTLE_6, Long.toString(CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_6 + 1), false); - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, - CachedAppOptimizer.KEY_COMPACT_THROTTLE_MIN_OOM_ADJ, - Long.toString(CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_MIN_OOM_ADJ + 1), false); - DeviceConfig.setProperty(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER, - CachedAppOptimizer.KEY_COMPACT_THROTTLE_MAX_OOM_ADJ, - Long.toString(CachedAppOptimizer.DEFAULT_COMPACT_THROTTLE_MAX_OOM_ADJ - 1), false); assertThat(mCountDown.await(7, TimeUnit.SECONDS)).isTrue(); // Then those flags values are reflected in the compactor. diff --git a/services/tests/ondeviceintelligencetests/OWNERS b/services/tests/ondeviceintelligencetests/OWNERS index a4fc7582a785..d08d34ad3108 100644 --- a/services/tests/ondeviceintelligencetests/OWNERS +++ b/services/tests/ondeviceintelligencetests/OWNERS @@ -1,3 +1,2 @@ shiqing@google.com sandeepbandaru@google.com -shivanker@google.com diff --git a/services/tests/servicestests/Android.bp b/services/tests/servicestests/Android.bp index 009ce88cfd6c..d702cae248a9 100644 --- a/services/tests/servicestests/Android.bp +++ b/services/tests/servicestests/Android.bp @@ -33,9 +33,6 @@ android_test { "test-apps/DisplayManagerTestApp/src/**/*.java", ], - kotlincflags: [ - "-Werror", - ], static_libs: [ "a11ychecker", "aatf", diff --git a/services/tests/servicestests/src/com/android/server/OWNERS b/services/tests/servicestests/src/com/android/server/OWNERS index d8a9400d5180..69feb1d86983 100644 --- a/services/tests/servicestests/src/com/android/server/OWNERS +++ b/services/tests/servicestests/src/com/android/server/OWNERS @@ -6,5 +6,6 @@ per-file *Gnss* = file:/services/core/java/com/android/server/location/OWNERS per-file *Network* = file:/services/core/java/com/android/server/net/OWNERS per-file BatteryServiceTest.java = file:platform/hardware/interfaces:/health/OWNERS per-file GestureLauncherServiceTest.java = file:platform/packages/apps/EmergencyInfo:/OWNERS +per-file GestureLauncherServiceTest.java = file:/INPUT_OWNERS per-file PinnerServiceTest.java = file:/apct-tests/perftests/OWNERS per-file SecurityStateTest.java = file:/SECURITY_STATE_OWNERS diff --git a/services/tests/servicestests/src/com/android/server/accessibility/OWNERS b/services/tests/servicestests/src/com/android/server/accessibility/OWNERS index b74281edbf52..c7c23f081044 100644 --- a/services/tests/servicestests/src/com/android/server/accessibility/OWNERS +++ b/services/tests/servicestests/src/com/android/server/accessibility/OWNERS @@ -1 +1,6 @@ +# Bug component: 1530954 +# +# The above component is for automated test bugs. If you are a human looking to report +# a bug in this codebase then please use component 44215. + include /core/java/android/view/accessibility/OWNERS diff --git a/services/tests/servicestests/src/com/android/server/accessibility/magnification/OWNERS b/services/tests/servicestests/src/com/android/server/accessibility/magnification/OWNERS new file mode 100644 index 000000000000..9592bfdfa73b --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/accessibility/magnification/OWNERS @@ -0,0 +1,6 @@ +# Bug component: 1530954 +# +# The above component is for automated test bugs. If you are a human looking to report +# a bug in this codebase then please use component 770744. + +include /services/accessibility/java/com/android/server/accessibility/magnification/OWNERS diff --git a/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java b/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java index fde3422b1ff3..17f5ebb3b02a 100644 --- a/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java +++ b/services/tests/servicestests/src/com/android/server/app/GameManagerServiceSettingsTests.java @@ -130,9 +130,9 @@ public class GameManagerServiceSettingsTests { assertEquals(GameManager.GAME_MODE_STANDARD, settings.getGameModeLocked(PACKAGE_NAME_4)); // test game mode configs - assertNull(settings.getConfigOverride(PACKAGE_NAME_1)); - assertNull(settings.getConfigOverride(PACKAGE_NAME_3)); - GamePackageConfiguration config = settings.getConfigOverride(PACKAGE_NAME_2); + assertNull(settings.getConfigOverrideLocked(PACKAGE_NAME_1)); + assertNull(settings.getConfigOverrideLocked(PACKAGE_NAME_3)); + GamePackageConfiguration config = settings.getConfigOverrideLocked(PACKAGE_NAME_2); assertNotNull(config); assertNull(config.getGameModeConfiguration(GameManager.GAME_MODE_STANDARD)); @@ -152,7 +152,7 @@ public class GameManagerServiceSettingsTests { assertEquals(batteryConfig.getFpsStr(), GameModeConfiguration.DEFAULT_FPS); assertFalse(batteryConfig.getUseAngle()); - config = settings.getConfigOverride(PACKAGE_NAME_4); + config = settings.getConfigOverrideLocked(PACKAGE_NAME_4); assertNotNull(config); GameModeConfiguration customConfig = config.getGameModeConfiguration( GameManager.GAME_MODE_CUSTOM); @@ -177,7 +177,7 @@ public class GameManagerServiceSettingsTests { GameManagerSettings settings = new GameManagerSettings(context.getFilesDir()); assertTrue(settings.readPersistentDataLocked()); - final GamePackageConfiguration config = settings.getConfigOverride(PACKAGE_NAME_1); + final GamePackageConfiguration config = settings.getConfigOverrideLocked(PACKAGE_NAME_1); assertNotNull(config); final GameModeConfiguration batteryConfig = config.getGameModeConfiguration( GameManager.GAME_MODE_BATTERY); @@ -218,7 +218,7 @@ public class GameManagerServiceSettingsTests { assertEquals(2, settings.getGameModeLocked(PACKAGE_NAME_2)); assertEquals(3, settings.getGameModeLocked(PACKAGE_NAME_3)); - final GamePackageConfiguration config = settings.getConfigOverride(PACKAGE_NAME_2); + final GamePackageConfiguration config = settings.getConfigOverrideLocked(PACKAGE_NAME_2); assertNotNull(config); final GameModeConfiguration batteryConfig = config.getGameModeConfiguration( GameManager.GAME_MODE_BATTERY); @@ -248,7 +248,7 @@ public class GameManagerServiceSettingsTests { GameModeConfiguration batteryConfig = config.getOrAddDefaultGameModeConfiguration( GameManager.GAME_MODE_BATTERY); batteryConfig.setScaling(0.77f); - settings.setConfigOverride(PACKAGE_NAME_2, config); + settings.setConfigOverrideLocked(PACKAGE_NAME_2, config); // set config for app4 config = new GamePackageConfiguration(PACKAGE_NAME_4); @@ -256,15 +256,15 @@ public class GameManagerServiceSettingsTests { GameManager.GAME_MODE_CUSTOM); customConfig.setScaling(0.4f); customConfig.setFpsStr("30"); - settings.setConfigOverride(PACKAGE_NAME_4, config); + settings.setConfigOverrideLocked(PACKAGE_NAME_4, config); settings.writePersistentDataLocked(); // clear the settings in memory - settings.removeGame(PACKAGE_NAME_1); - settings.removeGame(PACKAGE_NAME_2); - settings.removeGame(PACKAGE_NAME_3); - settings.removeGame(PACKAGE_NAME_4); + settings.removeGameLocked(PACKAGE_NAME_1); + settings.removeGameLocked(PACKAGE_NAME_2); + settings.removeGameLocked(PACKAGE_NAME_3); + settings.removeGameLocked(PACKAGE_NAME_4); // read back in and verify assertTrue(settings.readPersistentDataLocked()); @@ -273,9 +273,9 @@ public class GameManagerServiceSettingsTests { assertEquals(1, settings.getGameModeLocked(PACKAGE_NAME_3)); assertEquals(1, settings.getGameModeLocked(PACKAGE_NAME_4)); - config = settings.getConfigOverride(PACKAGE_NAME_1); + config = settings.getConfigOverrideLocked(PACKAGE_NAME_1); assertNull(config); - config = settings.getConfigOverride(PACKAGE_NAME_2); + config = settings.getConfigOverrideLocked(PACKAGE_NAME_2); assertNotNull(config); batteryConfig = config.getGameModeConfiguration(GameManager.GAME_MODE_BATTERY); assertNotNull(batteryConfig); @@ -292,7 +292,7 @@ public class GameManagerServiceSettingsTests { assertEquals(performanceConfig.getFpsStr(), "60"); assertTrue(performanceConfig.getUseAngle()); - config = settings.getConfigOverride(PACKAGE_NAME_4); + config = settings.getConfigOverrideLocked(PACKAGE_NAME_4); assertNotNull(config); customConfig = config.getGameModeConfiguration(GameManager.GAME_MODE_CUSTOM); assertNotNull(customConfig); diff --git a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java index 605fed09dd9f..c7efa318af99 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/AuthServiceTest.java @@ -45,7 +45,6 @@ import android.content.pm.PackageManager; import android.content.res.Resources; import android.hardware.biometrics.AuthenticationStateListener; import android.hardware.biometrics.BiometricManager; -import android.hardware.biometrics.Flags; import android.hardware.biometrics.IBiometricEnabledOnKeyguardCallback; import android.hardware.biometrics.IBiometricService; import android.hardware.biometrics.IBiometricServiceReceiver; @@ -504,23 +503,9 @@ public class AuthServiceTest { eq(callback)); } - @Test(expected = UnsupportedOperationException.class) - public void testGetLastAuthenticationTime_flaggedOff_throwsUnsupportedOperationException() - throws Exception { - mSetFlagsRule.disableFlags(Flags.FLAG_LAST_AUTHENTICATION_TIME); - setInternalAndTestBiometricPermissions(mContext, true /* hasPermission */); - - mAuthService = new AuthService(mContext, mInjector); - mAuthService.onStart(); - - mAuthService.mImpl.getLastAuthenticationTime(0, - BiometricManager.Authenticators.BIOMETRIC_STRONG); - } - @Test - public void testGetLastAuthenticationTime_flaggedOn_callsBiometricService() + public void testGetLastAuthenticationTime_callsBiometricService() throws Exception { - mSetFlagsRule.enableFlags(Flags.FLAG_LAST_AUTHENTICATION_TIME); setInternalAndTestBiometricPermissions(mContext, true /* hasPermission */); mAuthService = new AuthService(mContext, mInjector); diff --git a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java index 88829c1a99b3..8b6a4a22d691 100644 --- a/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java +++ b/services/tests/servicestests/src/com/android/server/biometrics/BiometricServiceTest.java @@ -1973,20 +1973,9 @@ public class BiometricServiceTest { verifyNoMoreInteractions(callback); } - @Test(expected = UnsupportedOperationException.class) - public void testGetLastAuthenticationTime_flagOff_throwsUnsupportedOperationException() - throws RemoteException { - mSetFlagsRule.disableFlags(Flags.FLAG_LAST_AUTHENTICATION_TIME); - - mBiometricService = new BiometricService(mContext, mInjector, mBiometricHandlerProvider); - mBiometricService.mImpl.getLastAuthenticationTime(0, Authenticators.BIOMETRIC_STRONG); - } - @Test - public void testGetLastAuthenticationTime_flagOn_callsKeystoreAuthorization() + public void testGetLastAuthenticationTime_callsKeystoreAuthorization() throws RemoteException { - mSetFlagsRule.enableFlags(Flags.FLAG_LAST_AUTHENTICATION_TIME); - final int[] hardwareAuthenticators = new int[] { HardwareAuthenticatorType.PASSWORD, HardwareAuthenticatorType.FINGERPRINT diff --git a/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java b/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java index 87c9db2fe565..acbce36c3d7f 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/BaseLockSettingsServiceTests.java @@ -354,14 +354,20 @@ public abstract class BaseLockSettingsServiceTests { @After public void tearDown_baseServices() throws Exception { - mStorage.closeDatabase(); + if (mStorage != null) { + mStorage.closeDatabase(); + } File db = InstrumentationRegistry.getContext().getDatabasePath("locksettings.db"); assertTrue(!db.exists() || db.delete()); - File storageDir = mStorage.mStorageDir; - assertTrue(FileUtils.deleteContents(storageDir)); + if (mStorage != null) { + File storageDir = mStorage.mStorageDir; + assertTrue(FileUtils.deleteContents(storageDir)); + } - mPasswordSlotManager.cleanup(); + if (mPasswordSlotManager != null) { + mPasswordSlotManager.cleanup(); + } } protected void flushHandlerTasks() { diff --git a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java index 02b86db6ab6f..387b89a41eba 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/LockSettingsStorageTests.java @@ -124,7 +124,9 @@ public class LockSettingsStorageTests { @After public void tearDown() throws Exception { - mStorage.closeDatabase(); + if (mStorage != null) { + mStorage.closeDatabase(); + } } @Test diff --git a/services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTests.java b/services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTests.java index 2faf6a2b29d1..2c2b9374fdf9 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTests.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/PasswordSlotManagerTests.java @@ -49,7 +49,9 @@ public class PasswordSlotManagerTests { @After public void tearDown() throws Exception { - mManager.cleanup(); + if (mManager != null) { + mManager.cleanup(); + } } @Test diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java index 1514de04fb08..5add74e5b69e 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/KeySyncTaskTest.java @@ -156,9 +156,12 @@ public class KeySyncTaskTest { @After public void tearDown() { - mRecoverableKeyStoreDb.close(); - mDatabaseFile.delete(); - + if (mRecoverableKeyStoreDb != null) { + mRecoverableKeyStoreDb.close(); + } + if (mDatabaseFile != null) { + mDatabaseFile.delete(); + } File file = new File(InstrumentationRegistry.getTargetContext().getFilesDir(), SNAPSHOT_TOP_LEVEL_DIRECTORY); FileUtils.deleteContentsAndDir(file); diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/PlatformKeyManagerTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/PlatformKeyManagerTest.java index c09e09c8404f..46eaba7dace6 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/PlatformKeyManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/PlatformKeyManagerTest.java @@ -117,8 +117,12 @@ public class PlatformKeyManagerTest { @After public void tearDown() { - mRecoverableKeyStoreDb.close(); - mDatabaseFile.delete(); + if (mRecoverableKeyStoreDb != null) { + mRecoverableKeyStoreDb.close(); + } + if (mDatabaseFile != null) { + mDatabaseFile.delete(); + } } @Test diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java index 64130266b2c4..e6a6e36e75d6 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyGeneratorTest.java @@ -89,8 +89,12 @@ public class RecoverableKeyGeneratorTest { keyStore.load(/*param=*/ null); keyStore.deleteEntry(WRAPPING_KEY_ALIAS); - mRecoverableKeyStoreDb.close(); - mDatabaseFile.delete(); + if (mRecoverableKeyStoreDb != null) { + mRecoverableKeyStoreDb.close(); + } + if (mDatabaseFile != null) { + mDatabaseFile.delete(); + } } @Test diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java index 7641fb957cc8..878c838e734b 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/RecoverableKeyStoreManagerTest.java @@ -230,9 +230,15 @@ public class RecoverableKeyStoreManagerTest { @After public void tearDown() { - mRemoteLockscreenValidationSessionStorage.finishSession(mUserId); - mRecoverableKeyStoreDb.close(); - mDatabaseFile.delete(); + if (mRemoteLockscreenValidationSessionStorage != null) { + mRemoteLockscreenValidationSessionStorage.finishSession(mUserId); + } + if (mRecoverableKeyStoreDb != null) { + mRecoverableKeyStoreDb.close(); + } + if (mDatabaseFile != null) { + mDatabaseFile.delete(); + } } @Test diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java index bbd9223718ae..fb98fab52ca0 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbHelperTest.java @@ -18,6 +18,8 @@ package com.android.server.locksettings.recoverablekeystore.storage; import static com.google.common.truth.Truth.assertThat; +import static java.nio.charset.StandardCharsets.UTF_8; + import android.content.ContentValues; import android.content.Context; import android.database.sqlite.SQLiteDatabase; @@ -36,8 +38,6 @@ import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; -import static java.nio.charset.StandardCharsets.UTF_8; - @SmallTest @RunWith(AndroidJUnit4.class) public class RecoverableKeyStoreDbHelperTest { @@ -110,7 +110,9 @@ public class RecoverableKeyStoreDbHelperTest { @After public void tearDown() throws Exception { - mDatabase.close(); + if (mDatabase != null) { + mDatabase.close(); + } } private void createV2Tables() throws Exception { diff --git a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java index 8bc14fc54ae1..a77d8bcd3875 100644 --- a/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java +++ b/services/tests/servicestests/src/com/android/server/locksettings/recoverablekeystore/storage/RecoverableKeyStoreDbTest.java @@ -72,8 +72,12 @@ public class RecoverableKeyStoreDbTest { @After public void tearDown() { - mRecoverableKeyStoreDb.close(); - mDatabaseFile.delete(); + if (mRecoverableKeyStoreDb != null) { + mRecoverableKeyStoreDb.close(); + } + if (mDatabaseFile != null) { + mDatabaseFile.delete(); + } } @Test diff --git a/services/tests/servicestests/src/com/android/server/media/projection/OWNERS b/services/tests/servicestests/src/com/android/server/media/projection/OWNERS index 832bcd9d70e6..3caf7faa13ec 100644 --- a/services/tests/servicestests/src/com/android/server/media/projection/OWNERS +++ b/services/tests/servicestests/src/com/android/server/media/projection/OWNERS @@ -1 +1,2 @@ +# Bug component: 1345447 include /media/java/android/media/projection/OWNERS diff --git a/services/tests/servicestests/src/com/android/server/memory/OWNERS b/services/tests/servicestests/src/com/android/server/memory/OWNERS new file mode 100644 index 000000000000..4df08c1fbc2e --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/memory/OWNERS @@ -0,0 +1,3 @@ +include /MEMORY_OWNERS + +per-file ZramMaintenanceTest.kt = kawasin@google.com diff --git a/services/tests/servicestests/src/com/android/server/memory/ZramMaintenanceTest.kt b/services/tests/servicestests/src/com/android/server/memory/ZramMaintenanceTest.kt new file mode 100644 index 000000000000..1f59f45b05bf --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/memory/ZramMaintenanceTest.kt @@ -0,0 +1,154 @@ +/* + * Copyright (C) 2024 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.memory + +import android.app.job.JobInfo +import android.app.job.JobParameters +import android.app.job.JobScheduler +import android.os.IMmd +import android.os.PersistableBundle +import android.os.RemoteException +import android.testing.TestableContext +import androidx.test.filters.SmallTest +import androidx.test.platform.app.InstrumentationRegistry + +import com.google.common.truth.Truth.assertThat + +import org.junit.Before +import org.junit.Test +import org.junit.runner.RunWith +import org.junit.runners.JUnit4 +import org.mockito.ArgumentCaptor +import org.mockito.Captor +import org.mockito.Mock +import org.mockito.Mockito.any +import org.mockito.Mockito.never +import org.mockito.Mockito.times +import org.mockito.Mockito.verify +import org.mockito.Mockito.`when` +import org.mockito.MockitoAnnotations + +private fun generateJobParameters(jobId: Int, extras: PersistableBundle): JobParameters { + return JobParameters( + null, "", jobId, extras, null, null, 0, false, false, false, null, null, null + ) +} + +@SmallTest +@RunWith(JUnit4::class) +class ZramMaintenanceTest { + private val context = TestableContext(InstrumentationRegistry.getInstrumentation().context) + + @Captor + private lateinit var jobInfoCaptor: ArgumentCaptor<JobInfo> + + @Mock + private lateinit var mockJobScheduler: JobScheduler + + @Mock + private lateinit var mockMmd: IMmd + + @Before + @Throws(RemoteException::class) + fun setUp() { + MockitoAnnotations.initMocks(this) + context.addMockSystemService(JobScheduler::class.java, mockJobScheduler) + } + + @Test + fun startZramMaintenance() { + ZramMaintenance.startZramMaintenance(context) + + verify(mockJobScheduler, times(1)).schedule(jobInfoCaptor.capture()) + val job = jobInfoCaptor.value + assertThat(job.id).isEqualTo(ZramMaintenance.JOB_ID) + assertThat(job.extras.getBoolean(ZramMaintenance.KEY_CHECK_STATUS)).isTrue() + } + + @Test + fun startJobForFirstTime() { + val extras = PersistableBundle() + extras.putBoolean(ZramMaintenance.KEY_CHECK_STATUS, true) + val params = generateJobParameters( + ZramMaintenance.JOB_ID, + extras, + ) + `when`(mockMmd.isZramMaintenanceSupported()).thenReturn(true) + + ZramMaintenance.startJob(context, params, mockMmd) + + verify(mockMmd, times(1)).isZramMaintenanceSupported() + verify(mockMmd, times(1)).doZramMaintenanceAsync() + verify(mockJobScheduler, times(1)).schedule(jobInfoCaptor.capture()) + val nextJob = jobInfoCaptor.value + assertThat(nextJob.id).isEqualTo(ZramMaintenance.JOB_ID) + assertThat(nextJob.extras.getBoolean(ZramMaintenance.KEY_CHECK_STATUS)).isFalse() + } + + @Test + fun startJobWithoutCheckStatus() { + val extras = PersistableBundle() + extras.putBoolean(ZramMaintenance.KEY_CHECK_STATUS, false) + val params = generateJobParameters( + ZramMaintenance.JOB_ID, + extras, + ) + + ZramMaintenance.startJob(context, params, mockMmd) + + verify(mockMmd, never()).isZramMaintenanceSupported() + verify(mockMmd, times(1)).doZramMaintenanceAsync() + verify(mockJobScheduler, times(1)).schedule(jobInfoCaptor.capture()) + val nextJob = jobInfoCaptor.value + assertThat(nextJob.id).isEqualTo(ZramMaintenance.JOB_ID) + assertThat(nextJob.extras.getBoolean(ZramMaintenance.KEY_CHECK_STATUS)).isFalse() + } + + @Test + fun startJobZramIsDisabled() { + val extras = PersistableBundle() + extras.putBoolean(ZramMaintenance.KEY_CHECK_STATUS, true) + val params = generateJobParameters( + ZramMaintenance.JOB_ID, + extras, + ) + `when`(mockMmd.isZramMaintenanceSupported()).thenReturn(false) + + ZramMaintenance.startJob(context, params, mockMmd) + + verify(mockMmd, times(1)).isZramMaintenanceSupported() + verify(mockMmd, never()).doZramMaintenanceAsync() + verify(mockJobScheduler, never()).schedule(any()) + } + + @Test + fun startJobMmdIsNotReadyYet() { + val extras = PersistableBundle() + extras.putBoolean(ZramMaintenance.KEY_CHECK_STATUS, true) + val params = generateJobParameters( + ZramMaintenance.JOB_ID, + extras, + ) + + ZramMaintenance.startJob(context, params, null) + + verify(mockJobScheduler, times(1)).schedule(jobInfoCaptor.capture()) + val nextJob = jobInfoCaptor.value + assertThat(nextJob.id).isEqualTo(ZramMaintenance.JOB_ID) + assertThat(nextJob.extras.getBoolean(ZramMaintenance.KEY_CHECK_STATUS)).isTrue() + } +}
\ No newline at end of file diff --git a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java index a0f2395f5203..d70ffd2ec050 100644 --- a/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java +++ b/services/tests/servicestests/src/com/android/server/pm/ShortcutManagerTest1.java @@ -159,7 +159,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Test for the first launch path, no settings file available. */ - public void testFirstInitialize() { + public void FirstInitialize() { assertResetTimes(START_TIME, START_TIME + INTERVAL); } @@ -167,7 +167,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { * Test for {@link ShortcutService#getLastResetTimeLocked()} and * {@link ShortcutService#getNextResetTimeLocked()}. */ - public void testUpdateAndGetNextResetTimeLocked() { + public void UpdateAndGetNextResetTimeLocked() { assertResetTimes(START_TIME, START_TIME + INTERVAL); // Advance clock. @@ -196,7 +196,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Test for the restoration from saved file. */ - public void testInitializeFromSavedFile() { + public void InitializeFromSavedFile() { mInjectedCurrentTimeMillis = START_TIME + 4 * INTERVAL + 50; assertResetTimes(START_TIME + 4 * INTERVAL, START_TIME + 5 * INTERVAL); @@ -220,7 +220,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // TODO Add various broken cases. } - public void testLoadConfig() { + public void LoadConfig() { mService.updateConfigurationLocked( ConfigConstants.KEY_RESET_INTERVAL_SEC + "=123," + ConfigConstants.KEY_MAX_SHORTCUTS + "=4," @@ -261,22 +261,22 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // === Test for app side APIs === /** Test for {@link android.content.pm.ShortcutManager#getMaxShortcutCountForActivity()} */ - public void testGetMaxDynamicShortcutCount() { + public void GetMaxDynamicShortcutCount() { assertEquals(MAX_SHORTCUTS, mManager.getMaxShortcutCountForActivity()); } /** Test for {@link android.content.pm.ShortcutManager#getRemainingCallCount()} */ - public void testGetRemainingCallCount() { + public void GetRemainingCallCount() { assertEquals(MAX_UPDATES_PER_INTERVAL, mManager.getRemainingCallCount()); } - public void testGetIconMaxDimensions() { + public void GetIconMaxDimensions() { assertEquals(MAX_ICON_DIMENSION, mManager.getIconMaxWidth()); assertEquals(MAX_ICON_DIMENSION, mManager.getIconMaxHeight()); } /** Test for {@link android.content.pm.ShortcutManager#getRateLimitResetTime()} */ - public void testGetRateLimitResetTime() { + public void GetRateLimitResetTime() { assertEquals(START_TIME + INTERVAL, mManager.getRateLimitResetTime()); mInjectedCurrentTimeMillis = START_TIME + 4 * INTERVAL + 50; @@ -284,7 +284,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertEquals(START_TIME + 5 * INTERVAL, mManager.getRateLimitResetTime()); } - public void testSetDynamicShortcuts() { + public void SetDynamicShortcuts() { setCaller(CALLING_PACKAGE_1, USER_0); final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.icon1); @@ -354,7 +354,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testAddDynamicShortcuts() { + public void AddDynamicShortcuts() { setCaller(CALLING_PACKAGE_1, USER_0); final ShortcutInfo si1 = makeShortcut("shortcut1"); @@ -402,7 +402,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testPushDynamicShortcut() { + public void PushDynamicShortcut() { // Change the max number of shortcuts. mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=5," + ShortcutService.ConfigConstants.KEY_SAVE_DELAY_MILLIS + "=1"); @@ -543,7 +543,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { eq(CALLING_PACKAGE_1), eq("s9"), eq(USER_0)); } - public void testPushDynamicShortcut_CallsToUsageStatsManagerAreThrottled() + public void PushDynamicShortcut_CallsToUsageStatsManagerAreThrottled() throws InterruptedException { mService.updateConfigurationLocked( ShortcutService.ConfigConstants.KEY_SAVE_DELAY_MILLIS + "=500"); @@ -594,7 +594,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { eq(CALLING_PACKAGE_2), any(), eq(USER_0)); } - public void testUnlimitedCalls() { + public void UnlimitedCalls() { setCaller(CALLING_PACKAGE_1, USER_0); final ShortcutInfo si1 = makeShortcut("shortcut1"); @@ -625,7 +625,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertEquals(3, mManager.getRemainingCallCount()); } - public void testPublishWithNoActivity() { + public void PublishWithNoActivity() { // If activity is not explicitly set, use the default one. mRunningUsers.put(USER_10, true); @@ -731,7 +731,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testPublishWithNoActivity_noMainActivityInPackage() { + public void PublishWithNoActivity_noMainActivityInPackage() { mRunningUsers.put(USER_10, true); runWithCaller(CALLING_PACKAGE_2, USER_10, () -> { @@ -750,7 +750,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testDeleteDynamicShortcuts() { + public void DeleteDynamicShortcuts() { final ShortcutInfo si1 = makeShortcut("shortcut1"); final ShortcutInfo si2 = makeShortcut("shortcut2"); final ShortcutInfo si3 = makeShortcut("shortcut3"); @@ -791,7 +791,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertEquals(2, mManager.getRemainingCallCount()); } - public void testDeleteAllDynamicShortcuts() { + public void DeleteAllDynamicShortcuts() { final ShortcutInfo si1 = makeShortcut("shortcut1"); final ShortcutInfo si2 = makeShortcut("shortcut2"); final ShortcutInfo si3 = makeShortcut("shortcut3"); @@ -820,7 +820,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertEquals(1, mManager.getRemainingCallCount()); } - public void testIcons() throws IOException { + public void Icons() throws IOException { final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32); final Icon res64x64 = Icon.createWithResource(getTestContext(), R.drawable.black_64x64); final Icon res512x512 = Icon.createWithResource(getTestContext(), R.drawable.black_512x512); @@ -1034,7 +1034,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { */ } - public void testCleanupDanglingBitmaps() throws Exception { + public void CleanupDanglingBitmaps() throws Exception { assertBitmapDirectories(USER_0, EMPTY_STRINGS); assertBitmapDirectories(USER_10, EMPTY_STRINGS); @@ -1203,7 +1203,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { maxSize)); } - public void testShrinkBitmap() { + public void ShrinkBitmap() { checkShrinkBitmap(32, 32, R.drawable.black_512x512, 32); checkShrinkBitmap(511, 511, R.drawable.black_512x512, 511); checkShrinkBitmap(512, 512, R.drawable.black_512x512, 512); @@ -1226,7 +1226,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { return out.getFile(); } - public void testOpenIconFileForWrite() throws IOException { + public void OpenIconFileForWrite() throws IOException { mInjectedCurrentTimeMillis = 1000; final File p10_1_1 = openIconFileForWriteAndGetPath(10, CALLING_PACKAGE_1); @@ -1300,7 +1300,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertFalse(p11_1_3.getName().contains("_")); } - public void testUpdateShortcuts() { + public void UpdateShortcuts() { runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { assertTrue(mManager.setDynamicShortcuts(list( makeShortcut("s1"), @@ -1431,7 +1431,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testUpdateShortcuts_icons() { + public void UpdateShortcuts_icons() { runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { assertTrue(mManager.setDynamicShortcuts(list( makeShortcut("s1") @@ -1525,7 +1525,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testShortcutManagerGetShortcuts_shortcutTypes() { + public void ShortcutManagerGetShortcuts_shortcutTypes() { // Create 3 manifest and 3 dynamic shortcuts addManifestShortcutResource( @@ -1616,7 +1616,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_CACHED), "s1", "s2"); } - public void testCachedShortcuts() { + public void CachedShortcuts() { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list(makeShortcut("s1"), makeLongLivedShortcut("s2"), makeLongLivedShortcut("s3"), @@ -1700,7 +1700,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { "s2"); } - public void testCachedShortcuts_accessShortcutsPermission() { + public void CachedShortcuts_accessShortcutsPermission() { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list(makeShortcut("s1"), makeLongLivedShortcut("s2"), makeLongLivedShortcut("s3"), @@ -1742,7 +1742,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertShortcutIds(mManager.getShortcuts(ShortcutManager.FLAG_MATCH_CACHED), "s3"); } - public void testCachedShortcuts_canPassShortcutLimit() { + public void CachedShortcuts_canPassShortcutLimit() { // Change the max number of shortcuts. mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=4"); @@ -1780,7 +1780,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // === Test for launcher side APIs === - public void testGetShortcuts() { + public void GetShortcuts() { // Set up shortcuts. @@ -1997,7 +1997,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { "s1", "s3"); } - public void testGetShortcuts_shortcutKinds() throws Exception { + public void GetShortcuts_shortcutKinds() throws Exception { // Create 3 manifest and 3 dynamic shortcuts addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), @@ -2108,7 +2108,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testGetShortcuts_resolveStrings() throws Exception { + public void GetShortcuts_resolveStrings() throws Exception { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { ShortcutInfo si = new ShortcutInfo.Builder(mClientContext) .setId("id") @@ -2156,7 +2156,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testGetShortcuts_personsFlag() { + public void GetShortcuts_personsFlag() { ShortcutInfo s = new ShortcutInfo.Builder(mClientContext, "id") .setShortLabel("label") .setActivity(new ComponentName(mClientContext, ShortcutActivity2.class)) @@ -2204,7 +2204,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } // TODO resource - public void testGetShortcutInfo() { + public void GetShortcutInfo() { // Create shortcuts. setCaller(CALLING_PACKAGE_1); final ShortcutInfo s1_1 = makeShortcut( @@ -2279,7 +2279,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertEquals("ABC", findById(list, "s1").getTitle()); } - public void testPinShortcutAndGetPinnedShortcuts() { + public void PinShortcutAndGetPinnedShortcuts() { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { final ShortcutInfo s1_1 = makeShortcutWithTimestamp("s1", 1000); final ShortcutInfo s1_2 = makeShortcutWithTimestamp("s2", 2000); @@ -2360,7 +2360,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { * This is similar to the above test, except it used "disable" instead of "remove". It also * does "enable". */ - public void testDisableAndEnableShortcuts() { + public void DisableAndEnableShortcuts() { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { final ShortcutInfo s1_1 = makeShortcutWithTimestamp("s1", 1000); final ShortcutInfo s1_2 = makeShortcutWithTimestamp("s2", 2000); @@ -2485,7 +2485,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testDisableShortcuts_thenRepublish() { + public void DisableShortcuts_thenRepublish() { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list( makeShortcut("s1"), makeShortcut("s2"), makeShortcut("s3")))); @@ -2555,7 +2555,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testPinShortcutAndGetPinnedShortcuts_multi() { + public void PinShortcutAndGetPinnedShortcuts_multi() { // Create some shortcuts. runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list( @@ -2831,7 +2831,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testPinShortcutAndGetPinnedShortcuts_assistant() { + public void PinShortcutAndGetPinnedShortcuts_assistant() { // Create some shortcuts. runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list( @@ -2887,7 +2887,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testPinShortcutAndGetPinnedShortcuts_crossProfile_plusLaunch() { + public void PinShortcutAndGetPinnedShortcuts_crossProfile_plusLaunch() { // Create some shortcuts. runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list( @@ -3476,7 +3476,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testStartShortcut() { + public void StartShortcut() { // Create some shortcuts. runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { final ShortcutInfo s1_1 = makeShortcut( @@ -3611,7 +3611,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // TODO Check extra, etc } - public void testLauncherCallback() throws Throwable { + public void LauncherCallback() throws Throwable { // Disable throttling for this test. mService.updateConfigurationLocked( ConfigConstants.KEY_MAX_UPDATES_PER_INTERVAL + "=99999999," @@ -3777,7 +3777,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { .isEmpty(); } - public void testLauncherCallback_crossProfile() throws Throwable { + public void LauncherCallback_crossProfile() throws Throwable { prepareCrossProfileDataSet(); final Handler h = new Handler(Looper.getMainLooper()); @@ -3900,7 +3900,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // === Test for persisting === - public void testSaveAndLoadUser_empty() { + public void SaveAndLoadUser_empty() { assertTrue(mManager.setDynamicShortcuts(list())); Log.i(TAG, "Saved state"); @@ -3917,7 +3917,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Try save and load, also stop/start the user. */ - public void testSaveAndLoadUser() { + public void SaveAndLoadUser() { // First, create some shortcuts and save. runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x16); @@ -4058,7 +4058,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // TODO Check all other fields } - public void testLoadCorruptedShortcuts() throws Exception { + public void LoadCorruptedShortcuts() throws Exception { initService(); addPackage("com.android.chrome", 0, 0); @@ -4072,7 +4072,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertNull(ShortcutPackage.loadFromFile(mService, user, corruptedShortcutPackage, false)); } - public void testSaveCorruptAndLoadUser() throws Exception { + public void SaveCorruptAndLoadUser() throws Exception { // First, create some shortcuts and save. runWithCaller(CALLING_PACKAGE_1, UserHandle.USER_SYSTEM, () -> { final Icon icon1 = Icon.createWithResource(getTestContext(), R.drawable.black_64x16); @@ -4228,7 +4228,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { // TODO Check all other fields } - public void testCleanupPackage() { + public void CleanupPackage() { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list( makeShortcut("s0_1")))); @@ -4505,7 +4505,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mService.saveDirtyInfo(); } - public void testCleanupPackage_republishManifests() { + public void CleanupPackage_republishManifests() { addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), R.xml.shortcut_2); @@ -4573,7 +4573,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testHandleGonePackage_crossProfile() { + public void HandleGonePackage_crossProfile() { // Create some shortcuts. runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list( @@ -4845,7 +4845,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertEquals(expected, spi.canRestoreTo(mService, pi, true)); } - public void testCanRestoreTo() { + public void CanRestoreTo() { addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "sig1"); addPackage(CALLING_PACKAGE_2, CALLING_UID_2, 10, "sig1", "sig2"); addPackage(CALLING_PACKAGE_3, CALLING_UID_3, 10, "sig1"); @@ -4908,7 +4908,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { checkCanRestoreTo(DISABLED_REASON_BACKUP_NOT_SUPPORTED, spi3, true, 10, true, "sig1"); } - public void testHandlePackageDelete() { + public void HandlePackageDelete() { checkHandlePackageDeleteInner((userId, packageName) -> { uninstallPackage(userId, packageName); mService.mPackageMonitor.onReceive(getTestContext(), @@ -4916,7 +4916,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testHandlePackageDisable() { + public void HandlePackageDisable() { checkHandlePackageDeleteInner((userId, packageName) -> { disablePackage(userId, packageName); mService.mPackageMonitor.onReceive(getTestContext(), @@ -5048,7 +5048,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } /** Almost ame as testHandlePackageDelete, except it doesn't uninstall packages. */ - public void testHandlePackageClearData() { + public void HandlePackageClearData() { final Icon bmp32x32 = Icon.createWithBitmap(BitmapFactory.decodeResource( getTestContext().getResources(), R.drawable.black_32x32)); setCaller(CALLING_PACKAGE_1, USER_0); @@ -5124,7 +5124,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertTrue(bitmapDirectoryExists(CALLING_PACKAGE_3, USER_10)); } - public void testHandlePackageClearData_manifestRepublished() { + public void HandlePackageClearData_manifestRepublished() { mRunningUsers.put(USER_10, true); @@ -5166,7 +5166,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testHandlePackageUpdate() throws Throwable { + public void HandlePackageUpdate() throws Throwable { // Set up shortcuts and launchers. final Icon res32x32 = Icon.createWithResource(getTestContext(), R.drawable.black_32x32); @@ -5340,7 +5340,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Test the case where an updated app has resource IDs changed. */ - public void testHandlePackageUpdate_resIdChanged() throws Exception { + public void HandlePackageUpdate_resIdChanged() throws Exception { final Icon icon1 = Icon.createWithResource(getTestContext(), /* res ID */ 1000); final Icon icon2 = Icon.createWithResource(getTestContext(), /* res ID */ 1001); @@ -5415,7 +5415,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testHandlePackageUpdate_systemAppUpdate() { + public void HandlePackageUpdate_systemAppUpdate() { // Package1 is a system app. Package 2 is not a system app, so it's not scanned // in this test at all. @@ -5521,7 +5521,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mService.getUserShortcutsLocked(USER_0).getLastAppScanOsFingerprint()); } - public void testHandlePackageChanged() { + public void HandlePackageChanged() { final ComponentName ACTIVITY1 = new ComponentName(CALLING_PACKAGE_1, "act1"); final ComponentName ACTIVITY2 = new ComponentName(CALLING_PACKAGE_1, "act2"); @@ -5651,7 +5651,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testHandlePackageUpdate_activityNoLongerMain() throws Throwable { + public void HandlePackageUpdate_activityNoLongerMain() throws Throwable { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertTrue(mManager.setDynamicShortcuts(list( makeShortcutWithActivity("s1a", @@ -5737,7 +5737,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { * - Unpinned dynamic shortcuts * - Bitmaps */ - public void testBackupAndRestore() { + public void BackupAndRestore() { assertFileNotExists("user-0/shortcut_dump/restore-0-start.txt"); assertFileNotExists("user-0/shortcut_dump/restore-1-payload.xml"); @@ -5758,7 +5758,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { checkBackupAndRestore_success(/*firstRestore=*/ true); } - public void testBackupAndRestore_backupRestoreTwice() { + public void BackupAndRestore_backupRestoreTwice() { prepareForBackupTest(); checkBackupAndRestore_success(/*firstRestore=*/ true); @@ -5774,7 +5774,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { checkBackupAndRestore_success(/*firstRestore=*/ false); } - public void testBackupAndRestore_restoreToNewVersion() { + public void BackupAndRestore_restoreToNewVersion() { prepareForBackupTest(); addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 2); @@ -5783,7 +5783,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { checkBackupAndRestore_success(/*firstRestore=*/ true); } - public void testBackupAndRestore_restoreToSuperSetSignatures() { + public void BackupAndRestore_restoreToSuperSetSignatures() { prepareForBackupTest(); // Change package signatures. @@ -5980,7 +5980,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testBackupAndRestore_publisherWrongSignature() { + public void BackupAndRestore_publisherWrongSignature() { prepareForBackupTest(); addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "sigx"); // different signature @@ -5988,7 +5988,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { checkBackupAndRestore_publisherNotRestored(ShortcutInfo.DISABLED_REASON_SIGNATURE_MISMATCH); } - public void testBackupAndRestore_publisherNoLongerBackupTarget() { + public void BackupAndRestore_publisherNoLongerBackupTarget() { prepareForBackupTest(); updatePackageInfo(CALLING_PACKAGE_1, @@ -6117,7 +6117,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testBackupAndRestore_launcherLowerVersion() { + public void BackupAndRestore_launcherLowerVersion() { prepareForBackupTest(); addPackage(LAUNCHER_1, LAUNCHER_UID_1, 0); // Lower version @@ -6126,7 +6126,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { checkBackupAndRestore_success(/*firstRestore=*/ true); } - public void testBackupAndRestore_launcherWrongSignature() { + public void BackupAndRestore_launcherWrongSignature() { prepareForBackupTest(); addPackage(LAUNCHER_1, LAUNCHER_UID_1, 10, "sigx"); // different signature @@ -6134,7 +6134,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { checkBackupAndRestore_launcherNotRestored(true); } - public void testBackupAndRestore_launcherNoLongerBackupTarget() { + public void BackupAndRestore_launcherNoLongerBackupTarget() { prepareForBackupTest(); updatePackageInfo(LAUNCHER_1, @@ -6239,7 +6239,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testBackupAndRestore_launcherAndPackageNoLongerBackupTarget() { + public void BackupAndRestore_launcherAndPackageNoLongerBackupTarget() { prepareForBackupTest(); updatePackageInfo(CALLING_PACKAGE_1, @@ -6337,7 +6337,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testBackupAndRestore_disabled() { + public void BackupAndRestore_disabled() { prepareCrossProfileDataSet(); // Before doing backup & restore, disable s1. @@ -6402,7 +6402,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } - public void testBackupAndRestore_manifestRePublished() { + public void BackupAndRestore_manifestRePublished() { // Publish two manifest shortcuts. addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), @@ -6493,7 +6493,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { * logcat. * - if it has allowBackup=false, we don't touch any of the existing shortcuts. */ - public void testBackupAndRestore_appAlreadyInstalledWhenRestored() { + public void BackupAndRestore_appAlreadyInstalledWhenRestored() { // Pre-backup. Same as testBackupAndRestore_manifestRePublished(). // Publish two manifest shortcuts. @@ -6618,7 +6618,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Test for restoring the pre-P backup format. */ - public void testBackupAndRestore_api27format() throws Exception { + public void BackupAndRestore_api27format() throws Exception { final byte[] payload = readTestAsset("shortcut/shortcut_api27_backup.xml").getBytes(); addPackage(CALLING_PACKAGE_1, CALLING_UID_1, 10, "22222"); @@ -6656,7 +6656,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } - public void testSaveAndLoad_crossProfile() { + public void SaveAndLoad_crossProfile() { prepareCrossProfileDataSet(); dumpsysOnLogcat("Before save & load"); @@ -6859,7 +6859,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { .getPackageUserId()); } - public void testOnApplicationActive_permission() { + public void OnApplicationActive_permission() { assertExpectException(SecurityException.class, "Missing permission", () -> mManager.onApplicationActive(CALLING_PACKAGE_1, USER_0)); @@ -6868,7 +6868,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mManager.onApplicationActive(CALLING_PACKAGE_1, USER_0); } - public void testGetShareTargets_permission() { + public void GetShareTargets_permission() { addPackage(CHOOSER_ACTIVITY_PACKAGE, CHOOSER_ACTIVITY_UID, 10, "sig1"); mInjectedChooserActivity = ComponentName.createRelative(CHOOSER_ACTIVITY_PACKAGE, ".ChooserActivity"); @@ -6887,7 +6887,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testHasShareTargets_permission() { + public void HasShareTargets_permission() { assertExpectException(SecurityException.class, "Missing permission", () -> mManager.hasShareTargets(CALLING_PACKAGE_1)); @@ -6896,7 +6896,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mManager.hasShareTargets(CALLING_PACKAGE_1); } - public void testisSharingShortcut_permission() throws IntentFilter.MalformedMimeTypeException { + public void isSharingShortcut_permission() throws IntentFilter.MalformedMimeTypeException { setCaller(LAUNCHER_1, USER_0); IntentFilter filter_any = new IntentFilter(); @@ -6911,18 +6911,18 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { mManager.hasShareTargets(CALLING_PACKAGE_1); } - public void testDumpsys_crossProfile() { + public void Dumpsys_crossProfile() { prepareCrossProfileDataSet(); dumpsysOnLogcat("test1", /* force= */ true); } - public void testDumpsys_withIcons() throws IOException { - testIcons(); + public void Dumpsys_withIcons() throws IOException { + Icons(); // Dump after having some icons. dumpsysOnLogcat("test1", /* force= */ true); } - public void testManifestShortcut_publishOnUnlockUser() { + public void ManifestShortcut_publishOnUnlockUser() { addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), R.xml.shortcut_1); @@ -7136,7 +7136,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertNull(mService.getPackageShortcutForTest(LAUNCHER_1, USER_0)); } - public void testManifestShortcut_publishOnBroadcast() { + public void ManifestShortcut_publishOnBroadcast() { // First, no packages are installed. uninstallPackage(USER_0, CALLING_PACKAGE_1); uninstallPackage(USER_0, CALLING_PACKAGE_2); @@ -7392,7 +7392,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_missingMandatoryFields() { + public void ManifestShortcuts_missingMandatoryFields() { // Start with no apps installed. uninstallPackage(USER_0, CALLING_PACKAGE_1); uninstallPackage(USER_0, CALLING_PACKAGE_2); @@ -7461,7 +7461,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_intentDefinitions() { + public void ManifestShortcuts_intentDefinitions() { addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), R.xml.shortcut_error_4); @@ -7603,7 +7603,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_checkAllFields() { + public void ManifestShortcuts_checkAllFields() { mService.handleUnlockUser(USER_0); // Package 1 updated, which has one valid manifest shortcut and one invalid. @@ -7708,7 +7708,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_localeChange() throws InterruptedException { + public void ManifestShortcuts_localeChange() throws InterruptedException { mService.handleUnlockUser(USER_0); // Package 1 updated, which has one valid manifest shortcut and one invalid. @@ -7812,7 +7812,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_updateAndDisabled_notPinned() { + public void ManifestShortcuts_updateAndDisabled_notPinned() { mService.handleUnlockUser(USER_0); // First, just publish a manifest shortcut. @@ -7852,7 +7852,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_updateAndDisabled_pinned() { + public void ManifestShortcuts_updateAndDisabled_pinned() { mService.handleUnlockUser(USER_0); // First, just publish a manifest shortcut. @@ -7908,7 +7908,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_duplicateInSingleActivity() { + public void ManifestShortcuts_duplicateInSingleActivity() { mService.handleUnlockUser(USER_0); // The XML has two shortcuts with the same ID. @@ -7933,7 +7933,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testManifestShortcuts_duplicateInTwoActivities() { + public void ManifestShortcuts_duplicateInTwoActivities() { mService.handleUnlockUser(USER_0); // ShortcutActivity has shortcut ms1 @@ -7985,7 +7985,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Manifest shortcuts cannot override shortcuts that were published via the APIs. */ - public void testManifestShortcuts_cannotOverrideNonManifest() { + public void ManifestShortcuts_cannotOverrideNonManifest() { mService.handleUnlockUser(USER_0); // Create a non-pinned dynamic shortcut and a non-dynamic pinned shortcut. @@ -8058,7 +8058,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Make sure the APIs won't work on manifest shortcuts. */ - public void testManifestShortcuts_immutable() { + public void ManifestShortcuts_immutable() { mService.handleUnlockUser(USER_0); // Create a non-pinned manifest shortcut, a pinned shortcut that was originally @@ -8151,7 +8151,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { /** * Make sure the APIs won't work on manifest shortcuts. */ - public void testManifestShortcuts_tooMany() { + public void ManifestShortcuts_tooMany() { // Change the max number of shortcuts. mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3"); @@ -8170,7 +8170,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testMaxShortcutCount_set() { + public void MaxShortcutCount_set() { // Change the max number of shortcuts. mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3"); @@ -8251,7 +8251,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testMaxShortcutCount_add() { + public void MaxShortcutCount_add() { // Change the max number of shortcuts. mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3"); @@ -8378,7 +8378,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testMaxShortcutCount_update() { + public void MaxShortcutCount_update() { // Change the max number of shortcuts. mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3"); @@ -8469,7 +8469,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testShortcutsPushedOutByManifest() { + public void ShortcutsPushedOutByManifest() { // Change the max number of shortcuts. mService.updateConfigurationLocked(ConfigConstants.KEY_MAX_SHORTCUTS + "=3"); @@ -8577,7 +8577,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testReturnedByServer() { + public void ReturnedByServer() { // Package 1 updated, with manifest shortcuts. addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), @@ -8623,7 +8623,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testIsForegroundDefaultLauncher_true() { + public void IsForegroundDefaultLauncher_true() { final int uid = 1024; setDefaultLauncher(UserHandle.USER_SYSTEM, "default"); @@ -8633,7 +8633,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } - public void testIsForegroundDefaultLauncher_defaultButNotForeground() { + public void IsForegroundDefaultLauncher_defaultButNotForeground() { final int uid = 1024; setDefaultLauncher(UserHandle.USER_SYSTEM, "default"); @@ -8642,7 +8642,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertFalse(mInternal.isForegroundDefaultLauncher("default", uid)); } - public void testIsForegroundDefaultLauncher_foregroundButNotDefault() { + public void IsForegroundDefaultLauncher_foregroundButNotDefault() { final int uid = 1024; setDefaultLauncher(UserHandle.USER_SYSTEM, "default"); @@ -8651,7 +8651,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { assertFalse(mInternal.isForegroundDefaultLauncher("another", uid)); } - public void testParseShareTargetsFromManifest() { + public void ParseShareTargetsFromManifest() { // These values must exactly match the content of shortcuts_share_targets.xml resource List<ShareTargetInfo> expectedValues = new ArrayList<>(); expectedValues.add(new ShareTargetInfo( @@ -8703,7 +8703,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } } - public void testShareTargetInfo_saveToXml() throws IOException, XmlPullParserException { + public void ShareTargetInfo_saveToXml() throws IOException, XmlPullParserException { List<ShareTargetInfo> expectedValues = new ArrayList<>(); expectedValues.add(new ShareTargetInfo( new ShareTargetInfo.TargetData[]{new ShareTargetInfo.TargetData( @@ -8769,7 +8769,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { } } - public void testIsSharingShortcut() throws IntentFilter.MalformedMimeTypeException { + public void IsSharingShortcut() throws IntentFilter.MalformedMimeTypeException { addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), R.xml.shortcut_share_targets); @@ -8819,7 +8819,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { filter_any)); } - public void testIsSharingShortcut_PinnedAndCachedOnlyShortcuts() + public void IsSharingShortcut_PinnedAndCachedOnlyShortcuts() throws IntentFilter.MalformedMimeTypeException { addManifestShortcutResource( new ComponentName(CALLING_PACKAGE_1, ShortcutActivity.class.getName()), @@ -8876,7 +8876,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { filter_any)); } - public void testAddingShortcuts_ExcludesHiddenFromLauncherShortcuts() { + public void AddingShortcuts_ExcludesHiddenFromLauncherShortcuts() { final ShortcutInfo s1 = makeShortcutExcludedFromLauncher("s1"); final ShortcutInfo s2 = makeShortcutExcludedFromLauncher("s2"); final ShortcutInfo s3 = makeShortcutExcludedFromLauncher("s3"); @@ -8897,7 +8897,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testUpdateShortcuts_ExcludesHiddenFromLauncherShortcuts() { + public void UpdateShortcuts_ExcludesHiddenFromLauncherShortcuts() { final ShortcutInfo s1 = makeShortcut("s1"); final ShortcutInfo s2 = makeShortcut("s2"); final ShortcutInfo s3 = makeShortcut("s3"); @@ -8910,7 +8910,7 @@ public class ShortcutManagerTest1 extends BaseShortcutManagerTest { }); } - public void testPinHiddenShortcuts_ThrowsException() { + public void PinHiddenShortcuts_ThrowsException() { runWithCaller(CALLING_PACKAGE_1, USER_0, () -> { assertThrown(IllegalArgumentException.class, () -> { mManager.requestPinShortcut(makeShortcutExcludedFromLauncher("s1"), null); diff --git a/services/tests/servicestests/src/com/android/server/utils/LazyJniRegistrarTest.java b/services/tests/servicestests/src/com/android/server/utils/LazyJniRegistrarTest.java new file mode 100644 index 000000000000..a2df73b7d540 --- /dev/null +++ b/services/tests/servicestests/src/com/android/server/utils/LazyJniRegistrarTest.java @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2024 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.android.server.utils; + +import android.platform.test.annotations.Presubmit; + +import androidx.test.filters.SmallTest; + +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; + +import java.lang.reflect.Method; +import java.lang.reflect.Modifier; + +@SmallTest +@Presubmit +@RunWith(JUnit4.class) +public class LazyJniRegistrarTest { + + @Test + public void testNativeMethodsResolve() throws Exception { + // Basic test with a few explicit invocations to make sure methods resolve and don't throw. + LazyJniRegistrar.registerConsumerIrService(); + LazyJniRegistrar.registerGameManagerService(); + LazyJniRegistrar.registerVrManagerService(); + } + + @Test + public void testAllNativeRegisterMethodsResolve() throws Exception { + // Catch-all test to make sure public static register* methods resolve and don't throw. + for (Method method : LazyJniRegistrar.class.getDeclaredMethods()) { + if (Modifier.isPublic(method.getModifiers()) + && Modifier.isStatic(method.getModifiers()) + && method.getName().startsWith("register")) { + method.invoke(null); + } + } + } + + // TODO(b/302724778): Remove manual JNI load + static { + System.loadLibrary("servicestestjni"); + } +} diff --git a/services/tests/servicestests/src/com/android/server/utils/OWNERS b/services/tests/servicestests/src/com/android/server/utils/OWNERS index f5b19a1c40ae..69b9fa23c040 100644 --- a/services/tests/servicestests/src/com/android/server/utils/OWNERS +++ b/services/tests/servicestests/src/com/android/server/utils/OWNERS @@ -1,5 +1,6 @@ per-file EventLoggerTest.java = file:/platform/frameworks/av:/media/janitors/media_solutions_OWNERS per-file EventLoggerTest.java = jmtrivi@google.com +per-file LazyJniRegistrarTest.java = file:/PERFORMANCE_OWNERS # Bug component : 158088 = per-file AnrTimer*.java per-file AnrTimer*.java = file:/PERFORMANCE_OWNERS diff --git a/services/usb/OWNERS b/services/usb/OWNERS index 2dff392d4e34..259261252032 100644 --- a/services/usb/OWNERS +++ b/services/usb/OWNERS @@ -1,9 +1,9 @@ -anothermark@google.com +vmartensson@google.com +nkapron@google.com febinthattil@google.com -aprasath@google.com +shubhankarm@google.com badhri@google.com elaurent@google.com albertccwang@google.com jameswei@google.com howardyen@google.com -kumarashishg@google.com
\ No newline at end of file diff --git a/services/usb/java/com/android/server/usb/UsbPortManager.java b/services/usb/java/com/android/server/usb/UsbPortManager.java index 55a89239b864..86468b0cf821 100644 --- a/services/usb/java/com/android/server/usb/UsbPortManager.java +++ b/services/usb/java/com/android/server/usb/UsbPortManager.java @@ -200,7 +200,11 @@ public class UsbPortManager implements IBinder.DeathRecipient { mHandler.sendEmptyMessage(MSG_SYSTEM_READY); } - private void updateContaminantNotification() { + private void updateContaminantNotificationLocked() { + if (mNotificationManager == null) { + return; + } + PortInfo currentPortInfo = null; Resources r = mContext.getResources(); int contaminantStatus = UsbPortStatus.CONTAMINANT_DETECTION_NOT_DETECTED; @@ -1171,7 +1175,7 @@ public class UsbPortManager implements IBinder.DeathRecipient { private void handlePortLocked(PortInfo portInfo, IndentingPrintWriter pw) { sendPortChangedBroadcastLocked(portInfo); logToStatsd(portInfo, pw); - updateContaminantNotification(); + updateContaminantNotificationLocked(); } private void handlePortAddedLocked(PortInfo portInfo, IndentingPrintWriter pw) { @@ -1433,6 +1437,9 @@ public class UsbPortManager implements IBinder.DeathRecipient { case MSG_SYSTEM_READY: { mNotificationManager = (NotificationManager) mContext.getSystemService(Context.NOTIFICATION_SERVICE); + synchronized (mLock) { + updateContaminantNotificationLocked(); + } break; } } |