Loading StubLibraries.bp +69 −18 Original line number Diff line number Diff line Loading @@ -114,7 +114,7 @@ droidstubs { last_released: { api_file: ":android-non-updatable.api.public.latest", removed_api_file: ":android-non-updatable-removed.api.public.latest", baseline_file: ":android-incompatibilities.api.public.latest", baseline_file: ":android-non-updatable-incompatibilities.api.public.latest", }, api_lint: { enabled: true, Loading Loading @@ -166,7 +166,7 @@ droidstubs { last_released: { api_file: ":android-non-updatable.api.system.latest", removed_api_file: ":android-non-updatable-removed.api.system.latest", baseline_file: ":android-incompatibilities.api.system.latest" baseline_file: ":android-non-updatable-incompatibilities.api.system.latest" }, api_lint: { enabled: true, Loading Loading @@ -310,13 +310,9 @@ modules_system_stubs = [ ] java_defaults { name: "android_defaults_stubs_current", name: "android-non-updatable_defaults_stubs_current", libs: ["stub-annotations"], static_libs: [ // License notices from art module "art-notices-for-framework-stubs-jar", "framework-res-package-jar", // Export package of framework-res ], static_libs: ["framework-res-package-jar"], // Export package of framework-res errorprone: { javacflags: [ "-XepDisableAllChecks", Loading @@ -326,6 +322,64 @@ java_defaults { system_modules: "none", java_version: "1.8", compile_dex: true, dist: { targets: ["sdk", "win_sdk"], tag: ".jar", dest: "android-non-updatable.jar", } } java_library_static { name: "android-non-updatable.stubs", defaults: ["android-non-updatable_defaults_stubs_current"], srcs: [":api-stubs-docs-non-updatable"], libs: modules_public_stubs, dist: { dir: "apistubs/android/public", }, } java_library_static { name: "android-non-updatable.stubs.system", defaults: ["android-non-updatable_defaults_stubs_current"], srcs: [ ":system-api-stubs-docs-non-updatable" ], libs: modules_system_stubs, dist: { dir: "apistubs/android/system", }, } java_library_static { name: "android-non-updatable.stubs.module_lib", defaults: ["android-non-updatable_defaults_stubs_current"], srcs: [":module-lib-api-stubs-docs-non-updatable"], libs: [ "sdk_system_current_android", // NOTE: The below can be removed once the prebuilt stub contains IKE. "sdk_system_current_android.net.ipsec.ike", ], dist: { dir: "apistubs/android/module-lib", }, } java_library_static { name: "android-non-updatable.stubs.test", defaults: ["android-non-updatable_defaults_stubs_current"], srcs: [":test-api-stubs-docs-non-updatable"], libs: modules_system_stubs, dist: { dir: "apistubs/android/test", }, } java_defaults { name: "android_defaults_stubs_current", static_libs: ["art-notices-for-framework-stubs-jar"], // License notices from art module sdk_version: "none", system_modules: "none", java_version: "1.8", compile_dex: true, } java_defaults { Loading @@ -339,8 +393,8 @@ java_defaults { java_library_static { name: "android_stubs_current", srcs: [ ":api-stubs-docs-non-updatable" ], static_libs: modules_public_stubs + [ "android-non-updatable.stubs", "private-stub-annotations-jar", ], defaults: ["android_defaults_stubs_current"], Loading @@ -348,8 +402,8 @@ java_library_static { java_library_static { name: "android_system_stubs_current", srcs: [ ":system-api-stubs-docs-non-updatable" ], static_libs: modules_system_stubs + [ "android-non-updatable.stubs.system", "private-stub-annotations-jar", ], defaults: [ Loading @@ -371,10 +425,10 @@ java_library_static { java_library_static { name: "android_test_stubs_current", srcs: [ ":test-api-stubs-docs-non-updatable" ], // Modules do not have test APIs, but we want to include their SystemApis, like we include // the SystemApi of framework-non-updatable-sources. static_libs: modules_system_stubs + [ "android-non-updatable.stubs.test", "private-stub-annotations-jar", ], defaults: [ Loading @@ -396,17 +450,14 @@ java_library_static { java_library_static { name: "android_module_lib_stubs_current", srcs: [ ":module-lib-api-stubs-docs-non-updatable" ], defaults: [ "android_defaults_stubs_current", "android_stubs_dists_default", ], libs: [ "sdk_system_current_android", // NOTE: The below can be removed once the prebuilt stub contains IKE. "sdk_system_current_android.net.ipsec.ike", static_libs: [ "android-non-updatable.stubs.module_lib", "art.module.public.api.stubs", ], static_libs: ["art.module.public.api.stubs"], dist: { dir: "apistubs/android/module-lib", }, Loading apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java +2 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.app.appsearch.util.SchemaMigrationUtil; import android.os.Bundle; import android.os.ParcelableException; import android.os.RemoteException; import android.os.SystemClock; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; Loading Loading @@ -270,8 +271,8 @@ public final class AppSearchSession implements Closeable { documentBundles.add(documents.get(i).getBundle()); } try { // TODO(b/173532925) a timestamp needs to be sent here to calculate binder latency mService.putDocuments(mPackageName, mDatabaseName, documentBundles, mUserId, /*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime(), new IAppSearchBatchResultCallback.Stub() { public void onResult(AppSearchBatchResult result) { executor.execute(() -> callback.onResult(result)); Loading apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,7 @@ interface IAppSearchManager { * @param databaseName The name of the database where this document lives. * @param documentBundes List of GenericDocument bundles. * @param userId Id of the calling user * @param binderCallStartTimeMillis start timestamp of binder call in Millis * @param callback * If the call fails to start, {@link IAppSearchBatchResultCallback#onSystemError} * will be called with the cause throwable. Otherwise, Loading @@ -106,6 +107,7 @@ interface IAppSearchManager { in String databaseName, in List<Bundle> documentBundles, in int userId, in long binderCallStartTimeMillis, in IAppSearchBatchResultCallback callback); /** Loading apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +43 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.appsearch; import static android.app.appsearch.AppSearchResult.throwableToFailedResult; import static android.os.UserHandle.USER_NULL; import android.annotation.ElapsedRealtimeLong; import android.annotation.NonNull; import android.annotation.UserIdInt; import android.app.ActivityManager; Loading Loading @@ -45,6 +46,7 @@ import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.os.ParcelableException; import android.os.RemoteException; import android.os.SystemClock; import android.os.UserHandle; import android.os.UserManager; import android.util.ArrayMap; Loading @@ -57,6 +59,9 @@ import com.android.internal.util.Preconditions; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.appsearch.external.localstorage.AppSearchImpl; import com.android.server.appsearch.external.localstorage.stats.CallStats; import com.android.server.appsearch.stats.LoggerInstanceManager; import com.android.server.appsearch.stats.PlatformLogger; import java.io.DataInputStream; import java.io.DataOutputStream; Loading @@ -80,6 +85,7 @@ public class AppSearchManagerService extends SystemService { private PackageManagerInternal mPackageManagerInternal; private ImplInstanceManager mImplInstanceManager; private UserManager mUserManager; private LoggerInstanceManager mLoggerInstanceManager; // Never call shutdownNow(). It will cancel the futures it's returned. And since // Executor#execute won't return anything, we will hang forever waiting for the execution. Loading @@ -106,6 +112,7 @@ public class AppSearchManagerService extends SystemService { mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class); mImplInstanceManager = ImplInstanceManager.getInstance(mContext); mUserManager = mContext.getSystemService(UserManager.class); mLoggerInstanceManager = LoggerInstanceManager.getInstance(); registerReceivers(); } Loading Loading @@ -147,6 +154,7 @@ public class AppSearchManagerService extends SystemService { private void handleUserRemoved(@UserIdInt int userId) { try { mImplInstanceManager.removeAppSearchImplForUser(userId); mLoggerInstanceManager.removePlatformLoggerForUser(userId); Slog.i(TAG, "Removed AppSearchImpl instance for user: " + userId); } catch (Throwable t) { Slog.e(TAG, "Unable to remove data for user: " + userId, t); Loading Loading @@ -274,6 +282,7 @@ public class AppSearchManagerService extends SystemService { @NonNull String databaseName, @NonNull List<Bundle> documentBundles, @UserIdInt int userId, @ElapsedRealtimeLong long binderCallStartTimeMillis, @NonNull IAppSearchBatchResultCallback callback) { Preconditions.checkNotNull(packageName); Preconditions.checkNotNull(databaseName); Loading @@ -282,6 +291,11 @@ public class AppSearchManagerService extends SystemService { int callingUid = Binder.getCallingUid(); int callingUserId = handleIncomingUser(userId, callingUid); EXECUTOR.execute(() -> { long totalLatencyStartTimeMillis = SystemClock.elapsedRealtime(); @AppSearchResult.ResultCode int statusCode = AppSearchResult.RESULT_OK; PlatformLogger logger = null; int operationSuccessCount = 0; int operationFailureCount = 0; try { verifyUserUnlocked(callingUserId); verifyCallingPackage(callingUid, packageName); Loading @@ -289,20 +303,46 @@ public class AppSearchManagerService extends SystemService { new AppSearchBatchResult.Builder<>(); AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUserId); logger = mLoggerInstanceManager.getPlatformLogger(callingUserId); for (int i = 0; i < documentBundles.size(); i++) { GenericDocument document = new GenericDocument(documentBundles.get(i)); try { impl.putDocument(packageName, databaseName, document, /*logger=*/ null); impl.putDocument(packageName, databaseName, document, logger); resultBuilder.setSuccess(document.getUri(), /*result=*/ null); ++operationSuccessCount; } catch (Throwable t) { resultBuilder.setResult(document.getUri(), throwableToFailedResult(t)); AppSearchResult<Void> result = throwableToFailedResult(t); resultBuilder.setResult(document.getUri(), result); // for failures, we would just log the one for last failure statusCode = result.getResultCode(); ++operationFailureCount; } } invokeCallbackOnResult(callback, resultBuilder.build()); } catch (Throwable t) { invokeCallbackOnError(callback, t); } finally { if (logger != null) { CallStats.Builder cBuilder = new CallStats.Builder(packageName, databaseName) .setCallType(CallStats.CALL_TYPE_PUT_DOCUMENTS) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis( 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis)) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis( (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis)); logger.logStats(cBuilder.build()); } } }); } Loading Loading @@ -717,6 +757,7 @@ public class AppSearchManagerService extends SystemService { try { verifyUserUnlocked(callingUserId); mImplInstanceManager.getOrCreateAppSearchImpl(mContext, callingUserId); mLoggerInstanceManager.getOrCreatePlatformLogger(getContext(), callingUserId); invokeCallbackOnResult(callback, AppSearchResult.newSuccessfulResult(null)); } catch (Throwable t) { invokeCallbackOnError(callback, t); Loading apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java +0 −1 Original line number Diff line number Diff line Loading @@ -106,7 +106,6 @@ public final class ImplInstanceManager { * * @param userId The multi-user userId of the user that need to be removed. */ @NonNull public void removeAppSearchImplForUser(@UserIdInt int userId) { synchronized (mInstancesLocked) { mInstancesLocked.remove(userId); Loading Loading
StubLibraries.bp +69 −18 Original line number Diff line number Diff line Loading @@ -114,7 +114,7 @@ droidstubs { last_released: { api_file: ":android-non-updatable.api.public.latest", removed_api_file: ":android-non-updatable-removed.api.public.latest", baseline_file: ":android-incompatibilities.api.public.latest", baseline_file: ":android-non-updatable-incompatibilities.api.public.latest", }, api_lint: { enabled: true, Loading Loading @@ -166,7 +166,7 @@ droidstubs { last_released: { api_file: ":android-non-updatable.api.system.latest", removed_api_file: ":android-non-updatable-removed.api.system.latest", baseline_file: ":android-incompatibilities.api.system.latest" baseline_file: ":android-non-updatable-incompatibilities.api.system.latest" }, api_lint: { enabled: true, Loading Loading @@ -310,13 +310,9 @@ modules_system_stubs = [ ] java_defaults { name: "android_defaults_stubs_current", name: "android-non-updatable_defaults_stubs_current", libs: ["stub-annotations"], static_libs: [ // License notices from art module "art-notices-for-framework-stubs-jar", "framework-res-package-jar", // Export package of framework-res ], static_libs: ["framework-res-package-jar"], // Export package of framework-res errorprone: { javacflags: [ "-XepDisableAllChecks", Loading @@ -326,6 +322,64 @@ java_defaults { system_modules: "none", java_version: "1.8", compile_dex: true, dist: { targets: ["sdk", "win_sdk"], tag: ".jar", dest: "android-non-updatable.jar", } } java_library_static { name: "android-non-updatable.stubs", defaults: ["android-non-updatable_defaults_stubs_current"], srcs: [":api-stubs-docs-non-updatable"], libs: modules_public_stubs, dist: { dir: "apistubs/android/public", }, } java_library_static { name: "android-non-updatable.stubs.system", defaults: ["android-non-updatable_defaults_stubs_current"], srcs: [ ":system-api-stubs-docs-non-updatable" ], libs: modules_system_stubs, dist: { dir: "apistubs/android/system", }, } java_library_static { name: "android-non-updatable.stubs.module_lib", defaults: ["android-non-updatable_defaults_stubs_current"], srcs: [":module-lib-api-stubs-docs-non-updatable"], libs: [ "sdk_system_current_android", // NOTE: The below can be removed once the prebuilt stub contains IKE. "sdk_system_current_android.net.ipsec.ike", ], dist: { dir: "apistubs/android/module-lib", }, } java_library_static { name: "android-non-updatable.stubs.test", defaults: ["android-non-updatable_defaults_stubs_current"], srcs: [":test-api-stubs-docs-non-updatable"], libs: modules_system_stubs, dist: { dir: "apistubs/android/test", }, } java_defaults { name: "android_defaults_stubs_current", static_libs: ["art-notices-for-framework-stubs-jar"], // License notices from art module sdk_version: "none", system_modules: "none", java_version: "1.8", compile_dex: true, } java_defaults { Loading @@ -339,8 +393,8 @@ java_defaults { java_library_static { name: "android_stubs_current", srcs: [ ":api-stubs-docs-non-updatable" ], static_libs: modules_public_stubs + [ "android-non-updatable.stubs", "private-stub-annotations-jar", ], defaults: ["android_defaults_stubs_current"], Loading @@ -348,8 +402,8 @@ java_library_static { java_library_static { name: "android_system_stubs_current", srcs: [ ":system-api-stubs-docs-non-updatable" ], static_libs: modules_system_stubs + [ "android-non-updatable.stubs.system", "private-stub-annotations-jar", ], defaults: [ Loading @@ -371,10 +425,10 @@ java_library_static { java_library_static { name: "android_test_stubs_current", srcs: [ ":test-api-stubs-docs-non-updatable" ], // Modules do not have test APIs, but we want to include their SystemApis, like we include // the SystemApi of framework-non-updatable-sources. static_libs: modules_system_stubs + [ "android-non-updatable.stubs.test", "private-stub-annotations-jar", ], defaults: [ Loading @@ -396,17 +450,14 @@ java_library_static { java_library_static { name: "android_module_lib_stubs_current", srcs: [ ":module-lib-api-stubs-docs-non-updatable" ], defaults: [ "android_defaults_stubs_current", "android_stubs_dists_default", ], libs: [ "sdk_system_current_android", // NOTE: The below can be removed once the prebuilt stub contains IKE. "sdk_system_current_android.net.ipsec.ike", static_libs: [ "android-non-updatable.stubs.module_lib", "art.module.public.api.stubs", ], static_libs: ["art.module.public.api.stubs"], dist: { dir: "apistubs/android/module-lib", }, Loading
apex/appsearch/framework/java/android/app/appsearch/AppSearchSession.java +2 −1 Original line number Diff line number Diff line Loading @@ -23,6 +23,7 @@ import android.app.appsearch.util.SchemaMigrationUtil; import android.os.Bundle; import android.os.ParcelableException; import android.os.RemoteException; import android.os.SystemClock; import android.util.ArrayMap; import android.util.ArraySet; import android.util.Log; Loading Loading @@ -270,8 +271,8 @@ public final class AppSearchSession implements Closeable { documentBundles.add(documents.get(i).getBundle()); } try { // TODO(b/173532925) a timestamp needs to be sent here to calculate binder latency mService.putDocuments(mPackageName, mDatabaseName, documentBundles, mUserId, /*binderCallStartTimeMillis=*/ SystemClock.elapsedRealtime(), new IAppSearchBatchResultCallback.Stub() { public void onResult(AppSearchBatchResult result) { executor.execute(() -> callback.onResult(result)); Loading
apex/appsearch/framework/java/android/app/appsearch/IAppSearchManager.aidl +2 −0 Original line number Diff line number Diff line Loading @@ -94,6 +94,7 @@ interface IAppSearchManager { * @param databaseName The name of the database where this document lives. * @param documentBundes List of GenericDocument bundles. * @param userId Id of the calling user * @param binderCallStartTimeMillis start timestamp of binder call in Millis * @param callback * If the call fails to start, {@link IAppSearchBatchResultCallback#onSystemError} * will be called with the cause throwable. Otherwise, Loading @@ -106,6 +107,7 @@ interface IAppSearchManager { in String databaseName, in List<Bundle> documentBundles, in int userId, in long binderCallStartTimeMillis, in IAppSearchBatchResultCallback callback); /** Loading
apex/appsearch/service/java/com/android/server/appsearch/AppSearchManagerService.java +43 −2 Original line number Diff line number Diff line Loading @@ -18,6 +18,7 @@ package com.android.server.appsearch; import static android.app.appsearch.AppSearchResult.throwableToFailedResult; import static android.os.UserHandle.USER_NULL; import android.annotation.ElapsedRealtimeLong; import android.annotation.NonNull; import android.annotation.UserIdInt; import android.app.ActivityManager; Loading Loading @@ -45,6 +46,7 @@ import android.os.Bundle; import android.os.ParcelFileDescriptor; import android.os.ParcelableException; import android.os.RemoteException; import android.os.SystemClock; import android.os.UserHandle; import android.os.UserManager; import android.util.ArrayMap; Loading @@ -57,6 +59,9 @@ import com.android.internal.util.Preconditions; import com.android.server.LocalServices; import com.android.server.SystemService; import com.android.server.appsearch.external.localstorage.AppSearchImpl; import com.android.server.appsearch.external.localstorage.stats.CallStats; import com.android.server.appsearch.stats.LoggerInstanceManager; import com.android.server.appsearch.stats.PlatformLogger; import java.io.DataInputStream; import java.io.DataOutputStream; Loading @@ -80,6 +85,7 @@ public class AppSearchManagerService extends SystemService { private PackageManagerInternal mPackageManagerInternal; private ImplInstanceManager mImplInstanceManager; private UserManager mUserManager; private LoggerInstanceManager mLoggerInstanceManager; // Never call shutdownNow(). It will cancel the futures it's returned. And since // Executor#execute won't return anything, we will hang forever waiting for the execution. Loading @@ -106,6 +112,7 @@ public class AppSearchManagerService extends SystemService { mPackageManagerInternal = LocalServices.getService(PackageManagerInternal.class); mImplInstanceManager = ImplInstanceManager.getInstance(mContext); mUserManager = mContext.getSystemService(UserManager.class); mLoggerInstanceManager = LoggerInstanceManager.getInstance(); registerReceivers(); } Loading Loading @@ -147,6 +154,7 @@ public class AppSearchManagerService extends SystemService { private void handleUserRemoved(@UserIdInt int userId) { try { mImplInstanceManager.removeAppSearchImplForUser(userId); mLoggerInstanceManager.removePlatformLoggerForUser(userId); Slog.i(TAG, "Removed AppSearchImpl instance for user: " + userId); } catch (Throwable t) { Slog.e(TAG, "Unable to remove data for user: " + userId, t); Loading Loading @@ -274,6 +282,7 @@ public class AppSearchManagerService extends SystemService { @NonNull String databaseName, @NonNull List<Bundle> documentBundles, @UserIdInt int userId, @ElapsedRealtimeLong long binderCallStartTimeMillis, @NonNull IAppSearchBatchResultCallback callback) { Preconditions.checkNotNull(packageName); Preconditions.checkNotNull(databaseName); Loading @@ -282,6 +291,11 @@ public class AppSearchManagerService extends SystemService { int callingUid = Binder.getCallingUid(); int callingUserId = handleIncomingUser(userId, callingUid); EXECUTOR.execute(() -> { long totalLatencyStartTimeMillis = SystemClock.elapsedRealtime(); @AppSearchResult.ResultCode int statusCode = AppSearchResult.RESULT_OK; PlatformLogger logger = null; int operationSuccessCount = 0; int operationFailureCount = 0; try { verifyUserUnlocked(callingUserId); verifyCallingPackage(callingUid, packageName); Loading @@ -289,20 +303,46 @@ public class AppSearchManagerService extends SystemService { new AppSearchBatchResult.Builder<>(); AppSearchImpl impl = mImplInstanceManager.getAppSearchImpl(callingUserId); logger = mLoggerInstanceManager.getPlatformLogger(callingUserId); for (int i = 0; i < documentBundles.size(); i++) { GenericDocument document = new GenericDocument(documentBundles.get(i)); try { impl.putDocument(packageName, databaseName, document, /*logger=*/ null); impl.putDocument(packageName, databaseName, document, logger); resultBuilder.setSuccess(document.getUri(), /*result=*/ null); ++operationSuccessCount; } catch (Throwable t) { resultBuilder.setResult(document.getUri(), throwableToFailedResult(t)); AppSearchResult<Void> result = throwableToFailedResult(t); resultBuilder.setResult(document.getUri(), result); // for failures, we would just log the one for last failure statusCode = result.getResultCode(); ++operationFailureCount; } } invokeCallbackOnResult(callback, resultBuilder.build()); } catch (Throwable t) { invokeCallbackOnError(callback, t); } finally { if (logger != null) { CallStats.Builder cBuilder = new CallStats.Builder(packageName, databaseName) .setCallType(CallStats.CALL_TYPE_PUT_DOCUMENTS) // TODO(b/173532925) check the existing binder call latency chart // is good enough for us: // http://dashboards/view/_72c98f9a_91d9_41d4_ab9a_bc14f79742b4 .setEstimatedBinderLatencyMillis( 2 * (int) (totalLatencyStartTimeMillis - binderCallStartTimeMillis)) .setNumOperationsSucceeded(operationSuccessCount) .setNumOperationsFailed(operationFailureCount); cBuilder.getGeneralStatsBuilder() .setStatusCode(statusCode) .setTotalLatencyMillis( (int) (SystemClock.elapsedRealtime() - totalLatencyStartTimeMillis)); logger.logStats(cBuilder.build()); } } }); } Loading Loading @@ -717,6 +757,7 @@ public class AppSearchManagerService extends SystemService { try { verifyUserUnlocked(callingUserId); mImplInstanceManager.getOrCreateAppSearchImpl(mContext, callingUserId); mLoggerInstanceManager.getOrCreatePlatformLogger(getContext(), callingUserId); invokeCallbackOnResult(callback, AppSearchResult.newSuccessfulResult(null)); } catch (Throwable t) { invokeCallbackOnError(callback, t); Loading
apex/appsearch/service/java/com/android/server/appsearch/ImplInstanceManager.java +0 −1 Original line number Diff line number Diff line Loading @@ -106,7 +106,6 @@ public final class ImplInstanceManager { * * @param userId The multi-user userId of the user that need to be removed. */ @NonNull public void removeAppSearchImplForUser(@UserIdInt int userId) { synchronized (mInstancesLocked) { mInstancesLocked.remove(userId); Loading