第一范文网 - 专业文章范例文档资料分享平台

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

来源:用户分享 时间:2025/5/23 3:53:04 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

?? public void run() { ??

?? ...... ??

?? // Critical services... ?? try { ??

?? ...... ??

?? context = ActivityManagerService.main(factoryTest); ??

?? ...... ??

?? ActivityManagerService.setSystemProcess(); ??

?? ...... ??

?? } catch (RuntimeException e) {

?? Slog.e(\, \, e); ?? } ??

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

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

首先是调用ActivityManagerService.main函数来创建一个ActivityManagerService实例,然后通过调用ActivityManagerService.setSystemProcess函数把这个Binder实例添加Binder进程间通信机制的守护进程ServiceManager中去:

view plain

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

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

??? static ActivityManagerService mSelf; ???

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

??? public static void setSystemProcess() { ??? try {

??? ActivityManagerService m = mSelf; ???

??? ServiceManager.addService(\, m); ??? ??? ...... ???

??? } catch (PackageManager.NameNotFoundException e) { ??? ...... ??? } ??? } ???

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

??? public static final Context main(int factoryTest) { ??? ??? ...... ???

??? ActivityManagerService m = thr.mService; ??? mSelf = m; ???

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

这样,ActivityManagerService就启动起来了。

回到

ActivityManagerProxy

类的

startService

函数中,它定义在

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

view plain

??? class ActivityManagerProxy implements IActivityManager ??? {

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

??? public ComponentName startService(IApplicationThread caller, Intent service,

??? String resolvedType) throws RemoteException

??? {

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

??? data.writeInterfaceToken(IActivityManager.descriptor);

??? data.writeStrongBinder(caller != null ? caller.asBinder() : null); ??? service.writeToParcel(data, 0); ??? data.writeString(resolvedType);

??? mRemote.transact(START_SERVICE_TRANSACTION, data, reply, 0); ??? reply.readException();

??? ComponentName res = ComponentName.readFromParcel(reply); ??? data.recycle(); ??? reply.recycle(); ??? return res; ??? } ???

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

参数service是一个Intent实例,它里面指定了要启动的服务的名称,就是前面我们所说的“shy.luo.ashmem.server”了。

参数caller是一个IApplicationThread实例,它是一个在主进程创建的一个Binder对象。在Android应用程序中,每一个进程都用一个ActivityThread实例来表示,而在ActivityThread类中,有一个成员变量mAppThread,它是一个ApplicationThread实例,实现了IApplicationThread接口,它的作用是用来辅助ActivityThread类来执行一些操作,这个我们在后面会看到它是如何用来启动服务的。

参数resolvedType是一个字符串,它表示service这个Intent的MIME类型,它是在解析Intent时用到的。在这个例子中,我们没有指定这个Intent 的MIME类型,因此,这个参数为null。

ActivityManagerProxy类的startService函数把这三个参数写入到data本地变量去,接着通过mRemote.transact函数进入到Binder驱动程序,然后Binder驱动程序唤醒正在等待Client请求的ActivityManagerService进程,最后进入到ActivityManagerService的startService函数中。

ActivityManagerService的startService函数的处理流程如下图所示:

点击查看大图

在这个序列图中,一共有20个步骤,下面说明每一步。 Step 1. ActivityManagerService.startService 这文件中:

view plain

个函数定义在

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

Android系统在新进程中启动自定义服务过程(startService)的原理分析.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c927cx0tk5o1symv1jbrh_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top