云题海 - 专业文章范例文档资料分享平台

当前位置:首页 > Android系统在新进程中启动自定义服务过程(startService)的原理分析

Android系统在新进程中启动自定义服务过程(startService)的原理分析

  • 62 次阅读
  • 3 次下载
  • 2025/5/5 2:49:52

???

??? } catch (RuntimeException e) { ???

??? ...... ???

??? } ??? ??? } ???

??? ...... ??? ??? }

这里调用Process.start函数创建了一个新的进程,指定新的进程执行android.app.ActivityThread类。最后将表示这个新进程的ProcessRecord保存在mPidSelfLocked列表中,后面会用到。

Step 5. Process.start

这个函数定义在frameworks/base/core/java/android/os/Process.java文件中,这个函数我们就不看了,有兴趣的读者可以自己研究一下。在这个场景中,它就是新建一个进程,然后导入android.app.ActivityThread这个类,然后执行它的main函数。 Step 6. ActivityThread.main

这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:

view plain

??? public final class ActivityThread { ??? ??? ...... ???

??? public static final void main(String[] args) { ???

??? ...... ???

??? Looper.prepareMainLooper(); ???

??? ...... ???

??? ActivityThread thread = new ActivityThread();

??? thread.attach(false); ???

??? ...... ???

??? Looper.loop(); ???

??? ...... ???

??? thread.detach(); ???

??? ...... ??? } ??? }

注意,执行到这里的时候,已经是在上一步创建的新进程里面了,即这里的进程是用来启动服务的,原来的主进程已经完成了它的命令,返回了。

前面我们提到,在Android应用程序中,每一个进程对应一个ActivityThread实例,所以,这个函数会创建一个thread实例,然后调用ActivityThread.attach函数进一步处理。 Step 7. ActivityThread.attach

这个函数定义在frameworks/base/core/java/android/app/ActivityThread.java文件中:

view plain

??? public final class ActivityThread { ??? ??? ...... ???

??? private final void attach(boolean system) { ??? ??? ...... ???

??? if (!system) { ???

??? ...... ???

??? IActivityManager mgr = ActivityManagerNative.getDefault(); ??? try {

??? mgr.attachApplication(mAppThread); ??? } catch (RemoteException ex) { ??? }

??? } else { ???

??? ...... ???

??? } ???

??? ...... ??? ??? } ???

??? ...... ??? ??? }

从Step 6中,这里传进来的参数system为false。成员变量mAppThread是一个ApplicationThread实例,我们在前面已经描述过这个实例的作用,它是用来辅助ActivityThread来执行一些操作的。

调用ActivityManagerNative.getDefault函数得到ActivityManagerService的远程接口,即ActivityManagerProxy,接着调用它的attachApplication函数。 Step 8. ActivityManagerProxy.attachApplication 这

frameworks/base/core/java/android/app/ActivityManagerNative.java文件中:

view plain

??? class ActivityManagerProxy implements IActivityManager ??? {

??? ...... ???

??? public ??? {

??? Parcel data = Parcel.obtain(); ??? Parcel reply = Parcel.obtain();

??? data.writeInterfaceToken(IActivityManager.descriptor); ??? data.writeStrongBinder(app.asBinder());

??? mRemote.transact(ATTACH_APPLICATION_TRANSACTION, data, reply, 0); ??? reply.readException(); ??? data.recycle(); ??? reply.recycle(); ??? }

void

attachApplication(IApplicationThread

app)

throws

RemoteException

???

??? ...... ??? ??? }

这个函数主要是将新进程里面的IApplicationThread实例通过Binder驱动程序传递给ActivityManagerService。

Step 9. ActivityManagerService.attachApplication 这文件中:

view plain

个函数定义在

frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

??? public final class ActivityManagerService extends ActivityManagerNative ??? implements BatteryStatsImpl.BatteryCallback { ??? ??? ...... ???

??? public final void attachApplication(IApplicationThread thread) ??? {

??? synchronized (this) {

??? int callingPid = Binder.getCallingPid();

??? final long origId = Binder.clearCallingIdentity(); ??? attachApplicationLocked(thread, callingPid); ??? Binder.restoreCallingIdentity(origId); ??? } ??? } ??? ??? ...... ??? ??? }

Watchdog.Monitor,

这里通过调用attachApplicationLocked函数进一步处理。

Step 10. ActivityManagerService.attachApplicationLocked 这

frameworks/base/services/java/com/android/server/am/ActivityManagerService.java

  • 收藏
  • 违规举报
  • 版权认领
下载文档10.00 元 加入VIP免费下载
推荐下载
本文作者:...

共分享92篇相关文档

文档简介:

??? ??? } catch (RuntimeException e) { ??? ??? ...... ??? ??? } ??? ??? } ??? ??? ...... ??? ??? } 这里调用Process.start函数创建了一个新的进程,指定新的进程执行android.app.ActivityThread类。最后将表示这个新进程的ProcessRecord保存在mPidSelfLocked列表中,后面会用到。 Step 5. Process.start 这个函数定义

× 游客快捷下载通道(下载后可以自由复制和排版)
单篇付费下载
限时特价:10 元/份 原价:20元
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信:fanwen365 QQ:370150219
Copyright © 云题海 All Rights Reserved. 苏ICP备16052595号-3 网站地图 客服QQ:370150219 邮箱:370150219@qq.com