Loading core/java/android/app/ActivityThread.java +120 −0 Original line number Diff line number Diff line Loading @@ -298,6 +298,7 @@ import java.util.TimeZone; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.stream.Collectors; /** * This manages the execution of the main thread in an Loading Loading @@ -1148,10 +1149,12 @@ public final class ActivityThread extends ClientTransactionHandler private static final String DB_POOL_INFO_HEADER = " %13s %13s %13s %s"; private static final String DB_POOL_INFO_FORMAT = " %13d %13d %13d %s"; @Override public final void scheduleReceiver(Intent intent, ActivityInfo info, CompatibilityInfo compatInfo, int resultCode, String data, Bundle extras, boolean ordered, boolean assumeDelivered, int sendingUser, int processState, int sendingUid, String sendingPackage) { assertCalledBySystem(); updateProcessState(processState, false); ReceiverData r = new ReceiverData(intent, resultCode, data, extras, ordered, false, assumeDelivered, mAppThread.asBinder(), sendingUser, Loading @@ -1163,7 +1166,9 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.RECEIVER, r); } @Override public final void scheduleReceiverList(List<ReceiverInfo> info) throws RemoteException { assertCalledBySystem(); for (int i = 0; i < info.size(); i++) { ReceiverInfo r = info.get(i); if (r.registered) { Loading @@ -1180,8 +1185,10 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public final void scheduleCreateBackupAgent(ApplicationInfo app, int backupMode, int userId, @BackupDestination int backupDestination) { assertCalledBySystem(); CreateBackupAgentData d = new CreateBackupAgentData(); d.appInfo = app; d.backupMode = backupMode; Loading @@ -1191,7 +1198,9 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.CREATE_BACKUP_AGENT, d); } @Override public final void scheduleDestroyBackupAgent(ApplicationInfo app, int userId) { assertCalledBySystem(); CreateBackupAgentData d = new CreateBackupAgentData(); d.appInfo = app; d.userId = userId; Loading @@ -1199,8 +1208,10 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.DESTROY_BACKUP_AGENT, d); } @Override public final void scheduleCreateService(IBinder token, ServiceInfo info, CompatibilityInfo compatInfo, int processState) { assertCalledBySystem(); updateProcessState(processState, false); CreateServiceData s = new CreateServiceData(); s.token = token; Loading @@ -1216,8 +1227,10 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.CREATE_SERVICE, s); } @Override public final void scheduleBindService(IBinder token, IBinder bindToken, Intent intent, boolean rebind, int processState, long bindSeq) { assertCalledBySystem(); updateProcessState(processState, false); BindServiceData s = new BindServiceData(); s.token = token; Loading @@ -1241,7 +1254,9 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.BIND_SERVICE, s); } @Override public final void scheduleUnbindService(IBinder token, IBinder bindToken, Intent intent) { assertCalledBySystem(); BindServiceData s = new BindServiceData(); s.token = token; s.bindToken = bindToken; Loading @@ -1255,7 +1270,9 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.UNBIND_SERVICE, s); } @Override public final void scheduleServiceArgs(IBinder token, ParceledListSlice args) { assertCalledBySystem(); List<ServiceStartArgs> list = args.getList(); for (int i = 0; i < list.size(); i++) { Loading @@ -1278,7 +1295,9 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public final void scheduleStopService(IBinder token) { assertCalledBySystem(); if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) { Trace.instant(Trace.TRACE_TAG_ACTIVITY_MANAGER, "scheduleStopService. token=" + token); Loading @@ -1288,6 +1307,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override public final void scheduleTimeoutService(IBinder token, int startId) { assertCalledBySystem(); if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) { Trace.instant(Trace.TRACE_TAG_ACTIVITY_MANAGER, "scheduleTimeoutService. token=" + token); Loading @@ -1297,12 +1317,14 @@ public final class ActivityThread extends ClientTransactionHandler @Override public final void schedulePing(RemoteCallback pong) { assertCalledBySystem(); sendMessage(H.PING, pong); } @Override public final void scheduleTimeoutServiceForType(IBinder token, int startId, @ServiceInfo.ForegroundServiceType int fgsType) { assertCalledBySystem(); if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) { Trace.instant(Trace.TRACE_TAG_ACTIVITY_MANAGER, "scheduleTimeoutServiceForType. token=" + token); Loading Loading @@ -1341,6 +1363,7 @@ public final class ActivityThread extends ClientTransactionHandler FileDescriptor applicationSharedMemoryFd, long startRequestedElapsedTime, long startRequestedUptime) { assertCalledBySystem(); if (DEBUG_STORE_ENABLED) { DebugStore.recordScheduleBindApplication(); } Loading Loading @@ -1436,22 +1459,30 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public final void runIsolatedEntryPoint(String entryPoint, String[] entryPointArgs) { assertCalledBySystem(); SomeArgs args = SomeArgs.obtain(); args.arg1 = entryPoint; args.arg2 = entryPointArgs; sendMessage(H.RUN_ISOLATED_ENTRY_POINT, args); } @Override public final void scheduleExit() { assertCalledBySystem(); sendMessage(H.EXIT_APPLICATION, null); } @Override public final void scheduleSuicide() { assertCalledBySystem(); sendMessage(H.SUICIDE, null); } @Override public void scheduleApplicationInfoChanged(ApplicationInfo ai) { assertCalledBySystem(); synchronized (mResourcesManager) { var oldAi = mPendingAppInfoUpdates.put(ai.packageName, ai); if (oldAi != null && oldAi.createTimestamp > ai.createTimestamp) { Loading @@ -1467,11 +1498,15 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.APPLICATION_INFO_CHANGED, ai.packageName); } @Override public void updateTimeZone() { assertCalledBySystem(); TimeZone.setDefault(null); } @Override public void clearDnsCache() { assertCalledBySystem(); // a non-standard API to get this to libcore InetAddress.clearDnsCache(); // Allow libcore to perform the necessary actions as it sees fit upon a network Loading @@ -1479,7 +1514,9 @@ public final class ActivityThread extends ClientTransactionHandler NetworkEventDispatcher.getInstance().dispatchNetworkConfigurationChange(); } @Override public void updateHttpProxy() { assertCalledBySystem(); final Application app; synchronized (ActivityThread.this) { app = getApplication(); Loading @@ -1494,12 +1531,16 @@ public final class ActivityThread extends ClientTransactionHandler ActivityThread.updateHttpProxy(app); } @Override public void processInBackground() { assertCalledBySystem(); mH.removeMessages(H.GC_WHEN_IDLE); mH.sendMessage(mH.obtainMessage(H.GC_WHEN_IDLE)); } @Override public void dumpService(ParcelFileDescriptor pfd, IBinder servicetoken, String[] args) { assertCalledBySystem(); DumpComponentInfo data = new DumpComponentInfo(); try { data.fd = pfd.dup(); Loading @@ -1516,11 +1557,13 @@ public final class ActivityThread extends ClientTransactionHandler // This function exists to make sure all receiver dispatching is // correctly ordered, since these are one-way calls and the binder driver // applies transaction ordering per object for such calls. @Override public void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent, int resultCode, String dataStr, Bundle extras, boolean ordered, boolean sticky, boolean assumeDelivered, int sendingUser, int processState, int sendingUid, String sendingPackage) throws RemoteException { assertCalledBySystem(); updateProcessState(processState, false); // We can't modify IIntentReceiver due to UnsupportedAppUsage, so Loading Loading @@ -1549,17 +1592,20 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void scheduleLowMemory() { assertCalledBySystem(); sendMessage(H.LOW_MEMORY, null); } @Override public void profilerControl(boolean start, ProfilerInfo profilerInfo, int profileType) { assertCalledBySystem(); sendMessage(H.PROFILER_CONTROL, profilerInfo, start ? 1 : 0, profileType); } @Override public void dumpHeap(boolean managed, boolean mallocInfo, boolean runGc, String dumpBitmaps, String path, ParcelFileDescriptor fd, RemoteCallback finishCallback) { assertCalledBySystem(); DumpHeapData dhd = new DumpHeapData(); dhd.managed = managed; dhd.mallocInfo = mallocInfo; Loading @@ -1580,15 +1626,21 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.DUMP_HEAP, dhd, 0, 0, true /*async*/); } @Override public void attachAgent(String agent) { assertCalledBySystem(); sendMessage(H.ATTACH_AGENT, agent); } @Override public void attachStartupAgents(String dataDir) { assertCalledBySystem(); sendMessage(H.ATTACH_STARTUP_AGENTS, dataDir); } @Override public void setSchedulingGroup(int group) { assertCalledBySystem(); // Note: do this immediately, since going into the foreground // should happen regardless of what pending work we have to do // and the activity manager will wait for us to report back that Loading @@ -1600,12 +1652,15 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public void dispatchPackageBroadcast(int cmd, String[] packages) { assertCalledBySystem(); sendMessage(H.DISPATCH_PACKAGE_BROADCAST, packages, cmd); } @Override public void scheduleCrash(String msg, int typeId, @Nullable Bundle extras) { assertCalledBySystem(); SomeArgs args = SomeArgs.obtain(); args.arg1 = msg; args.arg2 = extras; Loading @@ -1614,6 +1669,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void dumpResources(ParcelFileDescriptor fd, RemoteCallback callback) { assertCalledBySystem(); DumpResourcesData data = new DumpResourcesData(); try { data.fd = fd.dup(); Loading @@ -1626,8 +1682,10 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public void dumpActivity(ParcelFileDescriptor pfd, IBinder activitytoken, String prefix, String[] args) { assertCalledBySystem(); DumpComponentInfo data = new DumpComponentInfo(); try { data.fd = pfd.dup(); Loading @@ -1642,8 +1700,10 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public void dumpProvider(ParcelFileDescriptor pfd, IBinder providertoken, String[] args) { assertCalledBySystem(); DumpComponentInfo data = new DumpComponentInfo(); try { data.fd = pfd.dup(); Loading @@ -1662,6 +1722,7 @@ public final class ActivityThread extends ClientTransactionHandler public void dumpMemInfo(ParcelFileDescriptor pfd, Debug.MemoryInfo mem, boolean checkin, boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly, boolean dumpUnreachable, boolean dumpAllocatorStats, String[] args) { assertCalledBySystem(); FileOutputStream fout = new FileOutputStream(pfd.getFileDescriptor()); PrintWriter pw = new FastPrintWriter(fout); try { Loading Loading @@ -1869,6 +1930,7 @@ public final class ActivityThread extends ClientTransactionHandler public void dumpMemInfoProto(ParcelFileDescriptor pfd, Debug.MemoryInfo mem, boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly, boolean dumpUnreachable, String[] args) { assertCalledBySystem(); ProtoOutputStream proto = new ProtoOutputStream(pfd.getFileDescriptor()); try { dumpMemInfo(proto, mem, dumpFullInfo, dumpDalvik, dumpSummaryOnly, dumpUnreachable); Loading Loading @@ -1996,6 +2058,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void dumpGfxInfo(ParcelFileDescriptor pfd, String[] args) { assertCalledBySystem(); DumpComponentInfo data = new DumpComponentInfo(); try { data.fd = pfd.dup(); Loading @@ -2012,6 +2075,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override @NeverCompile public void dumpBitmapsProto(ParcelFileDescriptor pfd, String dumpFormat) { assertCalledBySystem(); try { int pid = Process.myPid(); String processName = (mBoundApplication != null) Loading @@ -2026,6 +2090,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void dumpCacheInfo(ParcelFileDescriptor pfd, String[] args) { assertCalledBySystem(); try { PropertyInvalidatedCache.dumpCacheInfo(pfd, args); BroadcastStickyCache.dumpCacheInfo(pfd); Loading @@ -2049,6 +2114,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void dumpDbInfo(final ParcelFileDescriptor pfd, final String[] args) { assertCalledBySystem(); if (mSystemThread) { // Ensure this invocation is asynchronous to prevent writer waiting if buffer cannot // be consumed. But it must duplicate the file descriptor first, since caller might Loading Loading @@ -2081,12 +2147,14 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void unstableProviderDied(IBinder provider) { assertCalledBySystem(); sendMessage(H.UNSTABLE_PROVIDER_DIED, provider); } @Override public void requestAssistContextExtras(IBinder activityToken, IBinder requestToken, int requestType, int sessionId, int flags) { assertCalledBySystem(); RequestAssistContextExtras cmd = new RequestAssistContextExtras(); cmd.activityToken = activityToken; cmd.requestToken = requestToken; Loading @@ -2096,11 +2164,15 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.REQUEST_ASSIST_CONTEXT_EXTRAS, cmd); } @Override public void setCoreSettings(Bundle coreSettings) { assertCalledBySystem(); sendMessage(H.SET_CORE_SETTINGS, coreSettings); } @Override public void updatePackageCompatibilityInfo(String pkg, CompatibilityInfo info) { assertCalledBySystem(); UpdateCompatibilityData ucd = new UpdateCompatibilityData(); ucd.pkg = pkg; ucd.info = info; Loading @@ -2109,7 +2181,9 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.UPDATE_PACKAGE_COMPATIBILITY_INFO, ucd); } @Override public void scheduleTrimMemory(int level) { assertCalledBySystem(); final Runnable r = PooledLambda.obtainRunnable(ActivityThread::handleTrimMemory, ActivityThread.this, level).recycleOnUse(); // Schedule trimming memory after drawing the frame to minimize jank-risk. Loading @@ -2121,16 +2195,22 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public void scheduleTranslucentConversionComplete(IBinder token, boolean drawComplete) { assertCalledBySystem(); sendMessage(H.TRANSLUCENT_CONVERSION_COMPLETE, token, drawComplete ? 1 : 0); } @Override public void scheduleOnNewSceneTransitionInfo(IBinder token, SceneTransitionInfo info) { assertCalledBySystem(); sendMessage(H.ON_NEW_SCENE_TRANSITION_INFO, new Pair<IBinder, SceneTransitionInfo>(token, info)); } @Override public void setProcessState(int state) { assertCalledBySystem(); updateProcessState(state, true); } Loading @@ -2141,6 +2221,7 @@ public final class ActivityThread extends ClientTransactionHandler */ @Override public void setNetworkBlockSeq(long procStateSeq) { assertCalledBySystem(); synchronized (mNetworkPolicyLock) { mNetworkBlockSeq = procStateSeq; } Loading @@ -2148,11 +2229,13 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void scheduleInstallProvider(ProviderInfo provider) { assertCalledBySystem(); sendMessage(H.INSTALL_PROVIDER, provider); } @Override public final void updateTimePrefs(int timeFormatPreference) { assertCalledBySystem(); final Boolean timeFormatPreferenceBool; // For convenience we are using the Intent extra values. if (timeFormatPreference == Intent.EXTRA_TIME_PREF_VALUE_USE_12_HOUR) { Loading @@ -2169,11 +2252,13 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void scheduleEnterAnimationComplete(IBinder token) { assertCalledBySystem(); sendMessage(H.ENTER_ANIMATION_COMPLETE, token); } @Override public void notifyCleartextNetwork(byte[] firstPacket) { assertCalledBySystem(); if (StrictMode.vmCleartextNetworkEnabled()) { StrictMode.onCleartextNetworkDetected(firstPacket); } Loading @@ -2181,11 +2266,13 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void startBinderTracking() { assertCalledBySystem(); sendMessage(H.START_BINDER_TRACKING, null); } @Override public void stopBinderTrackingAndDump(ParcelFileDescriptor pfd) { assertCalledBySystem(); try { sendMessage(H.STOP_BINDER_TRACKING_AND_DUMP, pfd.dup()); } catch (IOException e) { Loading @@ -2197,6 +2284,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void scheduleLocalVoiceInteractionStarted(IBinder token, IVoiceInteractor voiceInteractor) throws RemoteException { assertCalledBySystem(); SomeArgs args = SomeArgs.obtain(); args.arg1 = token; args.arg2 = voiceInteractor; Loading @@ -2205,17 +2293,20 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void handleTrustStorageUpdate() { assertCalledBySystem(); NetworkSecurityPolicy.getInstance().handleTrustStorageUpdate(); } @Override public void scheduleTransaction(ClientTransaction transaction) throws RemoteException { assertCalledBySystem(); ActivityThread.this.scheduleTransaction(transaction); } @Override public void scheduleTaskFragmentTransaction(@NonNull ITaskFragmentOrganizer organizer, @NonNull TaskFragmentTransaction transaction) throws RemoteException { assertCalledBySystem(); // TODO(b/352665082): ITaskFragmentOrganizer can be cleanup to be a IBinder token organizer.onTransactionReady(transaction); } Loading @@ -2224,6 +2315,7 @@ public final class ActivityThread extends ClientTransactionHandler public void requestDirectActions(@NonNull IBinder activityToken, @NonNull IVoiceInteractor interactor, @Nullable RemoteCallback cancellationCallback, @NonNull RemoteCallback callback) { assertCalledBySystem(); final CancellationSignal cancellationSignal = new CancellationSignal(); if (cancellationCallback != null) { final ICancellationSignal transport = createSafeCancellationTransport( Loading @@ -2242,6 +2334,7 @@ public final class ActivityThread extends ClientTransactionHandler public void performDirectAction(@NonNull IBinder activityToken, @NonNull String actionId, @Nullable Bundle arguments, @Nullable RemoteCallback cancellationCallback, @NonNull RemoteCallback resultCallback) { assertCalledBySystem(); final CancellationSignal cancellationSignal = new CancellationSignal(); if (cancellationCallback != null) { final ICancellationSignal transport = createSafeCancellationTransport( Loading @@ -2259,6 +2352,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void notifyContentProviderPublishStatus(@NonNull ContentProviderHolder holder, @NonNull String authorities, int userId, boolean published) { assertCalledBySystem(); final String auths[] = authorities.split(";"); for (String auth: auths) { final ProviderKey key = getGetProviderKey(auth, userId); Loading @@ -2273,6 +2367,7 @@ public final class ActivityThread extends ClientTransactionHandler public void instrumentWithoutRestart(ComponentName instrumentationName, Bundle instrumentationArgs, IInstrumentationWatcher instrumentationWatcher, IUiAutomationConnection instrumentationUiConnection, ApplicationInfo targetInfo) { assertCalledBySystem(); AppBindData data = new AppBindData(); data.instrumentationName = instrumentationName; data.instrumentationArgs = instrumentationArgs; Loading @@ -2286,6 +2381,7 @@ public final class ActivityThread extends ClientTransactionHandler public void updateUiTranslationState(IBinder activityToken, int state, TranslationSpec sourceSpec, TranslationSpec targetSpec, List<AutofillId> viewIds, UiTranslationSpec uiTranslationSpec) { assertCalledBySystem(); SomeArgs args = SomeArgs.obtain(); args.arg1 = activityToken; args.arg2 = state; Loading @@ -2300,6 +2396,7 @@ public final class ActivityThread extends ClientTransactionHandler public void getExecutableMethodFileOffsets( @NonNull MethodDescriptor methodDescriptor, @NonNull IOffsetCallback resultCallback) { assertCalledBySystem(); Executable executable = MethodDescriptorParser.parseMethodDescriptor( getClass().getClassLoader(), methodDescriptor); VMDebug.ExecutableMethodFileOffsets location; Loading @@ -2324,6 +2421,29 @@ public final class ActivityThread extends ClientTransactionHandler throw e.rethrowFromSystemServer(); } } private void assertCalledBySystem() { int callingUid = Binder.getCallingUid(); if (callingUid != Process.SYSTEM_UID) { String packageName; if (callingUid == Process.ROOT_UID) { packageName = "root"; } else { String[] packagesForUid = getSystemContext().getPackageManager().getPackagesForUid(callingUid); if (packagesForUid == null || packagesForUid.length == 0) { packageName = "unknown"; } else if (packagesForUid.length == 1) { packageName = packagesForUid[0]; } else { packageName = Arrays.asList(packagesForUid).stream().sorted().collect( Collectors.joining(", ")); } } Slog.wtf(TAG, "ApplicationThread called by non-system process" + " (" + callingUid + "): " + packageName); } } } private @NonNull SafeCancellationTransport createSafeCancellationTransport( Loading Loading
core/java/android/app/ActivityThread.java +120 −0 Original line number Diff line number Diff line Loading @@ -298,6 +298,7 @@ import java.util.TimeZone; import java.util.concurrent.Executor; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; import java.util.stream.Collectors; /** * This manages the execution of the main thread in an Loading Loading @@ -1148,10 +1149,12 @@ public final class ActivityThread extends ClientTransactionHandler private static final String DB_POOL_INFO_HEADER = " %13s %13s %13s %s"; private static final String DB_POOL_INFO_FORMAT = " %13d %13d %13d %s"; @Override public final void scheduleReceiver(Intent intent, ActivityInfo info, CompatibilityInfo compatInfo, int resultCode, String data, Bundle extras, boolean ordered, boolean assumeDelivered, int sendingUser, int processState, int sendingUid, String sendingPackage) { assertCalledBySystem(); updateProcessState(processState, false); ReceiverData r = new ReceiverData(intent, resultCode, data, extras, ordered, false, assumeDelivered, mAppThread.asBinder(), sendingUser, Loading @@ -1163,7 +1166,9 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.RECEIVER, r); } @Override public final void scheduleReceiverList(List<ReceiverInfo> info) throws RemoteException { assertCalledBySystem(); for (int i = 0; i < info.size(); i++) { ReceiverInfo r = info.get(i); if (r.registered) { Loading @@ -1180,8 +1185,10 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public final void scheduleCreateBackupAgent(ApplicationInfo app, int backupMode, int userId, @BackupDestination int backupDestination) { assertCalledBySystem(); CreateBackupAgentData d = new CreateBackupAgentData(); d.appInfo = app; d.backupMode = backupMode; Loading @@ -1191,7 +1198,9 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.CREATE_BACKUP_AGENT, d); } @Override public final void scheduleDestroyBackupAgent(ApplicationInfo app, int userId) { assertCalledBySystem(); CreateBackupAgentData d = new CreateBackupAgentData(); d.appInfo = app; d.userId = userId; Loading @@ -1199,8 +1208,10 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.DESTROY_BACKUP_AGENT, d); } @Override public final void scheduleCreateService(IBinder token, ServiceInfo info, CompatibilityInfo compatInfo, int processState) { assertCalledBySystem(); updateProcessState(processState, false); CreateServiceData s = new CreateServiceData(); s.token = token; Loading @@ -1216,8 +1227,10 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.CREATE_SERVICE, s); } @Override public final void scheduleBindService(IBinder token, IBinder bindToken, Intent intent, boolean rebind, int processState, long bindSeq) { assertCalledBySystem(); updateProcessState(processState, false); BindServiceData s = new BindServiceData(); s.token = token; Loading @@ -1241,7 +1254,9 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.BIND_SERVICE, s); } @Override public final void scheduleUnbindService(IBinder token, IBinder bindToken, Intent intent) { assertCalledBySystem(); BindServiceData s = new BindServiceData(); s.token = token; s.bindToken = bindToken; Loading @@ -1255,7 +1270,9 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.UNBIND_SERVICE, s); } @Override public final void scheduleServiceArgs(IBinder token, ParceledListSlice args) { assertCalledBySystem(); List<ServiceStartArgs> list = args.getList(); for (int i = 0; i < list.size(); i++) { Loading @@ -1278,7 +1295,9 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public final void scheduleStopService(IBinder token) { assertCalledBySystem(); if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) { Trace.instant(Trace.TRACE_TAG_ACTIVITY_MANAGER, "scheduleStopService. token=" + token); Loading @@ -1288,6 +1307,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override public final void scheduleTimeoutService(IBinder token, int startId) { assertCalledBySystem(); if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) { Trace.instant(Trace.TRACE_TAG_ACTIVITY_MANAGER, "scheduleTimeoutService. token=" + token); Loading @@ -1297,12 +1317,14 @@ public final class ActivityThread extends ClientTransactionHandler @Override public final void schedulePing(RemoteCallback pong) { assertCalledBySystem(); sendMessage(H.PING, pong); } @Override public final void scheduleTimeoutServiceForType(IBinder token, int startId, @ServiceInfo.ForegroundServiceType int fgsType) { assertCalledBySystem(); if (Trace.isTagEnabled(Trace.TRACE_TAG_ACTIVITY_MANAGER)) { Trace.instant(Trace.TRACE_TAG_ACTIVITY_MANAGER, "scheduleTimeoutServiceForType. token=" + token); Loading Loading @@ -1341,6 +1363,7 @@ public final class ActivityThread extends ClientTransactionHandler FileDescriptor applicationSharedMemoryFd, long startRequestedElapsedTime, long startRequestedUptime) { assertCalledBySystem(); if (DEBUG_STORE_ENABLED) { DebugStore.recordScheduleBindApplication(); } Loading Loading @@ -1436,22 +1459,30 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public final void runIsolatedEntryPoint(String entryPoint, String[] entryPointArgs) { assertCalledBySystem(); SomeArgs args = SomeArgs.obtain(); args.arg1 = entryPoint; args.arg2 = entryPointArgs; sendMessage(H.RUN_ISOLATED_ENTRY_POINT, args); } @Override public final void scheduleExit() { assertCalledBySystem(); sendMessage(H.EXIT_APPLICATION, null); } @Override public final void scheduleSuicide() { assertCalledBySystem(); sendMessage(H.SUICIDE, null); } @Override public void scheduleApplicationInfoChanged(ApplicationInfo ai) { assertCalledBySystem(); synchronized (mResourcesManager) { var oldAi = mPendingAppInfoUpdates.put(ai.packageName, ai); if (oldAi != null && oldAi.createTimestamp > ai.createTimestamp) { Loading @@ -1467,11 +1498,15 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.APPLICATION_INFO_CHANGED, ai.packageName); } @Override public void updateTimeZone() { assertCalledBySystem(); TimeZone.setDefault(null); } @Override public void clearDnsCache() { assertCalledBySystem(); // a non-standard API to get this to libcore InetAddress.clearDnsCache(); // Allow libcore to perform the necessary actions as it sees fit upon a network Loading @@ -1479,7 +1514,9 @@ public final class ActivityThread extends ClientTransactionHandler NetworkEventDispatcher.getInstance().dispatchNetworkConfigurationChange(); } @Override public void updateHttpProxy() { assertCalledBySystem(); final Application app; synchronized (ActivityThread.this) { app = getApplication(); Loading @@ -1494,12 +1531,16 @@ public final class ActivityThread extends ClientTransactionHandler ActivityThread.updateHttpProxy(app); } @Override public void processInBackground() { assertCalledBySystem(); mH.removeMessages(H.GC_WHEN_IDLE); mH.sendMessage(mH.obtainMessage(H.GC_WHEN_IDLE)); } @Override public void dumpService(ParcelFileDescriptor pfd, IBinder servicetoken, String[] args) { assertCalledBySystem(); DumpComponentInfo data = new DumpComponentInfo(); try { data.fd = pfd.dup(); Loading @@ -1516,11 +1557,13 @@ public final class ActivityThread extends ClientTransactionHandler // This function exists to make sure all receiver dispatching is // correctly ordered, since these are one-way calls and the binder driver // applies transaction ordering per object for such calls. @Override public void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent, int resultCode, String dataStr, Bundle extras, boolean ordered, boolean sticky, boolean assumeDelivered, int sendingUser, int processState, int sendingUid, String sendingPackage) throws RemoteException { assertCalledBySystem(); updateProcessState(processState, false); // We can't modify IIntentReceiver due to UnsupportedAppUsage, so Loading Loading @@ -1549,17 +1592,20 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void scheduleLowMemory() { assertCalledBySystem(); sendMessage(H.LOW_MEMORY, null); } @Override public void profilerControl(boolean start, ProfilerInfo profilerInfo, int profileType) { assertCalledBySystem(); sendMessage(H.PROFILER_CONTROL, profilerInfo, start ? 1 : 0, profileType); } @Override public void dumpHeap(boolean managed, boolean mallocInfo, boolean runGc, String dumpBitmaps, String path, ParcelFileDescriptor fd, RemoteCallback finishCallback) { assertCalledBySystem(); DumpHeapData dhd = new DumpHeapData(); dhd.managed = managed; dhd.mallocInfo = mallocInfo; Loading @@ -1580,15 +1626,21 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.DUMP_HEAP, dhd, 0, 0, true /*async*/); } @Override public void attachAgent(String agent) { assertCalledBySystem(); sendMessage(H.ATTACH_AGENT, agent); } @Override public void attachStartupAgents(String dataDir) { assertCalledBySystem(); sendMessage(H.ATTACH_STARTUP_AGENTS, dataDir); } @Override public void setSchedulingGroup(int group) { assertCalledBySystem(); // Note: do this immediately, since going into the foreground // should happen regardless of what pending work we have to do // and the activity manager will wait for us to report back that Loading @@ -1600,12 +1652,15 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public void dispatchPackageBroadcast(int cmd, String[] packages) { assertCalledBySystem(); sendMessage(H.DISPATCH_PACKAGE_BROADCAST, packages, cmd); } @Override public void scheduleCrash(String msg, int typeId, @Nullable Bundle extras) { assertCalledBySystem(); SomeArgs args = SomeArgs.obtain(); args.arg1 = msg; args.arg2 = extras; Loading @@ -1614,6 +1669,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void dumpResources(ParcelFileDescriptor fd, RemoteCallback callback) { assertCalledBySystem(); DumpResourcesData data = new DumpResourcesData(); try { data.fd = fd.dup(); Loading @@ -1626,8 +1682,10 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public void dumpActivity(ParcelFileDescriptor pfd, IBinder activitytoken, String prefix, String[] args) { assertCalledBySystem(); DumpComponentInfo data = new DumpComponentInfo(); try { data.fd = pfd.dup(); Loading @@ -1642,8 +1700,10 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public void dumpProvider(ParcelFileDescriptor pfd, IBinder providertoken, String[] args) { assertCalledBySystem(); DumpComponentInfo data = new DumpComponentInfo(); try { data.fd = pfd.dup(); Loading @@ -1662,6 +1722,7 @@ public final class ActivityThread extends ClientTransactionHandler public void dumpMemInfo(ParcelFileDescriptor pfd, Debug.MemoryInfo mem, boolean checkin, boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly, boolean dumpUnreachable, boolean dumpAllocatorStats, String[] args) { assertCalledBySystem(); FileOutputStream fout = new FileOutputStream(pfd.getFileDescriptor()); PrintWriter pw = new FastPrintWriter(fout); try { Loading Loading @@ -1869,6 +1930,7 @@ public final class ActivityThread extends ClientTransactionHandler public void dumpMemInfoProto(ParcelFileDescriptor pfd, Debug.MemoryInfo mem, boolean dumpFullInfo, boolean dumpDalvik, boolean dumpSummaryOnly, boolean dumpUnreachable, String[] args) { assertCalledBySystem(); ProtoOutputStream proto = new ProtoOutputStream(pfd.getFileDescriptor()); try { dumpMemInfo(proto, mem, dumpFullInfo, dumpDalvik, dumpSummaryOnly, dumpUnreachable); Loading Loading @@ -1996,6 +2058,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void dumpGfxInfo(ParcelFileDescriptor pfd, String[] args) { assertCalledBySystem(); DumpComponentInfo data = new DumpComponentInfo(); try { data.fd = pfd.dup(); Loading @@ -2012,6 +2075,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override @NeverCompile public void dumpBitmapsProto(ParcelFileDescriptor pfd, String dumpFormat) { assertCalledBySystem(); try { int pid = Process.myPid(); String processName = (mBoundApplication != null) Loading @@ -2026,6 +2090,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void dumpCacheInfo(ParcelFileDescriptor pfd, String[] args) { assertCalledBySystem(); try { PropertyInvalidatedCache.dumpCacheInfo(pfd, args); BroadcastStickyCache.dumpCacheInfo(pfd); Loading @@ -2049,6 +2114,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void dumpDbInfo(final ParcelFileDescriptor pfd, final String[] args) { assertCalledBySystem(); if (mSystemThread) { // Ensure this invocation is asynchronous to prevent writer waiting if buffer cannot // be consumed. But it must duplicate the file descriptor first, since caller might Loading Loading @@ -2081,12 +2147,14 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void unstableProviderDied(IBinder provider) { assertCalledBySystem(); sendMessage(H.UNSTABLE_PROVIDER_DIED, provider); } @Override public void requestAssistContextExtras(IBinder activityToken, IBinder requestToken, int requestType, int sessionId, int flags) { assertCalledBySystem(); RequestAssistContextExtras cmd = new RequestAssistContextExtras(); cmd.activityToken = activityToken; cmd.requestToken = requestToken; Loading @@ -2096,11 +2164,15 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.REQUEST_ASSIST_CONTEXT_EXTRAS, cmd); } @Override public void setCoreSettings(Bundle coreSettings) { assertCalledBySystem(); sendMessage(H.SET_CORE_SETTINGS, coreSettings); } @Override public void updatePackageCompatibilityInfo(String pkg, CompatibilityInfo info) { assertCalledBySystem(); UpdateCompatibilityData ucd = new UpdateCompatibilityData(); ucd.pkg = pkg; ucd.info = info; Loading @@ -2109,7 +2181,9 @@ public final class ActivityThread extends ClientTransactionHandler sendMessage(H.UPDATE_PACKAGE_COMPATIBILITY_INFO, ucd); } @Override public void scheduleTrimMemory(int level) { assertCalledBySystem(); final Runnable r = PooledLambda.obtainRunnable(ActivityThread::handleTrimMemory, ActivityThread.this, level).recycleOnUse(); // Schedule trimming memory after drawing the frame to minimize jank-risk. Loading @@ -2121,16 +2195,22 @@ public final class ActivityThread extends ClientTransactionHandler } } @Override public void scheduleTranslucentConversionComplete(IBinder token, boolean drawComplete) { assertCalledBySystem(); sendMessage(H.TRANSLUCENT_CONVERSION_COMPLETE, token, drawComplete ? 1 : 0); } @Override public void scheduleOnNewSceneTransitionInfo(IBinder token, SceneTransitionInfo info) { assertCalledBySystem(); sendMessage(H.ON_NEW_SCENE_TRANSITION_INFO, new Pair<IBinder, SceneTransitionInfo>(token, info)); } @Override public void setProcessState(int state) { assertCalledBySystem(); updateProcessState(state, true); } Loading @@ -2141,6 +2221,7 @@ public final class ActivityThread extends ClientTransactionHandler */ @Override public void setNetworkBlockSeq(long procStateSeq) { assertCalledBySystem(); synchronized (mNetworkPolicyLock) { mNetworkBlockSeq = procStateSeq; } Loading @@ -2148,11 +2229,13 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void scheduleInstallProvider(ProviderInfo provider) { assertCalledBySystem(); sendMessage(H.INSTALL_PROVIDER, provider); } @Override public final void updateTimePrefs(int timeFormatPreference) { assertCalledBySystem(); final Boolean timeFormatPreferenceBool; // For convenience we are using the Intent extra values. if (timeFormatPreference == Intent.EXTRA_TIME_PREF_VALUE_USE_12_HOUR) { Loading @@ -2169,11 +2252,13 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void scheduleEnterAnimationComplete(IBinder token) { assertCalledBySystem(); sendMessage(H.ENTER_ANIMATION_COMPLETE, token); } @Override public void notifyCleartextNetwork(byte[] firstPacket) { assertCalledBySystem(); if (StrictMode.vmCleartextNetworkEnabled()) { StrictMode.onCleartextNetworkDetected(firstPacket); } Loading @@ -2181,11 +2266,13 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void startBinderTracking() { assertCalledBySystem(); sendMessage(H.START_BINDER_TRACKING, null); } @Override public void stopBinderTrackingAndDump(ParcelFileDescriptor pfd) { assertCalledBySystem(); try { sendMessage(H.STOP_BINDER_TRACKING_AND_DUMP, pfd.dup()); } catch (IOException e) { Loading @@ -2197,6 +2284,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void scheduleLocalVoiceInteractionStarted(IBinder token, IVoiceInteractor voiceInteractor) throws RemoteException { assertCalledBySystem(); SomeArgs args = SomeArgs.obtain(); args.arg1 = token; args.arg2 = voiceInteractor; Loading @@ -2205,17 +2293,20 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void handleTrustStorageUpdate() { assertCalledBySystem(); NetworkSecurityPolicy.getInstance().handleTrustStorageUpdate(); } @Override public void scheduleTransaction(ClientTransaction transaction) throws RemoteException { assertCalledBySystem(); ActivityThread.this.scheduleTransaction(transaction); } @Override public void scheduleTaskFragmentTransaction(@NonNull ITaskFragmentOrganizer organizer, @NonNull TaskFragmentTransaction transaction) throws RemoteException { assertCalledBySystem(); // TODO(b/352665082): ITaskFragmentOrganizer can be cleanup to be a IBinder token organizer.onTransactionReady(transaction); } Loading @@ -2224,6 +2315,7 @@ public final class ActivityThread extends ClientTransactionHandler public void requestDirectActions(@NonNull IBinder activityToken, @NonNull IVoiceInteractor interactor, @Nullable RemoteCallback cancellationCallback, @NonNull RemoteCallback callback) { assertCalledBySystem(); final CancellationSignal cancellationSignal = new CancellationSignal(); if (cancellationCallback != null) { final ICancellationSignal transport = createSafeCancellationTransport( Loading @@ -2242,6 +2334,7 @@ public final class ActivityThread extends ClientTransactionHandler public void performDirectAction(@NonNull IBinder activityToken, @NonNull String actionId, @Nullable Bundle arguments, @Nullable RemoteCallback cancellationCallback, @NonNull RemoteCallback resultCallback) { assertCalledBySystem(); final CancellationSignal cancellationSignal = new CancellationSignal(); if (cancellationCallback != null) { final ICancellationSignal transport = createSafeCancellationTransport( Loading @@ -2259,6 +2352,7 @@ public final class ActivityThread extends ClientTransactionHandler @Override public void notifyContentProviderPublishStatus(@NonNull ContentProviderHolder holder, @NonNull String authorities, int userId, boolean published) { assertCalledBySystem(); final String auths[] = authorities.split(";"); for (String auth: auths) { final ProviderKey key = getGetProviderKey(auth, userId); Loading @@ -2273,6 +2367,7 @@ public final class ActivityThread extends ClientTransactionHandler public void instrumentWithoutRestart(ComponentName instrumentationName, Bundle instrumentationArgs, IInstrumentationWatcher instrumentationWatcher, IUiAutomationConnection instrumentationUiConnection, ApplicationInfo targetInfo) { assertCalledBySystem(); AppBindData data = new AppBindData(); data.instrumentationName = instrumentationName; data.instrumentationArgs = instrumentationArgs; Loading @@ -2286,6 +2381,7 @@ public final class ActivityThread extends ClientTransactionHandler public void updateUiTranslationState(IBinder activityToken, int state, TranslationSpec sourceSpec, TranslationSpec targetSpec, List<AutofillId> viewIds, UiTranslationSpec uiTranslationSpec) { assertCalledBySystem(); SomeArgs args = SomeArgs.obtain(); args.arg1 = activityToken; args.arg2 = state; Loading @@ -2300,6 +2396,7 @@ public final class ActivityThread extends ClientTransactionHandler public void getExecutableMethodFileOffsets( @NonNull MethodDescriptor methodDescriptor, @NonNull IOffsetCallback resultCallback) { assertCalledBySystem(); Executable executable = MethodDescriptorParser.parseMethodDescriptor( getClass().getClassLoader(), methodDescriptor); VMDebug.ExecutableMethodFileOffsets location; Loading @@ -2324,6 +2421,29 @@ public final class ActivityThread extends ClientTransactionHandler throw e.rethrowFromSystemServer(); } } private void assertCalledBySystem() { int callingUid = Binder.getCallingUid(); if (callingUid != Process.SYSTEM_UID) { String packageName; if (callingUid == Process.ROOT_UID) { packageName = "root"; } else { String[] packagesForUid = getSystemContext().getPackageManager().getPackagesForUid(callingUid); if (packagesForUid == null || packagesForUid.length == 0) { packageName = "unknown"; } else if (packagesForUid.length == 1) { packageName = packagesForUid[0]; } else { packageName = Arrays.asList(packagesForUid).stream().sorted().collect( Collectors.joining(", ")); } } Slog.wtf(TAG, "ApplicationThread called by non-system process" + " (" + callingUid + "): " + packageName); } } } private @NonNull SafeCancellationTransport createSafeCancellationTransport( Loading