赞
踩
在android开发的过程中异常几乎是家常小菜了,常见的异常估计就那些大家熟知的,那今天博主给大家分享一个作为一个开发者很少遇到的异常,再
此之前都不知道android系统居然还有这样的限制,今天就把这个排错的过程以及源码的分享给大家分享一下,希望大家在以后开发的过程中遇到类似
问题有一个参考!
需求的过程:
首先我把问题产生的过程大致描述一遍,我们的项目中有一个关于行车轨迹回放的功能,而这个功能的需求是这样的,当用户选择一个最近30天的日期,程序根据
该日期去服务器获取该日期的轨迹数据包,这个包通常情况下会很大,平均每天大概80000多个点,程序获取成功后会得到json数据,项目的架构是在fragment下
将数据以Intent.putExtras函数将Bundle传递给activity,activity拿到数据后,先解析json然后将轨迹数据解密,重新封装,再将封装好的数据传递给自定义的绘制控
制,让笔者自己封装的控件进行绘制轨迹线路,在用一个小车切图的marker进行移动动画展示给用户,这就是这个功能的大致实现了
问题的产生:
在fragment拿到数据后通过Bundle.putString(key,JSONObject.toString());将数据存好,在Intent.putExtras(Bundle);然后通过 getContext().startActivity跳转到我的
activity,将数据给到activity,在跳转的过程发生闪退,并且这个现象在所有的android手机上可以复现,100%复现,并且 activity onCreate()函数没被调用,我开始
觉得诡异,就怀疑是不是轨迹点有问题?我去后台查了当天的轨迹数据,发现没有任何问题,只是点太多了而已,然后继续回到程序中,检测代码,代码也没有任
何错误跟逻辑问题,我并开始怀疑是不是Intent或者是Bundle携带的数据过大导致的,我就打开Linux查看android源码,发现这这两个类的存储函数是没有大小限制
的,于是乎开始怀疑getContext().startActivity(Intent)函数,因为公司测试人员的手机没有打开开发者模式,并且属于深度定制,于是笔者将程序安装在了一个MTK方
案上的手机上,叫来了自己的同事一起来看这个问题,同事把log写到了本地,结果
发现确实是getContext().startActivity(Intent)函数引起的,由于传递的包过大导致程序进程被kill掉了
异常的log截图:
源码的分析(底层启动activity的机制):
我们分序号来一个一个得看调用关系,这样会理得清楚一点,根据先后调用,序号递增排列
① 调用 com.android.server.am.ActivityManagerService 的 onTransact 函数,而该函数super.onTransact也就是其父类的onTransact函数,其父类 android.app.ActivityManagerNative
com.android.server.am.ActivityManagerService 的 onTransact 函数代码:
- @Override
- public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
- throws RemoteException {
- if (code == SYSPROPS_TRANSACTION) {
- // We need to tell all apps about the system property change.
- ArrayList<IBinder> procs = new ArrayList<IBinder>();
- synchronized(this) {
- final int NP = mProcessNames.getMap().size();
- for (int ip=0; ip<NP; ip++) {
- SparseArray<ProcessRecord> apps = mProcessNames.getMap().valueAt(ip);
- final int NA = apps.size();
- for (int ia=0; ia<NA; ia++) {
- ProcessRecord app = apps.valueAt(ia);
- if (app.thread != null) {
- procs.add(app.thread.asBinder());
- }
- }
- }
- }
-
- int N = procs.size();
- for (int i=0; i<N; i++) {
- Parcel data2 = Parcel.obtain();
- try {
- procs.get(i).transact(IBinder.SYSPROPS_TRANSACTION, data2, null, 0);
- } catch (RemoteException e) {
- }
- data2.recycle();
- }
- }
- try {
- return super.onTransact(code, data, reply, flags);
- } catch (RuntimeException e) {
- // The activity manager only throws security exceptions, so let's
- // log all others.
- if (!(e instanceof SecurityException)) {
- Slog.wtf(TAG, "Activity Manager Crash", e);
- }
- throw e;
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
注意:该函数代码贼长...,读者可以直接跳跃到case ATTACH_APPLICATION_TRANSACTION 那里
- @Override
- public boolean onTransact(int code, Parcel data, Parcel reply, int flags)
- throws RemoteException {
- switch (code) {
- case START_ACTIVITY_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- String callingPackage = data.readString();
- Intent intent = Intent.CREATOR.createFromParcel(data);
- String resolvedType = data.readString();
- IBinder resultTo = data.readStrongBinder();
- String resultWho = data.readString();
- int requestCode = data.readInt();
- int startFlags = data.readInt();
- ProfilerInfo profilerInfo = data.readInt() != 0
- ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
- Bundle options = data.readInt() != 0
- ? Bundle.CREATOR.createFromParcel(data) : null;
- int result = startActivity(app, callingPackage, intent, resolvedType,
- resultTo, resultWho, requestCode, startFlags, profilerInfo, options);
- reply.writeNoException();
- reply.writeInt(result);
- return true;
- }
-
- case START_ACTIVITY_AS_USER_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- String callingPackage = data.readString();
- Intent intent = Intent.CREATOR.createFromParcel(data);
- String resolvedType = data.readString();
- IBinder resultTo = data.readStrongBinder();
- String resultWho = data.readString();
- int requestCode = data.readInt();
- int startFlags = data.readInt();
- ProfilerInfo profilerInfo = data.readInt() != 0
- ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
- Bundle options = data.readInt() != 0
- ? Bundle.CREATOR.createFromParcel(data) : null;
- int userId = data.readInt();
- int result = startActivityAsUser(app, callingPackage, intent, resolvedType,
- resultTo, resultWho, requestCode, startFlags, profilerInfo, options, userId);
- reply.writeNoException();
- reply.writeInt(result);
- return true;
- }
-
- case START_ACTIVITY_AS_CALLER_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- String callingPackage = data.readString();
- Intent intent = Intent.CREATOR.createFromParcel(data);
- String resolvedType = data.readString();
- IBinder resultTo = data.readStrongBinder();
- String resultWho = data.readString();
- int requestCode = data.readInt();
- int startFlags = data.readInt();
- ProfilerInfo profilerInfo = data.readInt() != 0
- ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
- Bundle options = data.readInt() != 0
- ? Bundle.CREATOR.createFromParcel(data) : null;
- boolean ignoreTargetSecurity = data.readInt() != 0;
- int userId = data.readInt();
- int result = startActivityAsCaller(app, callingPackage, intent, resolvedType,
- resultTo, resultWho, requestCode, startFlags, profilerInfo, options,
- ignoreTargetSecurity, userId);
- reply.writeNoException();
- reply.writeInt(result);
- return true;
- }
-
- case START_ACTIVITY_AND_WAIT_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- String callingPackage = data.readString();
- Intent intent = Intent.CREATOR.createFromParcel(data);
- String resolvedType = data.readString();
- IBinder resultTo = data.readStrongBinder();
- String resultWho = data.readString();
- int requestCode = data.readInt();
- int startFlags = data.readInt();
- ProfilerInfo profilerInfo = data.readInt() != 0
- ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
- Bundle options = data.readInt() != 0
- ? Bundle.CREATOR.createFromParcel(data) : null;
- int userId = data.readInt();
- WaitResult result = startActivityAndWait(app, callingPackage, intent, resolvedType,
- resultTo, resultWho, requestCode, startFlags, profilerInfo, options, userId);
- reply.writeNoException();
- result.writeToParcel(reply, 0);
- return true;
- }
-
- case START_ACTIVITY_WITH_CONFIG_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- String callingPackage = data.readString();
- Intent intent = Intent.CREATOR.createFromParcel(data);
- String resolvedType = data.readString();
- IBinder resultTo = data.readStrongBinder();
- String resultWho = data.readString();
- int requestCode = data.readInt();
- int startFlags = data.readInt();
- Configuration config = Configuration.CREATOR.createFromParcel(data);
- Bundle options = data.readInt() != 0
- ? Bundle.CREATOR.createFromParcel(data) : null;
- int userId = data.readInt();
- int result = startActivityWithConfig(app, callingPackage, intent, resolvedType,
- resultTo, resultWho, requestCode, startFlags, config, options, userId);
- reply.writeNoException();
- reply.writeInt(result);
- return true;
- }
-
- case START_ACTIVITY_INTENT_SENDER_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- IntentSender intent = IntentSender.CREATOR.createFromParcel(data);
- Intent fillInIntent = null;
- if (data.readInt() != 0) {
- fillInIntent = Intent.CREATOR.createFromParcel(data);
- }
- String resolvedType = data.readString();
- IBinder resultTo = data.readStrongBinder();
- String resultWho = data.readString();
- int requestCode = data.readInt();
- int flagsMask = data.readInt();
- int flagsValues = data.readInt();
- Bundle options = data.readInt() != 0
- ? Bundle.CREATOR.createFromParcel(data) : null;
- int result = startActivityIntentSender(app, intent,
- fillInIntent, resolvedType, resultTo, resultWho,
- requestCode, flagsMask, flagsValues, options);
- reply.writeNoException();
- reply.writeInt(result);
- return true;
- }
-
- case START_VOICE_ACTIVITY_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- String callingPackage = data.readString();
- int callingPid = data.readInt();
- int callingUid = data.readInt();
- Intent intent = Intent.CREATOR.createFromParcel(data);
- String resolvedType = data.readString();
- IVoiceInteractionSession session = IVoiceInteractionSession.Stub.asInterface(
- data.readStrongBinder());
- IVoiceInteractor interactor = IVoiceInteractor.Stub.asInterface(
- data.readStrongBinder());
- int startFlags = data.readInt();
- ProfilerInfo profilerInfo = data.readInt() != 0
- ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
- Bundle options = data.readInt() != 0
- ? Bundle.CREATOR.createFromParcel(data) : null;
- int userId = data.readInt();
- int result = startVoiceActivity(callingPackage, callingPid, callingUid, intent,
- resolvedType, session, interactor, startFlags, profilerInfo, options, userId);
- reply.writeNoException();
- reply.writeInt(result);
- return true;
- }
-
- case START_NEXT_MATCHING_ACTIVITY_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder callingActivity = data.readStrongBinder();
- Intent intent = Intent.CREATOR.createFromParcel(data);
- Bundle options = data.readInt() != 0
- ? Bundle.CREATOR.createFromParcel(data) : null;
- boolean result = startNextMatchingActivity(callingActivity, intent, options);
- reply.writeNoException();
- reply.writeInt(result ? 1 : 0);
- return true;
- }
-
- case START_ACTIVITY_FROM_RECENTS_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- int taskId = data.readInt();
- Bundle options = data.readInt() == 0 ? null : Bundle.CREATOR.createFromParcel(data);
- int result = startActivityFromRecents(taskId, options);
- reply.writeNoException();
- reply.writeInt(result);
- return true;
- }
-
- case FINISH_ACTIVITY_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- Intent resultData = null;
- int resultCode = data.readInt();
- if (data.readInt() != 0) {
- resultData = Intent.CREATOR.createFromParcel(data);
- }
- boolean finishTask = (data.readInt() != 0);
- boolean res = finishActivity(token, resultCode, resultData, finishTask);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case FINISH_SUB_ACTIVITY_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- String resultWho = data.readString();
- int requestCode = data.readInt();
- finishSubActivity(token, resultWho, requestCode);
- reply.writeNoException();
- return true;
- }
-
- case FINISH_ACTIVITY_AFFINITY_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- boolean res = finishActivityAffinity(token);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case FINISH_VOICE_TASK_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IVoiceInteractionSession session = IVoiceInteractionSession.Stub.asInterface(
- data.readStrongBinder());
- finishVoiceTask(session);
- reply.writeNoException();
- return true;
- }
-
- case RELEASE_ACTIVITY_INSTANCE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- boolean res = releaseActivityInstance(token);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case RELEASE_SOME_ACTIVITIES_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IApplicationThread app = ApplicationThreadNative.asInterface(data.readStrongBinder());
- releaseSomeActivities(app);
- reply.writeNoException();
- return true;
- }
-
- case WILL_ACTIVITY_BE_VISIBLE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- boolean res = willActivityBeVisible(token);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case REGISTER_RECEIVER_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app =
- b != null ? ApplicationThreadNative.asInterface(b) : null;
- String packageName = data.readString();
- b = data.readStrongBinder();
- IIntentReceiver rec
- = b != null ? IIntentReceiver.Stub.asInterface(b) : null;
- IntentFilter filter = IntentFilter.CREATOR.createFromParcel(data);
- String perm = data.readString();
- int userId = data.readInt();
- Intent intent = registerReceiver(app, packageName, rec, filter, perm, userId);
- reply.writeNoException();
- if (intent != null) {
- reply.writeInt(1);
- intent.writeToParcel(reply, 0);
- } else {
- reply.writeInt(0);
- }
- return true;
- }
-
- case UNREGISTER_RECEIVER_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- if (b == null) {
- return true;
- }
- IIntentReceiver rec = IIntentReceiver.Stub.asInterface(b);
- unregisterReceiver(rec);
- reply.writeNoException();
- return true;
- }
-
- case BROADCAST_INTENT_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app =
- b != null ? ApplicationThreadNative.asInterface(b) : null;
- Intent intent = Intent.CREATOR.createFromParcel(data);
- String resolvedType = data.readString();
- b = data.readStrongBinder();
- IIntentReceiver resultTo =
- b != null ? IIntentReceiver.Stub.asInterface(b) : null;
- int resultCode = data.readInt();
- String resultData = data.readString();
- Bundle resultExtras = data.readBundle();
- String[] perms = data.readStringArray();
- int appOp = data.readInt();
- Bundle options = data.readBundle();
- boolean serialized = data.readInt() != 0;
- boolean sticky = data.readInt() != 0;
- int userId = data.readInt();
- int res = broadcastIntent(app, intent, resolvedType, resultTo,
- resultCode, resultData, resultExtras, perms, appOp,
- options, serialized, sticky, userId);
- reply.writeNoException();
- reply.writeInt(res);
- return true;
- }
-
- case UNBROADCAST_INTENT_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = b != null ? ApplicationThreadNative.asInterface(b) : null;
- Intent intent = Intent.CREATOR.createFromParcel(data);
- int userId = data.readInt();
- unbroadcastIntent(app, intent, userId);
- reply.writeNoException();
- return true;
- }
-
- case FINISH_RECEIVER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder who = data.readStrongBinder();
- int resultCode = data.readInt();
- String resultData = data.readString();
- Bundle resultExtras = data.readBundle();
- boolean resultAbort = data.readInt() != 0;
- int intentFlags = data.readInt();
- if (who != null) {
- finishReceiver(who, resultCode, resultData, resultExtras, resultAbort, intentFlags);
- }
- reply.writeNoException();
- return true;
- }
-
- case ATTACH_APPLICATION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IApplicationThread app = ApplicationThreadNative.asInterface(
- data.readStrongBinder());
- if (app != null) {
- attachApplication(app);
- }
- reply.writeNoException();
- return true;
- }
-
- case ACTIVITY_IDLE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- Configuration config = null;
- if (data.readInt() != 0) {
- config = Configuration.CREATOR.createFromParcel(data);
- }
- boolean stopProfiling = data.readInt() != 0;
- if (token != null) {
- activityIdle(token, config, stopProfiling);
- }
- reply.writeNoException();
- return true;
- }
-
- case ACTIVITY_RESUMED_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- activityResumed(token);
- reply.writeNoException();
- return true;
- }
-
- case ACTIVITY_PAUSED_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- activityPaused(token);
- reply.writeNoException();
- return true;
- }
-
- case ACTIVITY_STOPPED_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- Bundle map = data.readBundle();
- PersistableBundle persistentState = data.readPersistableBundle();
- CharSequence description = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(data);
- activityStopped(token, map, persistentState, description);
- reply.writeNoException();
- return true;
- }
-
- case ACTIVITY_SLEPT_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- activitySlept(token);
- reply.writeNoException();
- return true;
- }
-
- case ACTIVITY_DESTROYED_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- activityDestroyed(token);
- reply.writeNoException();
- return true;
- }
-
- case GET_CALLING_PACKAGE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- String res = token != null ? getCallingPackage(token) : null;
- reply.writeNoException();
- reply.writeString(res);
- return true;
- }
-
- case GET_CALLING_ACTIVITY_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- ComponentName cn = getCallingActivity(token);
- reply.writeNoException();
- ComponentName.writeToParcel(cn, reply);
- return true;
- }
-
- case GET_APP_TASKS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String callingPackage = data.readString();
- List<IAppTask> list = getAppTasks(callingPackage);
- reply.writeNoException();
- int N = list != null ? list.size() : -1;
- reply.writeInt(N);
- int i;
- for (i=0; i<N; i++) {
- IAppTask task = list.get(i);
- reply.writeStrongBinder(task.asBinder());
- }
- return true;
- }
-
- case ADD_APP_TASK_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder activityToken = data.readStrongBinder();
- Intent intent = Intent.CREATOR.createFromParcel(data);
- ActivityManager.TaskDescription descr
- = ActivityManager.TaskDescription.CREATOR.createFromParcel(data);
- Bitmap thumbnail = Bitmap.CREATOR.createFromParcel(data);
- int res = addAppTask(activityToken, intent, descr, thumbnail);
- reply.writeNoException();
- reply.writeInt(res);
- return true;
- }
-
- case GET_APP_TASK_THUMBNAIL_SIZE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- Point size = getAppTaskThumbnailSize();
- reply.writeNoException();
- size.writeToParcel(reply, 0);
- return true;
- }
-
- case GET_TASKS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int maxNum = data.readInt();
- int fl = data.readInt();
- List<ActivityManager.RunningTaskInfo> list = getTasks(maxNum, fl);
- reply.writeNoException();
- int N = list != null ? list.size() : -1;
- reply.writeInt(N);
- int i;
- for (i=0; i<N; i++) {
- ActivityManager.RunningTaskInfo info = list.get(i);
- info.writeToParcel(reply, 0);
- }
- return true;
- }
-
- case GET_RECENT_TASKS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int maxNum = data.readInt();
- int fl = data.readInt();
- int userId = data.readInt();
- List<ActivityManager.RecentTaskInfo> list = getRecentTasks(maxNum,
- fl, userId);
- reply.writeNoException();
- reply.writeTypedList(list);
- return true;
- }
-
- case GET_TASK_THUMBNAIL_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int id = data.readInt();
- ActivityManager.TaskThumbnail taskThumbnail = getTaskThumbnail(id);
- reply.writeNoException();
- if (taskThumbnail != null) {
- reply.writeInt(1);
- taskThumbnail.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
- } else {
- reply.writeInt(0);
- }
- return true;
- }
-
- case GET_SERVICES_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int maxNum = data.readInt();
- int fl = data.readInt();
- List<ActivityManager.RunningServiceInfo> list = getServices(maxNum, fl);
- reply.writeNoException();
- int N = list != null ? list.size() : -1;
- reply.writeInt(N);
- int i;
- for (i=0; i<N; i++) {
- ActivityManager.RunningServiceInfo info = list.get(i);
- info.writeToParcel(reply, 0);
- }
- return true;
- }
-
- case GET_PROCESSES_IN_ERROR_STATE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- List<ActivityManager.ProcessErrorStateInfo> list = getProcessesInErrorState();
- reply.writeNoException();
- reply.writeTypedList(list);
- return true;
- }
-
- case GET_RUNNING_APP_PROCESSES_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- List<ActivityManager.RunningAppProcessInfo> list = getRunningAppProcesses();
- reply.writeNoException();
- reply.writeTypedList(list);
- return true;
- }
-
- case GET_RUNNING_EXTERNAL_APPLICATIONS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- List<ApplicationInfo> list = getRunningExternalApplications();
- reply.writeNoException();
- reply.writeTypedList(list);
- return true;
- }
-
- case MOVE_TASK_TO_FRONT_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int task = data.readInt();
- int fl = data.readInt();
- Bundle options = data.readInt() != 0
- ? Bundle.CREATOR.createFromParcel(data) : null;
- moveTaskToFront(task, fl, options);
- reply.writeNoException();
- return true;
- }
-
- case MOVE_ACTIVITY_TASK_TO_BACK_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- boolean nonRoot = data.readInt() != 0;
- boolean res = moveActivityTaskToBack(token, nonRoot);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case MOVE_TASK_BACKWARDS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int task = data.readInt();
- moveTaskBackwards(task);
- reply.writeNoException();
- return true;
- }
-
- case MOVE_TASK_TO_STACK_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int taskId = data.readInt();
- int stackId = data.readInt();
- boolean toTop = data.readInt() != 0;
- moveTaskToStack(taskId, stackId, toTop);
- reply.writeNoException();
- return true;
- }
-
- case RESIZE_STACK_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int stackId = data.readInt();
- Rect r = Rect.CREATOR.createFromParcel(data);
- resizeStack(stackId, r);
- reply.writeNoException();
- return true;
- }
-
- case GET_ALL_STACK_INFOS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- List<StackInfo> list = getAllStackInfos();
- reply.writeNoException();
- reply.writeTypedList(list);
- return true;
- }
-
- case GET_STACK_INFO_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int stackId = data.readInt();
- StackInfo info = getStackInfo(stackId);
- reply.writeNoException();
- if (info != null) {
- reply.writeInt(1);
- info.writeToParcel(reply, 0);
- } else {
- reply.writeInt(0);
- }
- return true;
- }
-
- case IS_IN_HOME_STACK_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int taskId = data.readInt();
- boolean isInHomeStack = isInHomeStack(taskId);
- reply.writeNoException();
- reply.writeInt(isInHomeStack ? 1 : 0);
- return true;
- }
-
- case SET_FOCUSED_STACK_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int stackId = data.readInt();
- setFocusedStack(stackId);
- reply.writeNoException();
- return true;
- }
-
- case GET_FOCUSED_STACK_ID_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int focusedStackId = getFocusedStackId();
- reply.writeNoException();
- reply.writeInt(focusedStackId);
- return true;
- }
-
- case REGISTER_TASK_STACK_LISTENER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- registerTaskStackListener(ITaskStackListener.Stub.asInterface(token));
- reply.writeNoException();
- return true;
- }
-
- case GET_TASK_FOR_ACTIVITY_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- boolean onlyRoot = data.readInt() != 0;
- int res = token != null
- ? getTaskForActivity(token, onlyRoot) : -1;
- reply.writeNoException();
- reply.writeInt(res);
- return true;
- }
-
- case GET_CONTENT_PROVIDER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- String name = data.readString();
- int userId = data.readInt();
- boolean stable = data.readInt() != 0;
- ContentProviderHolder cph = getContentProvider(app, name, userId, stable);
- reply.writeNoException();
- if (cph != null) {
- reply.writeInt(1);
- cph.writeToParcel(reply, 0);
- } else {
- reply.writeInt(0);
- }
- return true;
- }
-
- case GET_CONTENT_PROVIDER_EXTERNAL_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String name = data.readString();
- int userId = data.readInt();
- IBinder token = data.readStrongBinder();
- ContentProviderHolder cph = getContentProviderExternal(name, userId, token);
- reply.writeNoException();
- if (cph != null) {
- reply.writeInt(1);
- cph.writeToParcel(reply, 0);
- } else {
- reply.writeInt(0);
- }
- return true;
- }
-
- case PUBLISH_CONTENT_PROVIDERS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- ArrayList<ContentProviderHolder> providers =
- data.createTypedArrayList(ContentProviderHolder.CREATOR);
- publishContentProviders(app, providers);
- reply.writeNoException();
- return true;
- }
-
- case REF_CONTENT_PROVIDER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- int stable = data.readInt();
- int unstable = data.readInt();
- boolean res = refContentProvider(b, stable, unstable);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case UNSTABLE_PROVIDER_DIED_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- unstableProviderDied(b);
- reply.writeNoException();
- return true;
- }
-
- case APP_NOT_RESPONDING_VIA_PROVIDER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- appNotRespondingViaProvider(b);
- reply.writeNoException();
- return true;
- }
-
- case REMOVE_CONTENT_PROVIDER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- boolean stable = data.readInt() != 0;
- removeContentProvider(b, stable);
- reply.writeNoException();
- return true;
- }
-
- case REMOVE_CONTENT_PROVIDER_EXTERNAL_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String name = data.readString();
- IBinder token = data.readStrongBinder();
- removeContentProviderExternal(name, token);
- reply.writeNoException();
- return true;
- }
-
- case GET_RUNNING_SERVICE_CONTROL_PANEL_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- ComponentName comp = ComponentName.CREATOR.createFromParcel(data);
- PendingIntent pi = getRunningServiceControlPanel(comp);
- reply.writeNoException();
- PendingIntent.writePendingIntentOrNullToParcel(pi, reply);
- return true;
- }
-
- case START_SERVICE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- Intent service = Intent.CREATOR.createFromParcel(data);
- String resolvedType = data.readString();
- String callingPackage = data.readString();
- int userId = data.readInt();
- ComponentName cn = startService(app, service, resolvedType, callingPackage, userId);
- reply.writeNoException();
- ComponentName.writeToParcel(cn, reply);
- return true;
- }
-
- case STOP_SERVICE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- Intent service = Intent.CREATOR.createFromParcel(data);
- String resolvedType = data.readString();
- int userId = data.readInt();
- int res = stopService(app, service, resolvedType, userId);
- reply.writeNoException();
- reply.writeInt(res);
- return true;
- }
-
- case STOP_SERVICE_TOKEN_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- ComponentName className = ComponentName.readFromParcel(data);
- IBinder token = data.readStrongBinder();
- int startId = data.readInt();
- boolean res = stopServiceToken(className, token, startId);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case SET_SERVICE_FOREGROUND_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- ComponentName className = ComponentName.readFromParcel(data);
- IBinder token = data.readStrongBinder();
- int id = data.readInt();
- Notification notification = null;
- if (data.readInt() != 0) {
- notification = Notification.CREATOR.createFromParcel(data);
- }
- boolean removeNotification = data.readInt() != 0;
- setServiceForeground(className, token, id, notification, removeNotification);
- reply.writeNoException();
- return true;
- }
-
- case BIND_SERVICE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- IBinder token = data.readStrongBinder();
- Intent service = Intent.CREATOR.createFromParcel(data);
- String resolvedType = data.readString();
- b = data.readStrongBinder();
- int fl = data.readInt();
- String callingPackage = data.readString();
- int userId = data.readInt();
- IServiceConnection conn = IServiceConnection.Stub.asInterface(b);
- int res = bindService(app, token, service, resolvedType, conn, fl,
- callingPackage, userId);
- reply.writeNoException();
- reply.writeInt(res);
- return true;
- }
-
- case UNBIND_SERVICE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IServiceConnection conn = IServiceConnection.Stub.asInterface(b);
- boolean res = unbindService(conn);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case PUBLISH_SERVICE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- Intent intent = Intent.CREATOR.createFromParcel(data);
- IBinder service = data.readStrongBinder();
- publishService(token, intent, service);
- reply.writeNoException();
- return true;
- }
-
- case UNBIND_FINISHED_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- Intent intent = Intent.CREATOR.createFromParcel(data);
- boolean doRebind = data.readInt() != 0;
- unbindFinished(token, intent, doRebind);
- reply.writeNoException();
- return true;
- }
-
- case SERVICE_DONE_EXECUTING_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- int type = data.readInt();
- int startId = data.readInt();
- int res = data.readInt();
- serviceDoneExecuting(token, type, startId, res);
- reply.writeNoException();
- return true;
- }
-
- case START_INSTRUMENTATION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- ComponentName className = ComponentName.readFromParcel(data);
- String profileFile = data.readString();
- int fl = data.readInt();
- Bundle arguments = data.readBundle();
- IBinder b = data.readStrongBinder();
- IInstrumentationWatcher w = IInstrumentationWatcher.Stub.asInterface(b);
- b = data.readStrongBinder();
- IUiAutomationConnection c = IUiAutomationConnection.Stub.asInterface(b);
- int userId = data.readInt();
- String abiOverride = data.readString();
- boolean res = startInstrumentation(className, profileFile, fl, arguments, w, c, userId,
- abiOverride);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
-
- case FINISH_INSTRUMENTATION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- int resultCode = data.readInt();
- Bundle results = data.readBundle();
- finishInstrumentation(app, resultCode, results);
- reply.writeNoException();
- return true;
- }
-
- case GET_CONFIGURATION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- Configuration config = getConfiguration();
- reply.writeNoException();
- config.writeToParcel(reply, 0);
- return true;
- }
-
- case UPDATE_CONFIGURATION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- Configuration config = Configuration.CREATOR.createFromParcel(data);
- updateConfiguration(config);
- reply.writeNoException();
- return true;
- }
-
- case SET_REQUESTED_ORIENTATION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- int requestedOrientation = data.readInt();
- setRequestedOrientation(token, requestedOrientation);
- reply.writeNoException();
- return true;
- }
-
- case GET_REQUESTED_ORIENTATION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- int req = getRequestedOrientation(token);
- reply.writeNoException();
- reply.writeInt(req);
- return true;
- }
-
- case GET_ACTIVITY_CLASS_FOR_TOKEN_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- ComponentName cn = getActivityClassForToken(token);
- reply.writeNoException();
- ComponentName.writeToParcel(cn, reply);
- return true;
- }
-
- case GET_PACKAGE_FOR_TOKEN_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- reply.writeNoException();
- reply.writeString(getPackageForToken(token));
- return true;
- }
-
- case GET_INTENT_SENDER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int type = data.readInt();
- String packageName = data.readString();
- IBinder token = data.readStrongBinder();
- String resultWho = data.readString();
- int requestCode = data.readInt();
- Intent[] requestIntents;
- String[] requestResolvedTypes;
- if (data.readInt() != 0) {
- requestIntents = data.createTypedArray(Intent.CREATOR);
- requestResolvedTypes = data.createStringArray();
- } else {
- requestIntents = null;
- requestResolvedTypes = null;
- }
- int fl = data.readInt();
- Bundle options = data.readInt() != 0
- ? Bundle.CREATOR.createFromParcel(data) : null;
- int userId = data.readInt();
- IIntentSender res = getIntentSender(type, packageName, token,
- resultWho, requestCode, requestIntents,
- requestResolvedTypes, fl, options, userId);
- reply.writeNoException();
- reply.writeStrongBinder(res != null ? res.asBinder() : null);
- return true;
- }
-
- case CANCEL_INTENT_SENDER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IIntentSender r = IIntentSender.Stub.asInterface(
- data.readStrongBinder());
- cancelIntentSender(r);
- reply.writeNoException();
- return true;
- }
-
- case GET_PACKAGE_FOR_INTENT_SENDER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IIntentSender r = IIntentSender.Stub.asInterface(
- data.readStrongBinder());
- String res = getPackageForIntentSender(r);
- reply.writeNoException();
- reply.writeString(res);
- return true;
- }
-
- case GET_UID_FOR_INTENT_SENDER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IIntentSender r = IIntentSender.Stub.asInterface(
- data.readStrongBinder());
- int res = getUidForIntentSender(r);
- reply.writeNoException();
- reply.writeInt(res);
- return true;
- }
-
- case HANDLE_INCOMING_USER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int callingPid = data.readInt();
- int callingUid = data.readInt();
- int userId = data.readInt();
- boolean allowAll = data.readInt() != 0 ;
- boolean requireFull = data.readInt() != 0;
- String name = data.readString();
- String callerPackage = data.readString();
- int res = handleIncomingUser(callingPid, callingUid, userId, allowAll,
- requireFull, name, callerPackage);
- reply.writeNoException();
- reply.writeInt(res);
- return true;
- }
-
- case SET_PROCESS_LIMIT_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int max = data.readInt();
- setProcessLimit(max);
- reply.writeNoException();
- return true;
- }
-
- case GET_PROCESS_LIMIT_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int limit = getProcessLimit();
- reply.writeNoException();
- reply.writeInt(limit);
- return true;
- }
-
- case SET_PROCESS_FOREGROUND_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- int pid = data.readInt();
- boolean isForeground = data.readInt() != 0;
- setProcessForeground(token, pid, isForeground);
- reply.writeNoException();
- return true;
- }
-
- case CHECK_PERMISSION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String perm = data.readString();
- int pid = data.readInt();
- int uid = data.readInt();
- int res = checkPermission(perm, pid, uid);
- reply.writeNoException();
- reply.writeInt(res);
- return true;
- }
-
- case CHECK_PERMISSION_WITH_TOKEN_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String perm = data.readString();
- int pid = data.readInt();
- int uid = data.readInt();
- IBinder token = data.readStrongBinder();
- int res = checkPermissionWithToken(perm, pid, uid, token);
- reply.writeNoException();
- reply.writeInt(res);
- return true;
- }
-
- case CHECK_URI_PERMISSION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- Uri uri = Uri.CREATOR.createFromParcel(data);
- int pid = data.readInt();
- int uid = data.readInt();
- int mode = data.readInt();
- int userId = data.readInt();
- IBinder callerToken = data.readStrongBinder();
- int res = checkUriPermission(uri, pid, uid, mode, userId, callerToken);
- reply.writeNoException();
- reply.writeInt(res);
- return true;
- }
-
- case CLEAR_APP_DATA_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String packageName = data.readString();
- IPackageDataObserver observer = IPackageDataObserver.Stub.asInterface(
- data.readStrongBinder());
- int userId = data.readInt();
- boolean res = clearApplicationUserData(packageName, observer, userId);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case GRANT_URI_PERMISSION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- String targetPkg = data.readString();
- Uri uri = Uri.CREATOR.createFromParcel(data);
- int mode = data.readInt();
- int userId = data.readInt();
- grantUriPermission(app, targetPkg, uri, mode, userId);
- reply.writeNoException();
- return true;
- }
-
- case REVOKE_URI_PERMISSION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- Uri uri = Uri.CREATOR.createFromParcel(data);
- int mode = data.readInt();
- int userId = data.readInt();
- revokeUriPermission(app, uri, mode, userId);
- reply.writeNoException();
- return true;
- }
-
- case TAKE_PERSISTABLE_URI_PERMISSION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- Uri uri = Uri.CREATOR.createFromParcel(data);
- int mode = data.readInt();
- int userId = data.readInt();
- takePersistableUriPermission(uri, mode, userId);
- reply.writeNoException();
- return true;
- }
-
- case RELEASE_PERSISTABLE_URI_PERMISSION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- Uri uri = Uri.CREATOR.createFromParcel(data);
- int mode = data.readInt();
- int userId = data.readInt();
- releasePersistableUriPermission(uri, mode, userId);
- reply.writeNoException();
- return true;
- }
-
- case GET_PERSISTED_URI_PERMISSIONS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- final String packageName = data.readString();
- final boolean incoming = data.readInt() != 0;
- final ParceledListSlice<UriPermission> perms = getPersistedUriPermissions(
- packageName, incoming);
- reply.writeNoException();
- perms.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
- return true;
- }
-
- case SHOW_WAITING_FOR_DEBUGGER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- boolean waiting = data.readInt() != 0;
- showWaitingForDebugger(app, waiting);
- reply.writeNoException();
- return true;
- }
-
- case GET_MEMORY_INFO_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- ActivityManager.MemoryInfo mi = new ActivityManager.MemoryInfo();
- getMemoryInfo(mi);
- reply.writeNoException();
- mi.writeToParcel(reply, 0);
- return true;
- }
-
- case UNHANDLED_BACK_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- unhandledBack();
- reply.writeNoException();
- return true;
- }
-
- case OPEN_CONTENT_URI_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- Uri uri = Uri.parse(data.readString());
- ParcelFileDescriptor pfd = openContentUri(uri);
- reply.writeNoException();
- if (pfd != null) {
- reply.writeInt(1);
- pfd.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
- } else {
- reply.writeInt(0);
- }
- return true;
- }
-
- case SET_LOCK_SCREEN_SHOWN_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- setLockScreenShown(data.readInt() != 0);
- reply.writeNoException();
- return true;
- }
-
- case SET_DEBUG_APP_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String pn = data.readString();
- boolean wfd = data.readInt() != 0;
- boolean per = data.readInt() != 0;
- setDebugApp(pn, wfd, per);
- reply.writeNoException();
- return true;
- }
-
- case SET_ALWAYS_FINISH_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- boolean enabled = data.readInt() != 0;
- setAlwaysFinish(enabled);
- reply.writeNoException();
- return true;
- }
-
- case SET_ACTIVITY_CONTROLLER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IActivityController watcher = IActivityController.Stub.asInterface(
- data.readStrongBinder());
- setActivityController(watcher);
- reply.writeNoException();
- return true;
- }
-
- case ENTER_SAFE_MODE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- enterSafeMode();
- reply.writeNoException();
- return true;
- }
-
- case NOTE_WAKEUP_ALARM_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IIntentSender is = IIntentSender.Stub.asInterface(
- data.readStrongBinder());
- int sourceUid = data.readInt();
- String sourcePkg = data.readString();
- String tag = data.readString();
- noteWakeupAlarm(is, sourceUid, sourcePkg, tag);
- reply.writeNoException();
- return true;
- }
-
- case NOTE_ALARM_START_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IIntentSender is = IIntentSender.Stub.asInterface(
- data.readStrongBinder());
- int sourceUid = data.readInt();
- String tag = data.readString();
- noteAlarmStart(is, sourceUid, tag);
- reply.writeNoException();
- return true;
- }
-
- case NOTE_ALARM_FINISH_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IIntentSender is = IIntentSender.Stub.asInterface(
- data.readStrongBinder());
- int sourceUid = data.readInt();
- String tag = data.readString();
- noteAlarmFinish(is, sourceUid, tag);
- reply.writeNoException();
- return true;
- }
-
- case KILL_PIDS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int[] pids = data.createIntArray();
- String reason = data.readString();
- boolean secure = data.readInt() != 0;
- boolean res = killPids(pids, reason, secure);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case KILL_PROCESSES_BELOW_FOREGROUND_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String reason = data.readString();
- boolean res = killProcessesBelowForeground(reason);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case HANDLE_APPLICATION_CRASH_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder app = data.readStrongBinder();
- ApplicationErrorReport.CrashInfo ci = new ApplicationErrorReport.CrashInfo(data);
- handleApplicationCrash(app, ci);
- reply.writeNoException();
- return true;
- }
-
- case HANDLE_APPLICATION_WTF_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder app = data.readStrongBinder();
- String tag = data.readString();
- boolean system = data.readInt() != 0;
- ApplicationErrorReport.CrashInfo ci = new ApplicationErrorReport.CrashInfo(data);
- boolean res = handleApplicationWtf(app, tag, system, ci);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case HANDLE_APPLICATION_STRICT_MODE_VIOLATION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder app = data.readStrongBinder();
- int violationMask = data.readInt();
- StrictMode.ViolationInfo info = new StrictMode.ViolationInfo(data);
- handleApplicationStrictModeViolation(app, violationMask, info);
- reply.writeNoException();
- return true;
- }
-
- case SIGNAL_PERSISTENT_PROCESSES_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int sig = data.readInt();
- signalPersistentProcesses(sig);
- reply.writeNoException();
- return true;
- }
-
- case KILL_BACKGROUND_PROCESSES_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String packageName = data.readString();
- int userId = data.readInt();
- killBackgroundProcesses(packageName, userId);
- reply.writeNoException();
- return true;
- }
-
- case KILL_ALL_BACKGROUND_PROCESSES_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- killAllBackgroundProcesses();
- reply.writeNoException();
- return true;
- }
-
- case FORCE_STOP_PACKAGE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String packageName = data.readString();
- int userId = data.readInt();
- forceStopPackage(packageName, userId);
- reply.writeNoException();
- return true;
- }
-
- case GET_MY_MEMORY_STATE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- ActivityManager.RunningAppProcessInfo info =
- new ActivityManager.RunningAppProcessInfo();
- getMyMemoryState(info);
- reply.writeNoException();
- info.writeToParcel(reply, 0);
- return true;
- }
-
- case GET_DEVICE_CONFIGURATION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- ConfigurationInfo config = getDeviceConfigurationInfo();
- reply.writeNoException();
- config.writeToParcel(reply, 0);
- return true;
- }
-
- case PROFILE_CONTROL_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String process = data.readString();
- int userId = data.readInt();
- boolean start = data.readInt() != 0;
- int profileType = data.readInt();
- ProfilerInfo profilerInfo = data.readInt() != 0
- ? ProfilerInfo.CREATOR.createFromParcel(data) : null;
- boolean res = profileControl(process, userId, start, profilerInfo, profileType);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case SHUTDOWN_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- boolean res = shutdown(data.readInt());
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case STOP_APP_SWITCHES_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- stopAppSwitches();
- reply.writeNoException();
- return true;
- }
-
- case RESUME_APP_SWITCHES_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- resumeAppSwitches();
- reply.writeNoException();
- return true;
- }
-
- case PEEK_SERVICE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- Intent service = Intent.CREATOR.createFromParcel(data);
- String resolvedType = data.readString();
- String callingPackage = data.readString();
- IBinder binder = peekService(service, resolvedType, callingPackage);
- reply.writeNoException();
- reply.writeStrongBinder(binder);
- return true;
- }
-
- case START_BACKUP_AGENT_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- ApplicationInfo info = ApplicationInfo.CREATOR.createFromParcel(data);
- int backupRestoreMode = data.readInt();
- boolean success = bindBackupAgent(info, backupRestoreMode);
- reply.writeNoException();
- reply.writeInt(success ? 1 : 0);
- return true;
- }
-
- case BACKUP_AGENT_CREATED_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String packageName = data.readString();
- IBinder agent = data.readStrongBinder();
- backupAgentCreated(packageName, agent);
- reply.writeNoException();
- return true;
- }
-
- case UNBIND_BACKUP_AGENT_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- ApplicationInfo info = ApplicationInfo.CREATOR.createFromParcel(data);
- unbindBackupAgent(info);
- reply.writeNoException();
- return true;
- }
-
- case ADD_PACKAGE_DEPENDENCY_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String packageName = data.readString();
- addPackageDependency(packageName);
- reply.writeNoException();
- return true;
- }
-
- case KILL_APPLICATION_WITH_APPID_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String pkg = data.readString();
- int appid = data.readInt();
- String reason = data.readString();
- killApplicationWithAppId(pkg, appid, reason);
- reply.writeNoException();
- return true;
- }
-
- case CLOSE_SYSTEM_DIALOGS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String reason = data.readString();
- closeSystemDialogs(reason);
- reply.writeNoException();
- return true;
- }
-
- case GET_PROCESS_MEMORY_INFO_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int[] pids = data.createIntArray();
- Debug.MemoryInfo[] res = getProcessMemoryInfo(pids);
- reply.writeNoException();
- reply.writeTypedArray(res, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
- return true;
- }
-
- case KILL_APPLICATION_PROCESS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String processName = data.readString();
- int uid = data.readInt();
- killApplicationProcess(processName, uid);
- reply.writeNoException();
- return true;
- }
-
- case OVERRIDE_PENDING_TRANSITION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- String packageName = data.readString();
- int enterAnim = data.readInt();
- int exitAnim = data.readInt();
- overridePendingTransition(token, packageName, enterAnim, exitAnim);
- reply.writeNoException();
- return true;
- }
-
- case IS_USER_A_MONKEY_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- boolean areThey = isUserAMonkey();
- reply.writeNoException();
- reply.writeInt(areThey ? 1 : 0);
- return true;
- }
-
- case SET_USER_IS_MONKEY_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- final boolean monkey = (data.readInt() == 1);
- setUserIsMonkey(monkey);
- reply.writeNoException();
- return true;
- }
-
- case FINISH_HEAVY_WEIGHT_APP_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- finishHeavyWeightApp();
- reply.writeNoException();
- return true;
- }
-
- case IS_IMMERSIVE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- boolean isit = isImmersive(token);
- reply.writeNoException();
- reply.writeInt(isit ? 1 : 0);
- return true;
- }
-
- case IS_TOP_OF_TASK_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- final boolean isTopOfTask = isTopOfTask(token);
- reply.writeNoException();
- reply.writeInt(isTopOfTask ? 1 : 0);
- return true;
- }
-
- case CONVERT_FROM_TRANSLUCENT_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- boolean converted = convertFromTranslucent(token);
- reply.writeNoException();
- reply.writeInt(converted ? 1 : 0);
- return true;
- }
-
- case CONVERT_TO_TRANSLUCENT_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- final Bundle bundle;
- if (data.readInt() == 0) {
- bundle = null;
- } else {
- bundle = data.readBundle();
- }
- final ActivityOptions options = bundle == null ? null : new ActivityOptions(bundle);
- boolean converted = convertToTranslucent(token, options);
- reply.writeNoException();
- reply.writeInt(converted ? 1 : 0);
- return true;
- }
-
- case GET_ACTIVITY_OPTIONS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- final ActivityOptions options = getActivityOptions(token);
- reply.writeNoException();
- reply.writeBundle(options == null ? null : options.toBundle());
- return true;
- }
-
- case SET_IMMERSIVE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- boolean imm = data.readInt() == 1;
- setImmersive(token, imm);
- reply.writeNoException();
- return true;
- }
-
- case IS_TOP_ACTIVITY_IMMERSIVE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- boolean isit = isTopActivityImmersive();
- reply.writeNoException();
- reply.writeInt(isit ? 1 : 0);
- return true;
- }
-
- case CRASH_APPLICATION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int uid = data.readInt();
- int initialPid = data.readInt();
- String packageName = data.readString();
- String message = data.readString();
- crashApplication(uid, initialPid, packageName, message);
- reply.writeNoException();
- return true;
- }
-
- case GET_PROVIDER_MIME_TYPE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- Uri uri = Uri.CREATOR.createFromParcel(data);
- int userId = data.readInt();
- String type = getProviderMimeType(uri, userId);
- reply.writeNoException();
- reply.writeString(type);
- return true;
- }
-
- case NEW_URI_PERMISSION_OWNER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String name = data.readString();
- IBinder perm = newUriPermissionOwner(name);
- reply.writeNoException();
- reply.writeStrongBinder(perm);
- return true;
- }
-
- case GRANT_URI_PERMISSION_FROM_OWNER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder owner = data.readStrongBinder();
- int fromUid = data.readInt();
- String targetPkg = data.readString();
- Uri uri = Uri.CREATOR.createFromParcel(data);
- int mode = data.readInt();
- int sourceUserId = data.readInt();
- int targetUserId = data.readInt();
- grantUriPermissionFromOwner(owner, fromUid, targetPkg, uri, mode, sourceUserId,
- targetUserId);
- reply.writeNoException();
- return true;
- }
-
- case REVOKE_URI_PERMISSION_FROM_OWNER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder owner = data.readStrongBinder();
- Uri uri = null;
- if (data.readInt() != 0) {
- uri = Uri.CREATOR.createFromParcel(data);
- }
- int mode = data.readInt();
- int userId = data.readInt();
- revokeUriPermissionFromOwner(owner, uri, mode, userId);
- reply.writeNoException();
- return true;
- }
-
- case CHECK_GRANT_URI_PERMISSION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int callingUid = data.readInt();
- String targetPkg = data.readString();
- Uri uri = Uri.CREATOR.createFromParcel(data);
- int modeFlags = data.readInt();
- int userId = data.readInt();
- int res = checkGrantUriPermission(callingUid, targetPkg, uri, modeFlags, userId);
- reply.writeNoException();
- reply.writeInt(res);
- return true;
- }
-
- case DUMP_HEAP_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String process = data.readString();
- int userId = data.readInt();
- boolean managed = data.readInt() != 0;
- String path = data.readString();
- ParcelFileDescriptor fd = data.readInt() != 0
- ? ParcelFileDescriptor.CREATOR.createFromParcel(data) : null;
- boolean res = dumpHeap(process, userId, managed, path, fd);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case START_ACTIVITIES_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder b = data.readStrongBinder();
- IApplicationThread app = ApplicationThreadNative.asInterface(b);
- String callingPackage = data.readString();
- Intent[] intents = data.createTypedArray(Intent.CREATOR);
- String[] resolvedTypes = data.createStringArray();
- IBinder resultTo = data.readStrongBinder();
- Bundle options = data.readInt() != 0
- ? Bundle.CREATOR.createFromParcel(data) : null;
- int userId = data.readInt();
- int result = startActivities(app, callingPackage, intents, resolvedTypes, resultTo,
- options, userId);
- reply.writeNoException();
- reply.writeInt(result);
- return true;
- }
-
- case GET_FRONT_ACTIVITY_SCREEN_COMPAT_MODE_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- int mode = getFrontActivityScreenCompatMode();
- reply.writeNoException();
- reply.writeInt(mode);
- return true;
- }
-
- case SET_FRONT_ACTIVITY_SCREEN_COMPAT_MODE_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- int mode = data.readInt();
- setFrontActivityScreenCompatMode(mode);
- reply.writeNoException();
- reply.writeInt(mode);
- return true;
- }
-
- case GET_PACKAGE_SCREEN_COMPAT_MODE_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- String pkg = data.readString();
- int mode = getPackageScreenCompatMode(pkg);
- reply.writeNoException();
- reply.writeInt(mode);
- return true;
- }
-
- case SET_PACKAGE_SCREEN_COMPAT_MODE_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- String pkg = data.readString();
- int mode = data.readInt();
- setPackageScreenCompatMode(pkg, mode);
- reply.writeNoException();
- return true;
- }
-
- case SWITCH_USER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int userid = data.readInt();
- boolean result = switchUser(userid);
- reply.writeNoException();
- reply.writeInt(result ? 1 : 0);
- return true;
- }
-
- case START_USER_IN_BACKGROUND_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int userid = data.readInt();
- boolean result = startUserInBackground(userid);
- reply.writeNoException();
- reply.writeInt(result ? 1 : 0);
- return true;
- }
-
- case STOP_USER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int userid = data.readInt();
- IStopUserCallback callback = IStopUserCallback.Stub.asInterface(
- data.readStrongBinder());
- int result = stopUser(userid, callback);
- reply.writeNoException();
- reply.writeInt(result);
- return true;
- }
-
- case GET_CURRENT_USER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- UserInfo userInfo = getCurrentUser();
- reply.writeNoException();
- userInfo.writeToParcel(reply, 0);
- return true;
- }
-
- case IS_USER_RUNNING_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int userid = data.readInt();
- boolean orStopping = data.readInt() != 0;
- boolean result = isUserRunning(userid, orStopping);
- reply.writeNoException();
- reply.writeInt(result ? 1 : 0);
- return true;
- }
-
- case GET_RUNNING_USER_IDS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int[] result = getRunningUserIds();
- reply.writeNoException();
- reply.writeIntArray(result);
- return true;
- }
-
- case REMOVE_TASK_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- int taskId = data.readInt();
- boolean result = removeTask(taskId);
- reply.writeNoException();
- reply.writeInt(result ? 1 : 0);
- return true;
- }
-
- case REGISTER_PROCESS_OBSERVER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IProcessObserver observer = IProcessObserver.Stub.asInterface(
- data.readStrongBinder());
- registerProcessObserver(observer);
- return true;
- }
-
- case UNREGISTER_PROCESS_OBSERVER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IProcessObserver observer = IProcessObserver.Stub.asInterface(
- data.readStrongBinder());
- unregisterProcessObserver(observer);
- return true;
- }
-
- case REGISTER_UID_OBSERVER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IUidObserver observer = IUidObserver.Stub.asInterface(
- data.readStrongBinder());
- registerUidObserver(observer);
- return true;
- }
-
- case UNREGISTER_UID_OBSERVER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IUidObserver observer = IUidObserver.Stub.asInterface(
- data.readStrongBinder());
- unregisterUidObserver(observer);
- return true;
- }
-
- case GET_PACKAGE_ASK_SCREEN_COMPAT_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- String pkg = data.readString();
- boolean ask = getPackageAskScreenCompat(pkg);
- reply.writeNoException();
- reply.writeInt(ask ? 1 : 0);
- return true;
- }
-
- case SET_PACKAGE_ASK_SCREEN_COMPAT_TRANSACTION:
- {
- data.enforceInterface(IActivityManager.descriptor);
- String pkg = data.readString();
- boolean ask = data.readInt() != 0;
- setPackageAskScreenCompat(pkg, ask);
- reply.writeNoException();
- return true;
- }
-
- case IS_INTENT_SENDER_TARGETED_TO_PACKAGE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IIntentSender r = IIntentSender.Stub.asInterface(
- data.readStrongBinder());
- boolean res = isIntentSenderTargetedToPackage(r);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case IS_INTENT_SENDER_AN_ACTIVITY_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IIntentSender r = IIntentSender.Stub.asInterface(
- data.readStrongBinder());
- boolean res = isIntentSenderAnActivity(r);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case GET_INTENT_FOR_INTENT_SENDER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IIntentSender r = IIntentSender.Stub.asInterface(
- data.readStrongBinder());
- Intent intent = getIntentForIntentSender(r);
- reply.writeNoException();
- if (intent != null) {
- reply.writeInt(1);
- intent.writeToParcel(reply, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
- } else {
- reply.writeInt(0);
- }
- return true;
- }
-
- case GET_TAG_FOR_INTENT_SENDER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IIntentSender r = IIntentSender.Stub.asInterface(
- data.readStrongBinder());
- String prefix = data.readString();
- String tag = getTagForIntentSender(r, prefix);
- reply.writeNoException();
- reply.writeString(tag);
- return true;
- }
-
- case UPDATE_PERSISTENT_CONFIGURATION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- Configuration config = Configuration.CREATOR.createFromParcel(data);
- updatePersistentConfiguration(config);
- reply.writeNoException();
- return true;
- }
-
- case GET_PROCESS_PSS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int[] pids = data.createIntArray();
- long[] pss = getProcessPss(pids);
- reply.writeNoException();
- reply.writeLongArray(pss);
- return true;
- }
-
- case SHOW_BOOT_MESSAGE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- CharSequence msg = TextUtils.CHAR_SEQUENCE_CREATOR.createFromParcel(data);
- boolean always = data.readInt() != 0;
- showBootMessage(msg, always);
- reply.writeNoException();
- return true;
- }
-
- case KEYGUARD_WAITING_FOR_ACTIVITY_DRAWN_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- keyguardWaitingForActivityDrawn();
- reply.writeNoException();
- return true;
- }
-
- case KEYGUARD_GOING_AWAY_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- keyguardGoingAway(data.readInt() != 0, data.readInt() != 0);
- reply.writeNoException();
- return true;
- }
-
- case SHOULD_UP_RECREATE_TASK_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- String destAffinity = data.readString();
- boolean res = shouldUpRecreateTask(token, destAffinity);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case NAVIGATE_UP_TO_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- Intent target = Intent.CREATOR.createFromParcel(data);
- int resultCode = data.readInt();
- Intent resultData = null;
- if (data.readInt() != 0) {
- resultData = Intent.CREATOR.createFromParcel(data);
- }
- boolean res = navigateUpTo(token, target, resultCode, resultData);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case GET_LAUNCHED_FROM_UID_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- int res = getLaunchedFromUid(token);
- reply.writeNoException();
- reply.writeInt(res);
- return true;
- }
-
- case GET_LAUNCHED_FROM_PACKAGE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- String res = getLaunchedFromPackage(token);
- reply.writeNoException();
- reply.writeString(res);
- return true;
- }
-
- case REGISTER_USER_SWITCH_OBSERVER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IUserSwitchObserver observer = IUserSwitchObserver.Stub.asInterface(
- data.readStrongBinder());
- registerUserSwitchObserver(observer);
- reply.writeNoException();
- return true;
- }
-
- case UNREGISTER_USER_SWITCH_OBSERVER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IUserSwitchObserver observer = IUserSwitchObserver.Stub.asInterface(
- data.readStrongBinder());
- unregisterUserSwitchObserver(observer);
- reply.writeNoException();
- return true;
- }
-
- case REQUEST_BUG_REPORT_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- requestBugReport();
- reply.writeNoException();
- return true;
- }
-
- case INPUT_DISPATCHING_TIMED_OUT_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int pid = data.readInt();
- boolean aboveSystem = data.readInt() != 0;
- String reason = data.readString();
- long res = inputDispatchingTimedOut(pid, aboveSystem, reason);
- reply.writeNoException();
- reply.writeLong(res);
- return true;
- }
-
- case GET_ASSIST_CONTEXT_EXTRAS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int requestType = data.readInt();
- Bundle res = getAssistContextExtras(requestType);
- reply.writeNoException();
- reply.writeBundle(res);
- return true;
- }
-
- case REQUEST_ASSIST_CONTEXT_EXTRAS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int requestType = data.readInt();
- IResultReceiver receiver = IResultReceiver.Stub.asInterface(data.readStrongBinder());
- IBinder activityToken = data.readStrongBinder();
- boolean res = requestAssistContextExtras(requestType, receiver, activityToken);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case REPORT_ASSIST_CONTEXT_EXTRAS_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- Bundle extras = data.readBundle();
- AssistStructure structure = AssistStructure.CREATOR.createFromParcel(data);
- AssistContent content = AssistContent.CREATOR.createFromParcel(data);
- Uri referrer = data.readInt() != 0 ? Uri.CREATOR.createFromParcel(data) : null;
- reportAssistContextExtras(token, extras, structure, content, referrer);
- reply.writeNoException();
- return true;
- }
-
- case LAUNCH_ASSIST_INTENT_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- Intent intent = Intent.CREATOR.createFromParcel(data);
- int requestType = data.readInt();
- String hint = data.readString();
- int userHandle = data.readInt();
- Bundle args = data.readBundle();
- boolean res = launchAssistIntent(intent, requestType, hint, userHandle, args);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case IS_SCREEN_CAPTURE_ALLOWED_ON_CURRENT_ACTIVITY_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- boolean res = isAssistDataAllowedOnCurrentActivity();
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case SHOW_ASSIST_FROM_ACTIVITY_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- Bundle args = data.readBundle();
- boolean res = showAssistFromActivity(token, args);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case KILL_UID_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int appId = data.readInt();
- int userId = data.readInt();
- String reason = data.readString();
- killUid(appId, userId, reason);
- reply.writeNoException();
- return true;
- }
-
- case HANG_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder who = data.readStrongBinder();
- boolean allowRestart = data.readInt() != 0;
- hang(who, allowRestart);
- reply.writeNoException();
- return true;
- }
-
- case REPORT_ACTIVITY_FULLY_DRAWN_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- reportActivityFullyDrawn(token);
- reply.writeNoException();
- return true;
- }
-
- case NOTIFY_ACTIVITY_DRAWN_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- notifyActivityDrawn(token);
- reply.writeNoException();
- return true;
- }
-
- case RESTART_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- restart();
- reply.writeNoException();
- return true;
- }
-
- case PERFORM_IDLE_MAINTENANCE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- performIdleMaintenance();
- reply.writeNoException();
- return true;
- }
-
- case CREATE_VIRTUAL_ACTIVITY_CONTAINER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder parentActivityToken = data.readStrongBinder();
- IActivityContainerCallback callback =
- IActivityContainerCallback.Stub.asInterface(data.readStrongBinder());
- IActivityContainer activityContainer =
- createVirtualActivityContainer(parentActivityToken, callback);
- reply.writeNoException();
- if (activityContainer != null) {
- reply.writeInt(1);
- reply.writeStrongBinder(activityContainer.asBinder());
- } else {
- reply.writeInt(0);
- }
- return true;
- }
-
- case DELETE_ACTIVITY_CONTAINER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IActivityContainer activityContainer =
- IActivityContainer.Stub.asInterface(data.readStrongBinder());
- deleteActivityContainer(activityContainer);
- reply.writeNoException();
- return true;
- }
-
- case CREATE_STACK_ON_DISPLAY: {
- data.enforceInterface(IActivityManager.descriptor);
- int displayId = data.readInt();
- IActivityContainer activityContainer = createStackOnDisplay(displayId);
- reply.writeNoException();
- if (activityContainer != null) {
- reply.writeInt(1);
- reply.writeStrongBinder(activityContainer.asBinder());
- } else {
- reply.writeInt(0);
- }
- return true;
- }
-
- case GET_ACTIVITY_DISPLAY_ID_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder activityToken = data.readStrongBinder();
- int displayId = getActivityDisplayId(activityToken);
- reply.writeNoException();
- reply.writeInt(displayId);
- return true;
- }
-
- case START_LOCK_TASK_BY_TASK_ID_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- final int taskId = data.readInt();
- startLockTaskMode(taskId);
- reply.writeNoException();
- return true;
- }
-
- case START_LOCK_TASK_BY_TOKEN_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- startLockTaskMode(token);
- reply.writeNoException();
- return true;
- }
-
- case START_LOCK_TASK_BY_CURRENT_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- startLockTaskModeOnCurrent();
- reply.writeNoException();
- return true;
- }
-
- case STOP_LOCK_TASK_MODE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- stopLockTaskMode();
- reply.writeNoException();
- return true;
- }
-
- case STOP_LOCK_TASK_BY_CURRENT_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- stopLockTaskModeOnCurrent();
- reply.writeNoException();
- return true;
- }
-
- case IS_IN_LOCK_TASK_MODE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- final boolean isInLockTaskMode = isInLockTaskMode();
- reply.writeNoException();
- reply.writeInt(isInLockTaskMode ? 1 : 0);
- return true;
- }
-
- case GET_LOCK_TASK_MODE_STATE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- final int lockTaskModeState = getLockTaskModeState();
- reply.writeNoException();
- reply.writeInt(lockTaskModeState);
- return true;
- }
-
- case SHOW_LOCK_TASK_ESCAPE_MESSAGE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- final IBinder token = data.readStrongBinder();
- showLockTaskEscapeMessage(token);
- reply.writeNoException();
- return true;
- }
-
- case SET_TASK_DESCRIPTION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- ActivityManager.TaskDescription values =
- ActivityManager.TaskDescription.CREATOR.createFromParcel(data);
- setTaskDescription(token, values);
- reply.writeNoException();
- return true;
- }
-
- case SET_TASK_RESIZEABLE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int taskId = data.readInt();
- boolean resizeable = (data.readInt() == 1) ? true : false;
- setTaskResizeable(taskId, resizeable);
- reply.writeNoException();
- return true;
- }
-
- case RESIZE_TASK_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int taskId = data.readInt();
- Rect r = Rect.CREATOR.createFromParcel(data);
- resizeTask(taskId, r);
- reply.writeNoException();
- return true;
- }
-
- case GET_TASK_DESCRIPTION_ICON_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String filename = data.readString();
- Bitmap icon = getTaskDescriptionIcon(filename);
- reply.writeNoException();
- if (icon == null) {
- reply.writeInt(0);
- } else {
- reply.writeInt(1);
- icon.writeToParcel(reply, 0);
- }
- return true;
- }
-
- case START_IN_PLACE_ANIMATION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- final Bundle bundle;
- if (data.readInt() == 0) {
- bundle = null;
- } else {
- bundle = data.readBundle();
- }
- final ActivityOptions options = bundle == null ? null : new ActivityOptions(bundle);
- startInPlaceAnimationOnFrontMostApplication(options);
- reply.writeNoException();
- return true;
- }
-
- case REQUEST_VISIBLE_BEHIND_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- boolean enable = data.readInt() > 0;
- boolean success = requestVisibleBehind(token, enable);
- reply.writeNoException();
- reply.writeInt(success ? 1 : 0);
- return true;
- }
-
- case IS_BACKGROUND_VISIBLE_BEHIND_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- final boolean enabled = isBackgroundVisibleBehind(token);
- reply.writeNoException();
- reply.writeInt(enabled ? 1 : 0);
- return true;
- }
-
- case BACKGROUND_RESOURCES_RELEASED_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- backgroundResourcesReleased(token);
- reply.writeNoException();
- return true;
- }
-
- case NOTIFY_LAUNCH_TASK_BEHIND_COMPLETE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- notifyLaunchTaskBehindComplete(token);
- reply.writeNoException();
- return true;
- }
-
- case NOTIFY_ENTER_ANIMATION_COMPLETE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- notifyEnterAnimationComplete(token);
- reply.writeNoException();
- return true;
- }
-
- case BOOT_ANIMATION_COMPLETE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- bootAnimationComplete();
- reply.writeNoException();
- return true;
- }
-
- case NOTIFY_CLEARTEXT_NETWORK_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- final int uid = data.readInt();
- final byte[] firstPacket = data.createByteArray();
- notifyCleartextNetwork(uid, firstPacket);
- reply.writeNoException();
- return true;
- }
-
- case SET_DUMP_HEAP_DEBUG_LIMIT_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String procName = data.readString();
- int uid = data.readInt();
- long maxMemSize = data.readLong();
- String reportPackage = data.readString();
- setDumpHeapDebugLimit(procName, uid, maxMemSize, reportPackage);
- reply.writeNoException();
- return true;
- }
-
- case DUMP_HEAP_FINISHED_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String path = data.readString();
- dumpHeapFinished(path);
- reply.writeNoException();
- return true;
- }
-
- case SET_VOICE_KEEP_AWAKE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IVoiceInteractionSession session = IVoiceInteractionSession.Stub.asInterface(
- data.readStrongBinder());
- boolean keepAwake = data.readInt() != 0;
- setVoiceKeepAwake(session, keepAwake);
- reply.writeNoException();
- return true;
- }
-
- case UPDATE_LOCK_TASK_PACKAGES_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- int userId = data.readInt();
- String[] packages = data.readStringArray();
- updateLockTaskPackages(userId, packages);
- reply.writeNoException();
- return true;
- }
-
- case UPDATE_DEVICE_OWNER_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String packageName = data.readString();
- updateDeviceOwner(packageName);
- reply.writeNoException();
- return true;
- }
-
- case GET_PACKAGE_PROCESS_STATE_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String pkg = data.readString();
- String callingPackage = data.readString();
- int res = getPackageProcessState(pkg, callingPackage);
- reply.writeNoException();
- reply.writeInt(res);
- return true;
- }
-
- case SET_PROCESS_MEMORY_TRIM_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- String process = data.readString();
- int userId = data.readInt();
- int level = data.readInt();
- boolean res = setProcessMemoryTrimLevel(process, userId, level);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
-
- case IS_ROOT_VOICE_INTERACTION_TRANSACTION: {
- data.enforceInterface(IActivityManager.descriptor);
- IBinder token = data.readStrongBinder();
- boolean res = isRootVoiceInteraction(token);
- reply.writeNoException();
- reply.writeInt(res ? 1 : 0);
- return true;
- }
- }
-
- return super.onTransact(code, data, reply, flags);
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
- if (app != null) {
- attachApplication(app);
- }
② com.android.server.am.ActivityManagerService 类的 attachApplicationLocked 函数
com.android.server.am.ActivityManagerService 类的 attachApplicationLocked 函数代码:
注:只直接跳跃至下面这一段(注:我们只需要看mormalMode分支就行):
- // See if the top visible activity is waiting to run in this process...
- // 这里咱们可以抽象的理解为正常的没有问题的
- if (normalMode) {
- try {
- if (mStackSupervisor.attachApplicationLocked(app)) {
- didSomething = true;
- }
- } catch (Exception e) {
- Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
- badApp = true;
- }
- }
-
- // Find any services that should be running in this process...
- // 当然这里就是有问题的了
- if (!badApp) {
- try {
- didSomething |= mServices.attachApplicationLocked(app, processName);
- } catch (Exception e) {
- Slog.wtf(TAG, "Exception thrown starting services in " + app, e);
- badApp = true;
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
attachApplicationLocked 函数全代码:
- private final boolean attachApplicationLocked(IApplicationThread thread,
- int pid) {
-
- // Find the application record that is being attached... either via
- // the pid if we are running in multiple processes, or just pull the
- // next app record if we are emulating process with anonymous threads.
- ProcessRecord app;
- if (pid != MY_PID && pid >= 0) {
- synchronized (mPidsSelfLocked) {
- app = mPidsSelfLocked.get(pid);
- }
- } else {
- app = null;
- }
-
- if (app == null) {
- Slog.w(TAG, "No pending application record for pid " + pid
- + " (IApplicationThread " + thread + "); dropping process");
- EventLog.writeEvent(EventLogTags.AM_DROP_PROCESS, pid);
- if (pid > 0 && pid != MY_PID) {
- Process.killProcessQuiet(pid);
- //TODO: killProcessGroup(app.info.uid, pid);
- } else {
- try {
- thread.scheduleExit();
- } catch (Exception e) {
- // Ignore exceptions.
- }
- }
- return false;
- }
-
- // If this application record is still attached to a previous
- // process, clean it up now.
- if (app.thread != null) {
- handleAppDiedLocked(app, true, true);
- }
-
- // Tell the process all about itself.
-
- if (DEBUG_ALL) Slog.v(
- TAG, "Binding process pid " + pid + " to record " + app);
-
- final String processName = app.processName;
- try {
- AppDeathRecipient adr = new AppDeathRecipient(
- app, pid, thread);
- thread.asBinder().linkToDeath(adr, 0);
- app.deathRecipient = adr;
- } catch (RemoteException e) {
- app.resetPackageList(mProcessStats);
- startProcessLocked(app, "link fail", processName);
- return false;
- }
-
- EventLog.writeEvent(EventLogTags.AM_PROC_BOUND, app.userId, app.pid, app.processName);
-
- app.makeActive(thread, mProcessStats);
- app.curAdj = app.setAdj = -100;
- app.curSchedGroup = app.setSchedGroup = Process.THREAD_GROUP_DEFAULT;
- app.forcingToForeground = null;
- updateProcessForegroundLocked(app, false, false);
- app.hasShownUi = false;
- app.debugging = false;
- app.cached = false;
- app.killedByAm = false;
-
- mHandler.removeMessages(PROC_START_TIMEOUT_MSG, app);
-
- boolean normalMode = mProcessesReady || isAllowedWhileBooting(app.info);
- List<ProviderInfo> providers = normalMode ? generateApplicationProvidersLocked(app) : null;
-
- if (!normalMode) {
- Slog.i(TAG, "Launching preboot mode app: " + app);
- }
-
- if (DEBUG_ALL) Slog.v(
- TAG, "New app record " + app
- + " thread=" + thread.asBinder() + " pid=" + pid);
- try {
- int testMode = IApplicationThread.DEBUG_OFF;
- if (mDebugApp != null && mDebugApp.equals(processName)) {
- testMode = mWaitForDebugger
- ? IApplicationThread.DEBUG_WAIT
- : IApplicationThread.DEBUG_ON;
- app.debugging = true;
- if (mDebugTransient) {
- mDebugApp = mOrigDebugApp;
- mWaitForDebugger = mOrigWaitForDebugger;
- }
- }
- String profileFile = app.instrumentationProfileFile;
- ParcelFileDescriptor profileFd = null;
- int samplingInterval = 0;
- boolean profileAutoStop = false;
- if (mProfileApp != null && mProfileApp.equals(processName)) {
- mProfileProc = app;
- profileFile = mProfileFile;
- profileFd = mProfileFd;
- samplingInterval = mSamplingInterval;
- profileAutoStop = mAutoStopProfiler;
- }
- boolean enableOpenGlTrace = false;
- if (mOpenGlTraceApp != null && mOpenGlTraceApp.equals(processName)) {
- enableOpenGlTrace = true;
- mOpenGlTraceApp = null;
- }
-
- // If the app is being launched for restore or full backup, set it up specially
- boolean isRestrictedBackupMode = false;
- if (mBackupTarget != null && mBackupAppName.equals(processName)) {
- isRestrictedBackupMode = (mBackupTarget.backupMode == BackupRecord.RESTORE)
- || (mBackupTarget.backupMode == BackupRecord.RESTORE_FULL)
- || (mBackupTarget.backupMode == BackupRecord.BACKUP_FULL);
- }
-
- ensurePackageDexOpt(app.instrumentationInfo != null
- ? app.instrumentationInfo.packageName
- : app.info.packageName);
- if (app.instrumentationClass != null) {
- ensurePackageDexOpt(app.instrumentationClass.getPackageName());
- }
- if (DEBUG_CONFIGURATION) Slog.v(TAG_CONFIGURATION, "Binding proc "
- + processName + " with config " + mConfiguration);
- ApplicationInfo appInfo = app.instrumentationInfo != null
- ? app.instrumentationInfo : app.info;
- app.compat = compatibilityInfoForPackageLocked(appInfo);
- if (profileFd != null) {
- profileFd = profileFd.dup();
- }
- ProfilerInfo profilerInfo = profileFile == null ? null
- : new ProfilerInfo(profileFile, profileFd, samplingInterval, profileAutoStop);
- thread.bindApplication(processName, appInfo, providers, app.instrumentationClass,
- profilerInfo, app.instrumentationArguments, app.instrumentationWatcher,
- app.instrumentationUiAutomationConnection, testMode, enableOpenGlTrace,
- isRestrictedBackupMode || !normalMode, app.persistent,
- new Configuration(mConfiguration), app.compat,
- getCommonServicesLocked(app.isolated),
- mCoreSettingsObserver.getCoreSettingsLocked());
- updateLruProcessLocked(app, false, null);
- app.lastRequestedGc = app.lastLowMemory = SystemClock.uptimeMillis();
- } catch (Exception e) {
- // todo: Yikes! What should we do? For now we will try to
- // start another process, but that could easily get us in
- // an infinite loop of restarting processes...
- Slog.wtf(TAG, "Exception thrown during bind of " + app, e);
-
- app.resetPackageList(mProcessStats);
- app.unlinkDeathRecipient();
- startProcessLocked(app, "bind fail", processName);
- return false;
- }
-
- // Remove this record from the list of starting applications.
- mPersistentStartingProcesses.remove(app);
- if (DEBUG_PROCESSES && mProcessesOnHold.contains(app)) Slog.v(TAG_PROCESSES,
- "Attach application locked removing on hold: " + app);
- mProcessesOnHold.remove(app);
-
- boolean badApp = false;
- boolean didSomething = false;
-
- // See if the top visible activity is waiting to run in this process...
- if (normalMode) {
- try {
- if (mStackSupervisor.attachApplicationLocked(app)) {
- didSomething = true;
- }
- } catch (Exception e) {
- Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);
- badApp = true;
- }
- }
-
- // Find any services that should be running in this process...
- if (!badApp) {
- try {
- didSomething |= mServices.attachApplicationLocked(app, processName);
- } catch (Exception e) {
- Slog.wtf(TAG, "Exception thrown starting services in " + app, e);
- badApp = true;
- }
- }
-
- // Check if a next-broadcast receiver is in this process...
- if (!badApp && isPendingBroadcastProcessLocked(pid)) {
- try {
- didSomething |= sendPendingBroadcastsLocked(app);
- } catch (Exception e) {
- // If the app died trying to launch the receiver we declare it 'bad'
- Slog.wtf(TAG, "Exception thrown dispatching broadcasts in " + app, e);
- badApp = true;
- }
- }
-
- // Check whether the next backup agent is in this process...
- if (!badApp && mBackupTarget != null && mBackupTarget.appInfo.uid == app.uid) {
- if (DEBUG_BACKUP) Slog.v(TAG_BACKUP,
- "New app is backup target, launching agent for " + app);
- ensurePackageDexOpt(mBackupTarget.appInfo.packageName);
- try {
- thread.scheduleCreateBackupAgent(mBackupTarget.appInfo,
- compatibilityInfoForPackageLocked(mBackupTarget.appInfo),
- mBackupTarget.backupMode);
- } catch (Exception e) {
- Slog.wtf(TAG, "Exception thrown creating backup agent in " + app, e);
- badApp = true;
- }
- }
-
- if (badApp) {
- app.kill("error during init", true);
- handleAppDiedLocked(app, false, true);
- return false;
- }
-
- if (!didSomething) {
- updateOomAdjLocked();
- }
-
- return true;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
com.android.server.am.ActivityStackSupervisor 类的 attachApplicationLocked 函数代码:
- boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {
- final String processName = app.processName;
- boolean didSomething = false;
- for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {
- ArrayList<ActivityStack> stacks = mActivityDisplays.valueAt(displayNdx).mStacks;
- for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {
- final ActivityStack stack = stacks.get(stackNdx);
- if (!isFrontStack(stack)) {
- continue;
- }
- ActivityRecord hr = stack.topRunningActivityLocked(null);
- if (hr != null) {
- if (hr.app == null && app.uid == hr.info.applicationInfo.uid
- && processName.equals(hr.processName)) {
- try {
- if (realStartActivityLocked(hr, app, true, true)) {
- didSomething = true;
- }
- } catch (RemoteException e) {
- Slog.w(TAG, "Exception in new application when starting activity "
- + hr.intent.getComponent().flattenToShortString(), e);
- throw e;
- }
- }
- }
- }
- }
- if (!didSomething) {
- ensureActivitiesVisibleLocked(null, 0);
- }
- return didSomething;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
realStartActivityLocked 函数代码:
- // 可直接跳至这段代码处,app.thread.scheduleLaunchActivity 是重点,准备启动activity
- app.forceProcessStateUpTo(mService.mTopProcessState);
- app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
- System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
- new Configuration(stack.mOverrideConfig), r.compat, r.launchedFromPackage,
- task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,
- newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);
realStartActivityLocked 函数全部代码:
- final boolean realStartActivityLocked(ActivityRecord r,
- ProcessRecord app, boolean andResume, boolean checkConfig)
- throws RemoteException {
-
- if (andResume) {
- r.startFreezingScreenLocked(app, 0);
- mWindowManager.setAppVisibility(r.appToken, true);
-
- // schedule launch ticks to collect information about slow apps.
- r.startLaunchTickingLocked();
- }
-
- // Have the window manager re-evaluate the orientation of
- // the screen based on the new activity order. Note that
- // as a result of this, it can call back into the activity
- // manager with a new orientation. We don't care about that,
- // because the activity is not currently running so we are
- // just restarting it anyway.
- if (checkConfig) {
- Configuration config = mWindowManager.updateOrientationFromAppTokens(
- mService.mConfiguration,
- r.mayFreezeScreenLocked(app) ? r.appToken : null);
- mService.updateConfigurationLocked(config, r, false, false);
- }
-
- r.app = app;
- app.waitingToKill = null;
- r.launchCount++;
- r.lastLaunchTime = SystemClock.uptimeMillis();
-
- if (DEBUG_ALL) Slog.v(TAG, "Launching: " + r);
-
- int idx = app.activities.indexOf(r);
- if (idx < 0) {
- app.activities.add(r);
- }
- mService.updateLruProcessLocked(app, true, null);
- mService.updateOomAdjLocked();
-
- final TaskRecord task = r.task;
- if (task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE ||
- task.mLockTaskAuth == LOCK_TASK_AUTH_LAUNCHABLE_PRIV) {
- setLockTaskModeLocked(task, LOCK_TASK_MODE_LOCKED, "mLockTaskAuth==LAUNCHABLE", false);
- }
-
- final ActivityStack stack = task.stack;
- try {
- if (app.thread == null) {
- throw new RemoteException();
- }
- List<ResultInfo> results = null;
- List<ReferrerIntent> newIntents = null;
- if (andResume) {
- results = r.results;
- newIntents = r.newIntents;
- }
- if (DEBUG_SWITCH) Slog.v(TAG_SWITCH,
- "Launching: " + r + " icicle=" + r.icicle + " with results=" + results
- + " newIntents=" + newIntents + " andResume=" + andResume);
- if (andResume) {
- EventLog.writeEvent(EventLogTags.AM_RESTART_ACTIVITY,
- r.userId, System.identityHashCode(r),
- task.taskId, r.shortComponentName);
- }
- if (r.isHomeActivity() && r.isNotResolverActivity()) {
- // Home process is the root process of the task.
- mService.mHomeProcess = task.mActivities.get(0).app;
- }
- mService.ensurePackageDexOpt(r.intent.getComponent().getPackageName());
- r.sleeping = false;
- r.forceNewConfig = false;
- mService.showAskCompatModeDialogLocked(r);
- r.compat = mService.compatibilityInfoForPackageLocked(r.info.applicationInfo);
- ProfilerInfo profilerInfo = null;
- if (mService.mProfileApp != null && mService.mProfileApp.equals(app.processName)) {
- if (mService.mProfileProc == null || mService.mProfileProc == app) {
- mService.mProfileProc = app;
- final String profileFile = mService.mProfileFile;
- if (profileFile != null) {
- ParcelFileDescriptor profileFd = mService.mProfileFd;
- if (profileFd != null) {
- try {
- profileFd = profileFd.dup();
- } catch (IOException e) {
- if (profileFd != null) {
- try {
- profileFd.close();
- } catch (IOException o) {
- }
- profileFd = null;
- }
- }
- }
-
- profilerInfo = new ProfilerInfo(profileFile, profileFd,
- mService.mSamplingInterval, mService.mAutoStopProfiler);
- }
- }
- }
-
- if (andResume) {
- app.hasShownUi = true;
- app.pendingUiClean = true;
- }
- app.forceProcessStateUpTo(mService.mTopProcessState);
- app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
- System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),
- new Configuration(stack.mOverrideConfig), r.compat, r.launchedFromPackage,
- task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,
- newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);
-
- if ((app.info.privateFlags&ApplicationInfo.PRIVATE_FLAG_CANT_SAVE_STATE) != 0) {
- // This may be a heavy-weight process! Note that the package
- // manager will ensure that only activity can run in the main
- // process of the .apk, which is the only thing that will be
- // considered heavy-weight.
- if (app.processName.equals(app.info.packageName)) {
- if (mService.mHeavyWeightProcess != null
- && mService.mHeavyWeightProcess != app) {
- Slog.w(TAG, "Starting new heavy weight process " + app
- + " when already running "
- + mService.mHeavyWeightProcess);
- }
- mService.mHeavyWeightProcess = app;
- Message msg = mService.mHandler.obtainMessage(
- ActivityManagerService.POST_HEAVY_NOTIFICATION_MSG);
- msg.obj = r;
- mService.mHandler.sendMessage(msg);
- }
- }
-
- } catch (RemoteException e) {
- if (r.launchFailed) {
- // This is the second time we failed -- finish activity
- // and give up.
- Slog.e(TAG, "Second failure launching "
- + r.intent.getComponent().flattenToShortString()
- + ", giving up", e);
- mService.appDiedLocked(app);
- stack.requestFinishActivityLocked(r.appToken, Activity.RESULT_CANCELED, null,
- "2nd-crash", false);
- return false;
- }
-
- // This is the first time we failed -- restart process and
- // retry.
- app.activities.remove(r);
- throw e;
- }
-
- r.launchFailed = false;
- if (stack.updateLRUListLocked(r)) {
- Slog.w(TAG, "Activity " + r
- + " being launched, but already in LRU list");
- }
-
- if (andResume) {
- // As part of the process of launching, ActivityThread also performs
- // a resume.
- stack.minimalResumeActivityLocked(r);
- } else {
- // This activity is not starting in the resumed state... which
- // should look like we asked it to pause+stop (but remain visible),
- // and it has done so and reported back the current icicle and
- // other state.
- if (DEBUG_STATES) Slog.v(TAG_STATES,
- "Moving to STOPPED: " + r + " (starting in stopped state)");
- r.state = STOPPED;
- r.stopped = true;
- }
-
- // Launch the new version setup screen if needed. We do this -after-
- // launching the initial activity (that is, home), so that it can have
- // a chance to initialize itself while in the background, making the
- // switch back to it faster and look better.
- if (isFrontStack(stack)) {
- mService.startSetupActivityLocked();
- }
-
- // Update any services we are bound to that might care about whether
- // their client may have activities.
- mService.mServices.updateServiceConnectionActivitiesLocked(r.app);
-
- return true;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
④ ProcessRecord类代码:
- /*
- * Copyright (C) 2006 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.am;
-
- import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
- import static com.android.server.am.ActivityManagerDebugConfig.TAG_AM;
- import static com.android.server.am.ActivityManagerDebugConfig.TAG_WITH_CLASS_NAME;
-
- import android.util.ArraySet;
- import android.util.DebugUtils;
- import android.util.EventLog;
- import android.util.Slog;
- import com.android.internal.app.ProcessStats;
- import com.android.internal.os.BatteryStatsImpl;
-
- import android.app.ActivityManager;
- import android.app.Dialog;
- import android.app.IApplicationThread;
- import android.app.IInstrumentationWatcher;
- import android.app.IUiAutomationConnection;
- import android.content.ComponentName;
- import android.content.Context;
- import android.content.pm.ApplicationInfo;
- import android.content.res.CompatibilityInfo;
- import android.os.Bundle;
- import android.os.IBinder;
- import android.os.Process;
- import android.os.SystemClock;
- import android.os.Trace;
- import android.os.UserHandle;
- import android.util.ArrayMap;
- import android.util.PrintWriterPrinter;
- import android.util.TimeUtils;
-
- import java.io.PrintWriter;
- import java.util.ArrayList;
-
- /**
- * Full information about a particular process that
- * is currently running.
- */
- final class ProcessRecord {
- private static final String TAG = TAG_WITH_CLASS_NAME ? "ProcessRecord" : TAG_AM;
-
- private final BatteryStatsImpl mBatteryStats; // where to collect runtime statistics
- final ApplicationInfo info; // all about the first app in the process
- final boolean isolated; // true if this is a special isolated process
- final int uid; // uid of process; may be different from 'info' if isolated
- final int userId; // user of process.
- final String processName; // name of the process
- // List of packages running in the process
- final ArrayMap<String, ProcessStats.ProcessStateHolder> pkgList = new ArrayMap<>();
- UidRecord uidRecord; // overall state of process's uid.
- ArraySet<String> pkgDeps; // additional packages we have a dependency on
- // ProcessRecord 中的thread对象在此处定义
- IApplicationThread thread; // the actual proc... may be null only if
- // 'persistent' is true (in which case we
- // are in the process of launching the app)
- ProcessStats.ProcessState baseProcessTracker;
- BatteryStatsImpl.Uid.Proc curProcBatteryStats;
- int pid; // The process of this application; 0 if none
- int[] gids; // The gids this process was launched with
- String requiredAbi; // The ABI this process was launched with
- String instructionSet; // The instruction set this process was launched with
- boolean starting; // True if the process is being started
- long lastActivityTime; // For managing the LRU list
- long lastPssTime; // Last time we retrieved PSS data
- long nextPssTime; // Next time we want to request PSS data
- long lastStateTime; // Last time setProcState changed
- long initialIdlePss; // Initial memory pss of process for idle maintenance.
- long lastPss; // Last computed memory pss.
- long lastCachedPss; // Last computed pss when in cached state.
- int maxAdj; // Maximum OOM adjustment for this process
- int curRawAdj; // Current OOM unlimited adjustment for this process
- int setRawAdj; // Last set OOM unlimited adjustment for this process
- int curAdj; // Current OOM adjustment for this process
- int setAdj; // Last set OOM adjustment for this process
- int curSchedGroup; // Currently desired scheduling class
- int setSchedGroup; // Last set to background scheduling class
- int trimMemoryLevel; // Last selected memory trimming level
- int curProcState = PROCESS_STATE_NONEXISTENT; // Currently computed process state
- int repProcState = PROCESS_STATE_NONEXISTENT; // Last reported process state
- int setProcState = PROCESS_STATE_NONEXISTENT; // Last set process state in process tracker
- int pssProcState = PROCESS_STATE_NONEXISTENT; // Currently requesting pss for
- boolean serviceb; // Process currently is on the service B list
- boolean serviceHighRam; // We are forcing to service B list due to its RAM use
- boolean setIsForeground; // Running foreground UI when last set?
- boolean notCachedSinceIdle; // Has this process not been in a cached state since last idle?
- boolean hasClientActivities; // Are there any client services with activities?
- boolean hasStartedServices; // Are there any started services running in this process?
- boolean foregroundServices; // Running any services that are foreground?
- boolean foregroundActivities; // Running any activities that are foreground?
- boolean repForegroundActivities; // Last reported foreground activities.
- boolean systemNoUi; // This is a system process, but not currently showing UI.
- boolean hasShownUi; // Has UI been shown in this process since it was started?
- boolean pendingUiClean; // Want to clean up resources from showing UI?
- boolean hasAboveClient; // Bound using BIND_ABOVE_CLIENT, so want to be lower
- boolean treatLikeActivity; // Bound using BIND_TREAT_LIKE_ACTIVITY
- boolean bad; // True if disabled in the bad process list
- boolean killedByAm; // True when proc has been killed by activity manager, not for RAM
- boolean killed; // True once we know the process has been killed
- boolean procStateChanged; // Keep track of whether we changed 'setAdj'.
- boolean reportedInteraction;// Whether we have told usage stats about it being an interaction
- long fgInteractionTime; // When we became foreground for interaction purposes
- String waitingToKill; // Process is waiting to be killed when in the bg, and reason
- IBinder forcingToForeground;// Token that is forcing this process to be foreground
- int adjSeq; // Sequence id for identifying oom_adj assignment cycles
- int lruSeq; // Sequence id for identifying LRU update cycles
- CompatibilityInfo compat; // last used compatibility mode
- IBinder.DeathRecipient deathRecipient; // Who is watching for the death.
- ComponentName instrumentationClass;// class installed to instrument app
- ApplicationInfo instrumentationInfo; // the application being instrumented
- String instrumentationProfileFile; // where to save profiling
- IInstrumentationWatcher instrumentationWatcher; // who is waiting
- IUiAutomationConnection instrumentationUiAutomationConnection; // Connection to use the UI introspection APIs.
- Bundle instrumentationArguments;// as given to us
- ComponentName instrumentationResultClass;// copy of instrumentationClass
- boolean usingWrapper; // Set to true when process was launched with a wrapper attached
- BroadcastRecord curReceiver;// receiver currently running in the app
- long lastWakeTime; // How long proc held wake lock at last check
- long lastCpuTime; // How long proc has run CPU at last check
- long curCpuTime; // How long proc has run CPU most recently
- long lastRequestedGc; // When we last asked the app to do a gc
- long lastLowMemory; // When we last told the app that memory is low
- boolean reportLowMemory; // Set to true when waiting to report low mem
- boolean empty; // Is this an empty background process?
- boolean cached; // Is this a cached process?
- String adjType; // Debugging: primary thing impacting oom_adj.
- int adjTypeCode; // Debugging: adj code to report to app.
- Object adjSource; // Debugging: option dependent object.
- int adjSourceProcState; // Debugging: proc state of adjSource's process.
- Object adjTarget; // Debugging: target component impacting oom_adj.
- Runnable crashHandler; // Optional local handler to be invoked in the process crash.
-
- // all activities running in the process
- final ArrayList<ActivityRecord> activities = new ArrayList<>();
- // all ServiceRecord running in this process
- final ArraySet<ServiceRecord> services = new ArraySet<>();
- // services that are currently executing code (need to remain foreground).
- final ArraySet<ServiceRecord> executingServices = new ArraySet<>();
- // All ConnectionRecord this process holds
- final ArraySet<ConnectionRecord> connections = new ArraySet<>();
- // all IIntentReceivers that are registered from this process.
- final ArraySet<ReceiverList> receivers = new ArraySet<>();
- // class (String) -> ContentProviderRecord
- final ArrayMap<String, ContentProviderRecord> pubProviders = new ArrayMap<>();
- // All ContentProviderRecord process is using
- final ArrayList<ContentProviderConnection> conProviders = new ArrayList<>();
-
- boolean execServicesFg; // do we need to be executing services in the foreground?
- boolean persistent; // always keep this application running?
- boolean crashing; // are we in the process of crashing?
- Dialog crashDialog; // dialog being displayed due to crash.
- boolean forceCrashReport; // suppress normal auto-dismiss of crash dialog & report UI?
- boolean notResponding; // does the app have a not responding dialog?
- Dialog anrDialog; // dialog being displayed due to app not resp.
- boolean removed; // has app package been removed from device?
- boolean debugging; // was app launched for debugging?
- boolean waitedForDebugger; // has process show wait for debugger dialog?
- Dialog waitDialog; // current wait for debugger dialog
-
- String shortStringName; // caching of toShortString() result.
- String stringName; // caching of toString() result.
-
- // These reports are generated & stored when an app gets into an error condition.
- // They will be "null" when all is OK.
- ActivityManager.ProcessErrorStateInfo crashingReport;
- ActivityManager.ProcessErrorStateInfo notRespondingReport;
-
- // Who will be notified of the error. This is usually an activity in the
- // app that installed the package.
- ComponentName errorReportReceiver;
-
- void dump(PrintWriter pw, String prefix) {
- final long now = SystemClock.uptimeMillis();
-
- pw.print(prefix); pw.print("user #"); pw.print(userId);
- pw.print(" uid="); pw.print(info.uid);
- if (uid != info.uid) {
- pw.print(" ISOLATED uid="); pw.print(uid);
- }
- pw.print(" gids={");
- if (gids != null) {
- for (int gi=0; gi<gids.length; gi++) {
- if (gi != 0) pw.print(", ");
- pw.print(gids[gi]);
-
- }
- }
- pw.println("}");
- pw.print(prefix); pw.print("requiredAbi="); pw.print(requiredAbi);
- pw.print(" instructionSet="); pw.println(instructionSet);
- if (info.className != null) {
- pw.print(prefix); pw.print("class="); pw.println(info.className);
- }
- if (info.manageSpaceActivityName != null) {
- pw.print(prefix); pw.print("manageSpaceActivityName=");
- pw.println(info.manageSpaceActivityName);
- }
- pw.print(prefix); pw.print("dir="); pw.print(info.sourceDir);
- pw.print(" publicDir="); pw.print(info.publicSourceDir);
- pw.print(" data="); pw.println(info.dataDir);
- pw.print(prefix); pw.print("packageList={");
- for (int i=0; i<pkgList.size(); i++) {
- if (i > 0) pw.print(", ");
- pw.print(pkgList.keyAt(i));
- }
- pw.println("}");
- if (pkgDeps != null) {
- pw.print(prefix); pw.print("packageDependencies={");
- for (int i=0; i<pkgDeps.size(); i++) {
- if (i > 0) pw.print(", ");
- pw.print(pkgDeps.valueAt(i));
- }
- pw.println("}");
- }
- pw.print(prefix); pw.print("compat="); pw.println(compat);
- if (instrumentationClass != null || instrumentationProfileFile != null
- || instrumentationArguments != null) {
- pw.print(prefix); pw.print("instrumentationClass=");
- pw.print(instrumentationClass);
- pw.print(" instrumentationProfileFile=");
- pw.println(instrumentationProfileFile);
- pw.print(prefix); pw.print("instrumentationArguments=");
- pw.println(instrumentationArguments);
- pw.print(prefix); pw.print("instrumentationInfo=");
- pw.println(instrumentationInfo);
- if (instrumentationInfo != null) {
- instrumentationInfo.dump(new PrintWriterPrinter(pw), prefix + " ");
- }
- }
- pw.print(prefix); pw.print("thread="); pw.println(thread);
- pw.print(prefix); pw.print("pid="); pw.print(pid); pw.print(" starting=");
- pw.println(starting);
- pw.print(prefix); pw.print("lastActivityTime=");
- TimeUtils.formatDuration(lastActivityTime, now, pw);
- pw.print(" lastPssTime=");
- TimeUtils.formatDuration(lastPssTime, now, pw);
- pw.print(" nextPssTime=");
- TimeUtils.formatDuration(nextPssTime, now, pw);
- pw.println();
- pw.print(prefix); pw.print("adjSeq="); pw.print(adjSeq);
- pw.print(" lruSeq="); pw.print(lruSeq);
- pw.print(" lastPss="); DebugUtils.printSizeValue(pw, lastPss*1024);
- pw.print(" lastCachedPss="); DebugUtils.printSizeValue(pw, lastCachedPss*1024);
- pw.println();
- pw.print(prefix); pw.print("cached="); pw.print(cached);
- pw.print(" empty="); pw.println(empty);
- if (serviceb) {
- pw.print(prefix); pw.print("serviceb="); pw.print(serviceb);
- pw.print(" serviceHighRam="); pw.println(serviceHighRam);
- }
- if (notCachedSinceIdle) {
- pw.print(prefix); pw.print("notCachedSinceIdle="); pw.print(notCachedSinceIdle);
- pw.print(" initialIdlePss="); pw.println(initialIdlePss);
- }
- pw.print(prefix); pw.print("oom: max="); pw.print(maxAdj);
- pw.print(" curRaw="); pw.print(curRawAdj);
- pw.print(" setRaw="); pw.print(setRawAdj);
- pw.print(" cur="); pw.print(curAdj);
- pw.print(" set="); pw.println(setAdj);
- pw.print(prefix); pw.print("curSchedGroup="); pw.print(curSchedGroup);
- pw.print(" setSchedGroup="); pw.print(setSchedGroup);
- pw.print(" systemNoUi="); pw.print(systemNoUi);
- pw.print(" trimMemoryLevel="); pw.println(trimMemoryLevel);
- pw.print(prefix); pw.print("curProcState="); pw.print(curProcState);
- pw.print(" repProcState="); pw.print(repProcState);
- pw.print(" pssProcState="); pw.print(pssProcState);
- pw.print(" setProcState="); pw.print(setProcState);
- pw.print(" lastStateTime=");
- TimeUtils.formatDuration(lastStateTime, now, pw);
- pw.println();
- if (hasShownUi || pendingUiClean || hasAboveClient || treatLikeActivity) {
- pw.print(prefix); pw.print("hasShownUi="); pw.print(hasShownUi);
- pw.print(" pendingUiClean="); pw.print(pendingUiClean);
- pw.print(" hasAboveClient="); pw.print(hasAboveClient);
- pw.print(" treatLikeActivity="); pw.println(treatLikeActivity);
- }
- if (setIsForeground || foregroundServices || forcingToForeground != null) {
- pw.print(prefix); pw.print("setIsForeground="); pw.print(setIsForeground);
- pw.print(" foregroundServices="); pw.print(foregroundServices);
- pw.print(" forcingToForeground="); pw.println(forcingToForeground);
- }
- if (reportedInteraction || fgInteractionTime != 0) {
- pw.print(prefix); pw.print("reportedInteraction=");
- pw.print(reportedInteraction);
- if (fgInteractionTime != 0) {
- pw.print(" fgInteractionTime=");
- TimeUtils.formatDuration(fgInteractionTime, SystemClock.elapsedRealtime(), pw);
- }
- pw.println();
- }
- if (persistent || removed) {
- pw.print(prefix); pw.print("persistent="); pw.print(persistent);
- pw.print(" removed="); pw.println(removed);
- }
- if (hasClientActivities || foregroundActivities || repForegroundActivities) {
- pw.print(prefix); pw.print("hasClientActivities="); pw.print(hasClientActivities);
- pw.print(" foregroundActivities="); pw.print(foregroundActivities);
- pw.print(" (rep="); pw.print(repForegroundActivities); pw.println(")");
- }
- if (hasStartedServices) {
- pw.print(prefix); pw.print("hasStartedServices="); pw.println(hasStartedServices);
- }
- if (setProcState >= ActivityManager.PROCESS_STATE_SERVICE) {
- long wtime;
- synchronized (mBatteryStats) {
- wtime = mBatteryStats.getProcessWakeTime(info.uid,
- pid, SystemClock.elapsedRealtime());
- }
- pw.print(prefix); pw.print("lastWakeTime="); pw.print(lastWakeTime);
- pw.print(" timeUsed=");
- TimeUtils.formatDuration(wtime-lastWakeTime, pw); pw.println("");
- pw.print(prefix); pw.print("lastCpuTime="); pw.print(lastCpuTime);
- pw.print(" timeUsed=");
- TimeUtils.formatDuration(curCpuTime-lastCpuTime, pw); pw.println("");
- }
- pw.print(prefix); pw.print("lastRequestedGc=");
- TimeUtils.formatDuration(lastRequestedGc, now, pw);
- pw.print(" lastLowMemory=");
- TimeUtils.formatDuration(lastLowMemory, now, pw);
- pw.print(" reportLowMemory="); pw.println(reportLowMemory);
- if (killed || killedByAm || waitingToKill != null) {
- pw.print(prefix); pw.print("killed="); pw.print(killed);
- pw.print(" killedByAm="); pw.print(killedByAm);
- pw.print(" waitingToKill="); pw.println(waitingToKill);
- }
- if (debugging || crashing || crashDialog != null || notResponding
- || anrDialog != null || bad) {
- pw.print(prefix); pw.print("debugging="); pw.print(debugging);
- pw.print(" crashing="); pw.print(crashing);
- pw.print(" "); pw.print(crashDialog);
- pw.print(" notResponding="); pw.print(notResponding);
- pw.print(" " ); pw.print(anrDialog);
- pw.print(" bad="); pw.print(bad);
-
- // crashing or notResponding is always set before errorReportReceiver
- if (errorReportReceiver != null) {
- pw.print(" errorReportReceiver=");
- pw.print(errorReportReceiver.flattenToShortString());
- }
- pw.println();
- }
- if (activities.size() > 0) {
- pw.print(prefix); pw.println("Activities:");
- for (int i=0; i<activities.size(); i++) {
- pw.print(prefix); pw.print(" - "); pw.println(activities.get(i));
- }
- }
- if (services.size() > 0) {
- pw.print(prefix); pw.println("Services:");
- for (int i=0; i<services.size(); i++) {
- pw.print(prefix); pw.print(" - "); pw.println(services.valueAt(i));
- }
- }
- if (executingServices.size() > 0) {
- pw.print(prefix); pw.print("Executing Services (fg=");
- pw.print(execServicesFg); pw.println(")");
- for (int i=0; i<executingServices.size(); i++) {
- pw.print(prefix); pw.print(" - "); pw.println(executingServices.valueAt(i));
- }
- }
- if (connections.size() > 0) {
- pw.print(prefix); pw.println("Connections:");
- for (int i=0; i<connections.size(); i++) {
- pw.print(prefix); pw.print(" - "); pw.println(connections.valueAt(i));
- }
- }
- if (pubProviders.size() > 0) {
- pw.print(prefix); pw.println("Published Providers:");
- for (int i=0; i<pubProviders.size(); i++) {
- pw.print(prefix); pw.print(" - "); pw.println(pubProviders.keyAt(i));
- pw.print(prefix); pw.print(" -> "); pw.println(pubProviders.valueAt(i));
- }
- }
- if (conProviders.size() > 0) {
- pw.print(prefix); pw.println("Connected Providers:");
- for (int i=0; i<conProviders.size(); i++) {
- pw.print(prefix); pw.print(" - "); pw.println(conProviders.get(i).toShortString());
- }
- }
- if (curReceiver != null) {
- pw.print(prefix); pw.print("curReceiver="); pw.println(curReceiver);
- }
- if (receivers.size() > 0) {
- pw.print(prefix); pw.println("Receivers:");
- for (int i=0; i<receivers.size(); i++) {
- pw.print(prefix); pw.print(" - "); pw.println(receivers.valueAt(i));
- }
- }
- }
-
- ProcessRecord(BatteryStatsImpl _batteryStats, ApplicationInfo _info,
- String _processName, int _uid) {
- mBatteryStats = _batteryStats;
- info = _info;
- isolated = _info.uid != _uid;
- uid = _uid;
- userId = UserHandle.getUserId(_uid);
- processName = _processName;
- pkgList.put(_info.packageName, new ProcessStats.ProcessStateHolder(_info.versionCode));
- maxAdj = ProcessList.UNKNOWN_ADJ;
- curRawAdj = setRawAdj = -100;
- curAdj = setAdj = -100;
- persistent = false;
- removed = false;
- lastStateTime = lastPssTime = nextPssTime = SystemClock.uptimeMillis();
- }
-
- public void setPid(int _pid) {
- pid = _pid;
- shortStringName = null;
- stringName = null;
- }
-
- public void makeActive(IApplicationThread _thread, ProcessStatsService tracker) {
- if (thread == null) {
- final ProcessStats.ProcessState origBase = baseProcessTracker;
- if (origBase != null) {
- origBase.setState(ProcessStats.STATE_NOTHING,
- tracker.getMemFactorLocked(), SystemClock.uptimeMillis(), pkgList);
- origBase.makeInactive();
- }
- baseProcessTracker = tracker.getProcessStateLocked(info.packageName, uid,
- info.versionCode, processName);
- baseProcessTracker.makeActive();
- for (int i=0; i<pkgList.size(); i++) {
- ProcessStats.ProcessStateHolder holder = pkgList.valueAt(i);
- if (holder.state != null && holder.state != origBase) {
- holder.state.makeInactive();
- }
- holder.state = tracker.getProcessStateLocked(pkgList.keyAt(i), uid,
- info.versionCode, processName);
- if (holder.state != baseProcessTracker) {
- holder.state.makeActive();
- }
- }
- }
- thread = _thread;
- }
-
- public void makeInactive(ProcessStatsService tracker) {
- thread = null;
- final ProcessStats.ProcessState origBase = baseProcessTracker;
- if (origBase != null) {
- if (origBase != null) {
- origBase.setState(ProcessStats.STATE_NOTHING,
- tracker.getMemFactorLocked(), SystemClock.uptimeMillis(), pkgList);
- origBase.makeInactive();
- }
- baseProcessTracker = null;
- for (int i=0; i<pkgList.size(); i++) {
- ProcessStats.ProcessStateHolder holder = pkgList.valueAt(i);
- if (holder.state != null && holder.state != origBase) {
- holder.state.makeInactive();
- }
- holder.state = null;
- }
- }
- }
-
- /**
- * This method returns true if any of the activities within the process record are interesting
- * to the user. See HistoryRecord.isInterestingToUserLocked()
- */
- public boolean isInterestingToUserLocked() {
- final int size = activities.size();
- for (int i = 0 ; i < size ; i++) {
- ActivityRecord r = activities.get(i);
- if (r.isInterestingToUserLocked()) {
- return true;
- }
- }
- return false;
- }
-
- public void stopFreezingAllLocked() {
- int i = activities.size();
- while (i > 0) {
- i--;
- activities.get(i).stopFreezingScreenLocked(true);
- }
- }
-
- public void unlinkDeathRecipient() {
- if (deathRecipient != null && thread != null) {
- thread.asBinder().unlinkToDeath(deathRecipient, 0);
- }
- deathRecipient = null;
- }
-
- void updateHasAboveClientLocked() {
- hasAboveClient = false;
- for (int i=connections.size()-1; i>=0; i--) {
- ConnectionRecord cr = connections.valueAt(i);
- if ((cr.flags&Context.BIND_ABOVE_CLIENT) != 0) {
- hasAboveClient = true;
- break;
- }
- }
- }
-
- int modifyRawOomAdj(int adj) {
- if (hasAboveClient) {
- // If this process has bound to any services with BIND_ABOVE_CLIENT,
- // then we need to drop its adjustment to be lower than the service's
- // in order to honor the request. We want to drop it by one adjustment
- // level... but there is special meaning applied to various levels so
- // we will skip some of them.
- if (adj < ProcessList.FOREGROUND_APP_ADJ) {
- // System process will not get dropped, ever
- } else if (adj < ProcessList.VISIBLE_APP_ADJ) {
- adj = ProcessList.VISIBLE_APP_ADJ;
- } else if (adj < ProcessList.PERCEPTIBLE_APP_ADJ) {
- adj = ProcessList.PERCEPTIBLE_APP_ADJ;
- } else if (adj < ProcessList.CACHED_APP_MIN_ADJ) {
- adj = ProcessList.CACHED_APP_MIN_ADJ;
- } else if (adj < ProcessList.CACHED_APP_MAX_ADJ) {
- adj++;
- }
- }
- return adj;
- }
-
- void kill(String reason, boolean noisy) {
- if (!killedByAm) {
- Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "kill");
- if (noisy) {
- Slog.i(TAG, "Killing " + toShortString() + " (adj " + setAdj + "): " + reason);
- }
- EventLog.writeEvent(EventLogTags.AM_KILL, userId, pid, processName, setAdj, reason);
- Process.killProcessQuiet(pid);
- Process.killProcessGroup(info.uid, pid);
- if (!persistent) {
- killed = true;
- killedByAm = true;
- }
- Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
- }
- }
-
- public String toShortString() {
- if (shortStringName != null) {
- return shortStringName;
- }
- StringBuilder sb = new StringBuilder(128);
- toShortString(sb);
- return shortStringName = sb.toString();
- }
-
- void toShortString(StringBuilder sb) {
- sb.append(pid);
- sb.append(':');
- sb.append(processName);
- sb.append('/');
- if (info.uid < Process.FIRST_APPLICATION_UID) {
- sb.append(uid);
- } else {
- sb.append('u');
- sb.append(userId);
- int appId = UserHandle.getAppId(info.uid);
- if (appId >= Process.FIRST_APPLICATION_UID) {
- sb.append('a');
- sb.append(appId - Process.FIRST_APPLICATION_UID);
- } else {
- sb.append('s');
- sb.append(appId);
- }
- if (uid != info.uid) {
- sb.append('i');
- sb.append(UserHandle.getAppId(uid) - Process.FIRST_ISOLATED_UID);
- }
- }
- }
-
- public String toString() {
- if (stringName != null) {
- return stringName;
- }
- StringBuilder sb = new StringBuilder(128);
- sb.append("ProcessRecord{");
- sb.append(Integer.toHexString(System.identityHashCode(this)));
- sb.append(' ');
- toShortString(sb);
- sb.append('}');
- return stringName = sb.toString();
- }
-
- public String makeAdjReason() {
- if (adjSource != null || adjTarget != null) {
- StringBuilder sb = new StringBuilder(128);
- sb.append(' ');
- if (adjTarget instanceof ComponentName) {
- sb.append(((ComponentName)adjTarget).flattenToShortString());
- } else if (adjTarget != null) {
- sb.append(adjTarget.toString());
- } else {
- sb.append("{null}");
- }
- sb.append("<=");
- if (adjSource instanceof ProcessRecord) {
- sb.append("Proc{");
- sb.append(((ProcessRecord)adjSource).toShortString());
- sb.append("}");
- } else if (adjSource != null) {
- sb.append(adjSource.toString());
- } else {
- sb.append("{null}");
- }
- return sb.toString();
- }
- return null;
- }
-
- /*
- * Return true if package has been added false if not
- */
- public boolean addPackage(String pkg, int versionCode, ProcessStatsService tracker) {
- if (!pkgList.containsKey(pkg)) {
- ProcessStats.ProcessStateHolder holder = new ProcessStats.ProcessStateHolder(
- versionCode);
- if (baseProcessTracker != null) {
- holder.state = tracker.getProcessStateLocked(
- pkg, uid, versionCode, processName);
- pkgList.put(pkg, holder);
- if (holder.state != baseProcessTracker) {
- holder.state.makeActive();
- }
- } else {
- pkgList.put(pkg, holder);
- }
- return true;
- }
- return false;
- }
-
- public int getSetAdjWithServices() {
- if (setAdj >= ProcessList.CACHED_APP_MIN_ADJ) {
- if (hasStartedServices) {
- return ProcessList.SERVICE_B_ADJ;
- }
- }
- return setAdj;
- }
-
- public void forceProcessStateUpTo(int newState) {
- if (repProcState > newState) {
- curProcState = repProcState = newState;
- }
- }
-
- /*
- * Delete all packages from list except the package indicated in info
- */
- public void resetPackageList(ProcessStatsService tracker) {
- final int N = pkgList.size();
- if (baseProcessTracker != null) {
- long now = SystemClock.uptimeMillis();
- baseProcessTracker.setState(ProcessStats.STATE_NOTHING,
- tracker.getMemFactorLocked(), now, pkgList);
- if (N != 1) {
- for (int i=0; i<N; i++) {
- ProcessStats.ProcessStateHolder holder = pkgList.valueAt(i);
- if (holder.state != null && holder.state != baseProcessTracker) {
- holder.state.makeInactive();
- }
-
- }
- pkgList.clear();
- ProcessStats.ProcessState ps = tracker.getProcessStateLocked(
- info.packageName, uid, info.versionCode, processName);
- ProcessStats.ProcessStateHolder holder = new ProcessStats.ProcessStateHolder(
- info.versionCode);
- holder.state = ps;
- pkgList.put(info.packageName, holder);
- if (ps != baseProcessTracker) {
- ps.makeActive();
- }
- }
- } else if (N != 1) {
- pkgList.clear();
- pkgList.put(info.packageName, new ProcessStats.ProcessStateHolder(info.versionCode));
- }
- }
-
- public String[] getPackageList() {
- int size = pkgList.size();
- if (size == 0) {
- return null;
- }
- String list[] = new String[size];
- for (int i=0; i<pkgList.size(); i++) {
- list[i] = pkgList.keyAt(i);
- }
- return list;
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
- /*
- * Copyright (C) 2006 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 android.app;
-
- import android.content.ComponentName;
- import android.content.Intent;
- import android.content.IIntentReceiver;
- import android.content.pm.ActivityInfo;
- import android.content.pm.ApplicationInfo;
- import android.content.pm.ProviderInfo;
- import android.content.pm.ServiceInfo;
- import android.content.res.CompatibilityInfo;
- import android.content.res.Configuration;
- import android.net.Uri;
- import android.os.Bundle;
- import android.os.Debug;
- import android.os.ParcelFileDescriptor;
- import android.os.PersistableBundle;
- import android.os.RemoteException;
- import android.os.IBinder;
- import android.os.IInterface;
- import com.android.internal.app.IVoiceInteractor;
- import com.android.internal.content.ReferrerIntent;
-
- import java.io.FileDescriptor;
- import java.util.List;
- import java.util.Map;
-
- /**
- * System private API for communicating with the application. This is given to
- * the activity manager by an application when it starts up, for the activity
- * manager to tell the application about things it needs to do.
- * Engineer-Jsp add
- * 该interface为hide为外部不可访问,供系统内部调用
- * {@hide}
- */
- public interface IApplicationThread extends IInterface {
- void schedulePauseActivity(IBinder token, boolean finished, boolean userLeaving,
- int configChanges, boolean dontReport) throws RemoteException;
- void scheduleStopActivity(IBinder token, boolean showWindow,
- int configChanges) throws RemoteException;
- void scheduleWindowVisibility(IBinder token, boolean showWindow) throws RemoteException;
- void scheduleSleeping(IBinder token, boolean sleeping) throws RemoteException;
- void scheduleResumeActivity(IBinder token, int procState, boolean isForward, Bundle resumeArgs)
- throws RemoteException;
- void scheduleSendResult(IBinder token, List<ResultInfo> results) throws RemoteException;
-
- //此处就是 com.android.server.am.ActivityStackSupervisor 调用 ProcessRecord类对象内部的 thread 对象,再调用 thread 对象的 scheduleLaunchActivity() 函数了
- void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
- ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
- CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
- int procState, Bundle state, PersistableBundle persistentState,
- List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
- boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) throws RemoteException;
-
- void scheduleRelaunchActivity(IBinder token, List<ResultInfo> pendingResults,
- List<ReferrerIntent> pendingNewIntents, int configChanges, boolean notResumed,
- Configuration config, Configuration overrideConfig) throws RemoteException;
- void scheduleNewIntent(List<ReferrerIntent> intent, IBinder token) throws RemoteException;
- void scheduleDestroyActivity(IBinder token, boolean finished,
- int configChanges) throws RemoteException;
- void scheduleReceiver(Intent intent, ActivityInfo info, CompatibilityInfo compatInfo,
- int resultCode, String data, Bundle extras, boolean sync,
- int sendingUser, int processState) throws RemoteException;
- static final int BACKUP_MODE_INCREMENTAL = 0;
- static final int BACKUP_MODE_FULL = 1;
- static final int BACKUP_MODE_RESTORE = 2;
- static final int BACKUP_MODE_RESTORE_FULL = 3;
- void scheduleCreateBackupAgent(ApplicationInfo app, CompatibilityInfo compatInfo,
- int backupMode) throws RemoteException;
- void scheduleDestroyBackupAgent(ApplicationInfo app, CompatibilityInfo compatInfo)
- throws RemoteException;
- void scheduleCreateService(IBinder token, ServiceInfo info,
- CompatibilityInfo compatInfo, int processState) throws RemoteException;
- void scheduleBindService(IBinder token,
- Intent intent, boolean rebind, int processState) throws RemoteException;
- void scheduleUnbindService(IBinder token,
- Intent intent) throws RemoteException;
- void scheduleServiceArgs(IBinder token, boolean taskRemoved, int startId,
- int flags, Intent args) throws RemoteException;
- void scheduleStopService(IBinder token) throws RemoteException;
- static final int DEBUG_OFF = 0;
- static final int DEBUG_ON = 1;
- static final int DEBUG_WAIT = 2;
- void bindApplication(String packageName, ApplicationInfo info, List<ProviderInfo> providers,
- ComponentName testName, ProfilerInfo profilerInfo, Bundle testArguments,
- IInstrumentationWatcher testWatcher, IUiAutomationConnection uiAutomationConnection,
- int debugMode, boolean openGlTrace, boolean restrictedBackupMode, boolean persistent,
- Configuration config, CompatibilityInfo compatInfo, Map<String, IBinder> services,
- Bundle coreSettings) throws RemoteException;
- void scheduleExit() throws RemoteException;
- void scheduleSuicide() throws RemoteException;
- void scheduleConfigurationChanged(Configuration config) throws RemoteException;
- void updateTimeZone() throws RemoteException;
- void clearDnsCache() throws RemoteException;
- void setHttpProxy(String proxy, String port, String exclList,
- Uri pacFileUrl) throws RemoteException;
- void processInBackground() throws RemoteException;
- void dumpService(FileDescriptor fd, IBinder servicetoken, String[] args)
- throws RemoteException;
- void dumpProvider(FileDescriptor fd, IBinder servicetoken, String[] args)
- throws RemoteException;
- void scheduleRegisteredReceiver(IIntentReceiver receiver, Intent intent,
- int resultCode, String data, Bundle extras, boolean ordered,
- boolean sticky, int sendingUser, int processState) throws RemoteException;
- void scheduleLowMemory() throws RemoteException;
- void scheduleActivityConfigurationChanged(IBinder token, Configuration overrideConfig)
- throws RemoteException;
- void profilerControl(boolean start, ProfilerInfo profilerInfo, int profileType)
- throws RemoteException;
- void dumpHeap(boolean managed, String path, ParcelFileDescriptor fd)
- throws RemoteException;
- void setSchedulingGroup(int group) throws RemoteException;
- static final int PACKAGE_REMOVED = 0;
- static final int EXTERNAL_STORAGE_UNAVAILABLE = 1;
- void dispatchPackageBroadcast(int cmd, String[] packages) throws RemoteException;
- void scheduleCrash(String msg) throws RemoteException;
- void dumpActivity(FileDescriptor fd, IBinder servicetoken, String prefix, String[] args)
- throws RemoteException;
- void setCoreSettings(Bundle coreSettings) throws RemoteException;
- void updatePackageCompatibilityInfo(String pkg, CompatibilityInfo info) throws RemoteException;
- void scheduleTrimMemory(int level) throws RemoteException;
- void dumpMemInfo(FileDescriptor fd, Debug.MemoryInfo mem, boolean checkin, boolean dumpInfo,
- boolean dumpDalvik, boolean dumpSummaryOnly, String[] args) throws RemoteException;
- void dumpGfxInfo(FileDescriptor fd, String[] args) throws RemoteException;
- void dumpDbInfo(FileDescriptor fd, String[] args) throws RemoteException;
- void unstableProviderDied(IBinder provider) throws RemoteException;
- void requestAssistContextExtras(IBinder activityToken, IBinder requestToken, int requestType)
- throws RemoteException;
- void scheduleTranslucentConversionComplete(IBinder token, boolean timeout)
- throws RemoteException;
- void scheduleOnNewActivityOptions(IBinder token, ActivityOptions options)
- throws RemoteException;
- void setProcessState(int state) throws RemoteException;
- void scheduleInstallProvider(ProviderInfo provider) throws RemoteException;
- void updateTimePrefs(boolean is24Hour) throws RemoteException;
- void scheduleCancelVisibleBehind(IBinder token) throws RemoteException;
- void scheduleBackgroundVisibleBehindChanged(IBinder token, boolean enabled) throws RemoteException;
- void scheduleEnterAnimationComplete(IBinder token) throws RemoteException;
- void notifyCleartextNetwork(byte[] firstPacket) throws RemoteException;
-
- String descriptor = "android.app.IApplicationThread";
-
- int SCHEDULE_PAUSE_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION;
- int SCHEDULE_STOP_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+2;
- int SCHEDULE_WINDOW_VISIBILITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+3;
- int SCHEDULE_RESUME_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+4;
- int SCHEDULE_SEND_RESULT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+5;
- int SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+6;
- int SCHEDULE_NEW_INTENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+7;
- int SCHEDULE_FINISH_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+8;
- int SCHEDULE_RECEIVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+9;
- int SCHEDULE_CREATE_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+10;
- int SCHEDULE_STOP_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+11;
- int BIND_APPLICATION_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+12;
- int SCHEDULE_EXIT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+13;
-
- int SCHEDULE_CONFIGURATION_CHANGED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+15;
- int SCHEDULE_SERVICE_ARGS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+16;
- int UPDATE_TIME_ZONE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+17;
- int PROCESS_IN_BACKGROUND_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+18;
- int SCHEDULE_BIND_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+19;
- int SCHEDULE_UNBIND_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+20;
- int DUMP_SERVICE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+21;
- int SCHEDULE_REGISTERED_RECEIVER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+22;
- int SCHEDULE_LOW_MEMORY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+23;
- int SCHEDULE_ACTIVITY_CONFIGURATION_CHANGED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+24;
- int SCHEDULE_RELAUNCH_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+25;
- int SCHEDULE_SLEEPING_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+26;
- int PROFILER_CONTROL_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+27;
- int SET_SCHEDULING_GROUP_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+28;
- int SCHEDULE_CREATE_BACKUP_AGENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+29;
- int SCHEDULE_DESTROY_BACKUP_AGENT_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+30;
- int SCHEDULE_ON_NEW_ACTIVITY_OPTIONS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+31;
- int SCHEDULE_SUICIDE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+32;
- int DISPATCH_PACKAGE_BROADCAST_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+33;
- int SCHEDULE_CRASH_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+34;
- int DUMP_HEAP_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+35;
- int DUMP_ACTIVITY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+36;
- int CLEAR_DNS_CACHE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+37;
- int SET_HTTP_PROXY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+38;
- int SET_CORE_SETTINGS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+39;
- int UPDATE_PACKAGE_COMPATIBILITY_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+40;
- int SCHEDULE_TRIM_MEMORY_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+41;
- int DUMP_MEM_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+42;
- int DUMP_GFX_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+43;
- int DUMP_PROVIDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+44;
- int DUMP_DB_INFO_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+45;
- int UNSTABLE_PROVIDER_DIED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+46;
- int REQUEST_ASSIST_CONTEXT_EXTRAS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+47;
- int SCHEDULE_TRANSLUCENT_CONVERSION_COMPLETE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+48;
- int SET_PROCESS_STATE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+49;
- int SCHEDULE_INSTALL_PROVIDER_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+50;
- int UPDATE_TIME_PREFS_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+51;
- int CANCEL_VISIBLE_BEHIND_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+52;
- int BACKGROUND_VISIBLE_BEHIND_CHANGED_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+53;
- int ENTER_ANIMATION_COMPLETE_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+54;
- int NOTIFY_CLEARTEXT_NETWORK_TRANSACTION = IBinder.FIRST_CALL_TRANSACTION+55;
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
关键调用代理代码:
- /**
- * Cast a Binder object into an application thread interface, generating
- * a proxy if needed.
- * Engineer-Jsp add 由此可以见,调用 android.app.ApplicationThreadNative 类的 asInterface 函数时
- * 得到的是实现 IApplicationThread 接口的对象,该对象为 android.app.ApplicationThreadNative 内部类的代理类 ApplicationThreadProxy
- * 参数为IBinder 对象
- */
- static public IApplicationThread asInterface(IBinder obj) {
- if (obj == null) {
- return null;
- }
- IApplicationThread in =
- (IApplicationThread)obj.queryLocalInterface(descriptor);
- if (in != null) {
- return in;
- }
-
- return new ApplicationThreadProxy(obj);
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
- public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,
- ActivityInfo info, Configuration curConfig, Configuration overrideConfig,
- CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,
- int procState, Bundle state, PersistableBundle persistentState,
- List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
- boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) throws RemoteException {
- Parcel data = Parcel.obtain();
- data.writeInterfaceToken(IApplicationThread.descriptor);
- intent.writeToParcel(data, 0);
- data.writeStrongBinder(token);
- data.writeInt(ident);
- info.writeToParcel(data, 0);
- curConfig.writeToParcel(data, 0);
- if (overrideConfig != null) {
- data.writeInt(1);
- overrideConfig.writeToParcel(data, 0);
- } else {
- data.writeInt(0);
- }
- compatInfo.writeToParcel(data, 0);
- data.writeString(referrer);
- data.writeStrongBinder(voiceInteractor != null ? voiceInteractor.asBinder() : null);
- data.writeInt(procState);
- data.writeBundle(state);
- data.writePersistableBundle(persistentState);
- data.writeTypedList(pendingResults);
- data.writeTypedList(pendingNewIntents);
- data.writeInt(notResumed ? 1 : 0);
- data.writeInt(isForward ? 1 : 0);
- if (profilerInfo != null) {
- data.writeInt(1);
- profilerInfo.writeToParcel(data, Parcelable.PARCELABLE_WRITE_RETURN_VALUE);
- } else {
- data.writeInt(0);
- }
- mRemote.transact(SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION, data, null,
- IBinder.FLAG_ONEWAY);
- data.recycle();
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
注意这一句代码:
- mRemote.transact(SCHEDULE_LAUNCH_ACTIVITY_TRANSACTION, data, null,
- IBinder.FLAG_ONEWAY);
⑦ android.os.Binder
该类内部代理类 android.os.BinderProxy 也实现了 IBinder接口
android.os.Binder transact 函数
- public final boolean transact(int code, Parcel data, Parcel reply,
- int flags) throws RemoteException {
- if (false) Log.v("Binder", "Transact: " + code + " to " + this);
- if (data != null) {
- data.setDataPosition(0);
- }
- boolean r = onTransact(code, data, reply, flags);
- if (reply != null) {
- reply.setDataPosition(0);
- }
- return r;
- }
android.os.BinderProxy transact 函数
- public boolean transact(int code, Parcel data, Parcel reply, int flags) throws RemoteException {
- Binder.checkParcel(this, code, data, "Unreasonably large binder buffer");
- return transactNative(code, data, reply, flags);
- }
根据异常的log,我们需要看 android.os.BinderProxy transact 函数,因为它调用了android.os.BinderProxy 代理类 transactNative 函数
transactNative 函数代码:
- public native boolean transactNative(int code, Parcel data, Parcel reply,
- int flags) throws RemoteException;
于是乎笔者打开了Linux,查找 framework 源码,键入一条搜索命令,查找 jni 调用
一个叫 android_util_Binder.cpp 的文件调用来完成此函数,查看cpp代码,查找 transactNative 函数
vi 这个cpp,并开始查找该函数
执行 vi 搜索命令,找到 transactNative 函数
JNI 异常处理代码:
- void signalExceptionForError(JNIEnv* env, jobject obj, status_t err,
- bool canThrowRemoteException, int parcelSize)
- {
- switch (err) {
- case UNKNOWN_ERROR:
- jniThrowException(env, "java/lang/RuntimeException", "Unknown error");
- break;
- case NO_MEMORY:
- jniThrowException(env, "java/lang/OutOfMemoryError", NULL);
- break;
- case INVALID_OPERATION:
- jniThrowException(env, "java/lang/UnsupportedOperationException", NULL);
- break;
- case BAD_VALUE:
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
- break;
- case BAD_INDEX:
- jniThrowException(env, "java/lang/IndexOutOfBoundsException", NULL);
- break;
- case BAD_TYPE:
- jniThrowException(env, "java/lang/IllegalArgumentException", NULL);
- break;
- case NAME_NOT_FOUND:
- jniThrowException(env, "java/util/NoSuchElementException", NULL);
- break;
- case PERMISSION_DENIED:
- jniThrowException(env, "java/lang/SecurityException", NULL);
- break;
- case NOT_ENOUGH_DATA:
- jniThrowException(env, "android/os/ParcelFormatException", "Not enough data");
- break;
- case NO_INIT:
- jniThrowException(env, "java/lang/RuntimeException", "Not initialized");
- break;
- case ALREADY_EXISTS:
- jniThrowException(env, "java/lang/RuntimeException", "Item already exists");
- break;
- case DEAD_OBJECT:
- // DeadObjectException is a checked exception, only throw from certain methods.
- jniThrowException(env, canThrowRemoteException
- ? "android/os/DeadObjectException"
- : "java/lang/RuntimeException", NULL);
- break;
- case UNKNOWN_TRANSACTION:
- jniThrowException(env, "java/lang/RuntimeException", "Unknown transaction code");
- break;
- case FAILED_TRANSACTION: {
- ALOGE("!!! FAILED BINDER TRANSACTION !!! (parcel size = %d)", parcelSize);
- const char* exceptionToThrow;
- char msg[128];
- // TransactionTooLargeException is a checked exception, only throw from certain methods.
- // FIXME: Transaction too large is the most common reason for FAILED_TRANSACTION
- // but it is not the only one. The Binder driver can return BR_FAILED_REPLY
- // for other reasons also, such as if the transaction is malformed or
- // refers to an FD that has been closed. We should change the driver
- // to enable us to distinguish these cases in the future.
- // 这就就是 activity 与 activity 跳转之间的过程的判断,超过限制大小时的异常处理
- // 由 jni 引用java类型 android/os/TransactionTooLargeException ,并抛出这个异常
- // parcelSize > 200*1024 ,1024为bytes,系统限制为 200*1024 字节,所以我传的 70多万的字节就会导致程序闪退了
- // 然后抛出 log data parcel size %d bytes", parcelSize 即异常后,传输包的大小了
- if (canThrowRemoteException && parcelSize > 200*1024) {
- // bona fide large payload
- exceptionToThrow = "android/os/TransactionTooLargeException";
- snprintf(msg, sizeof(msg)-1, "data parcel size %d bytes", parcelSize);
- } else {
- // Heuristic: a payload smaller than this threshold "shouldn't" be too
- // big, so it's probably some other, more subtle problem. In practice
- // it seems to always mean that the remote process died while the binder
- // transaction was already in flight.
- exceptionToThrow = (canThrowRemoteException)
- ? "android/os/DeadObjectException"
- : "java/lang/RuntimeException";
- snprintf(msg, sizeof(msg)-1,
- "Transaction failed on small parcel; remote process probably died");
- }
- jniThrowException(env, exceptionToThrow, msg);
- } break;
- case FDS_NOT_ALLOWED:
- jniThrowException(env, "java/lang/RuntimeException",
- "Not allowed to write file descriptors here");
- break;
- case -EBADF:
- jniThrowException(env, "java/lang/RuntimeException",
- "Bad file descriptor");
- break;
- case -ENFILE:
- jniThrowException(env, "java/lang/RuntimeException",
- "File table overflow");
- break;
- case -EMFILE:
- jniThrowException(env, "java/lang/RuntimeException",
- "Too many open files");
- break;
- case -EFBIG:
- jniThrowException(env, "java/lang/RuntimeException",
- "File too large");
- break;
- case -ENOSPC:
- jniThrowException(env, "java/lang/RuntimeException",
- "No space left on device");
- break;
- case -ESPIPE:
- jniThrowException(env, "java/lang/RuntimeException",
- "Illegal seek");
- break;
- case -EROFS:
- jniThrowException(env, "java/lang/RuntimeException",
- "Read-only file system");
- break;
- case -EMLINK:
- jniThrowException(env, "java/lang/RuntimeException",
- "Too many links");
- break;
- default:
- ALOGE("Unknown binder error code. 0x%" PRIx32, err);
- String8 msg;
- msg.appendFormat("Unknown binder error code. 0x%" PRIx32, err);
- // RemoteException is a checked exception, only throw from certain methods.
- jniThrowException(env, canThrowRemoteException
- ? "android/os/RemoteException" : "java/lang/RuntimeException", msg.string());
- break;
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
解决方案:
产生异常代码处:
- @Override
- public void onSuccess(JSONObject object, POST type) {
- try {
- if (type == POST.SEARCH_LOCATION) {
- onSuccess2Pro(getViewController(), type);
- String location = object.getString("lat") + "_" + object.getString("lng");
- Bundle extras = new Bundle();
- extras.putString("action", "search");
- extras.putString("response", location);
- sendActivity(LocationActivity.class, extras);
- } else if (type == POST.LBS_TRACK) {
- // 闪退前的逻辑,即bug未解之前的逻辑
- Bundle extras = new Bundle();
- extras.putString("action", "track");
- extras.putString("response", object.toString());
- sendActivity(TrackActivity.class, extras);
-
- // 闪退之后的逻辑,即解决bug之后的逻辑
- new TrackAsynTask().execute(object.toString());
- }
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
- private class TrackAsynTask extends AsyncTask<String, Void, Boolean> {
- List<List<LatLng>> mTrackArrays = new ArrayList<List<LatLng>>();
-
- @Override
- protected Boolean doInBackground(String... params) {
- try {
- // 单例调用RmtTrack将数据进行解析和解密并且重新封装,这是一个耗时的操作不能直接丢给activity处理
- // 所以处理完再丢给activity展示,避免出现卡顿、黑屏现象
- RmtTrack.getTrackManager().LBSTrack(new JSONObject(params[0]), new CarTrackListener() {
- @Override
- public void onTrackCallBack(List<LatLng> arg0) {
- // 排除点漂
- if (arg0.size() >= 2) {
- // 添加轨迹段
- mTrackArrays.add(arg0);
- }
- }
- });
- } catch (JSONException e) {
- e.printStackTrace();
- return false;
- }
- return true;
- }
-
- @Override
- protected void onPostExecute(Boolean result) {
- super.onPostExecute(result);
- // 没有发生异常且全部完成
- if (result) {
- //轨迹段数据最少为1段
- if (mTrackArrays.size() > 0) {
- // 给静态函数传参,在activity onCreate之前调用就行,在绘制时判断一下是否null,activity onDestroy时在置为null
- TrackActivity.InstanceLatLngList(mTrackArrays);
- // 开始启动activity
- sendActivity(TrackActivity.class, null);
- }
- // 隐藏ProgressBar进度条
- onSuccess2Pro(getViewController(), POST.LBS_TRACK);
- }
- }
- }
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreBlack.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。