DroidPlugin代码分析(四) 进程管理

本文深入剖析DroidPlugin的进程管理,包括插件进程如何被hook、如何检测插件进程死亡以及进程管理策略。通过分析代码,揭示了在插件启动过程中,如何通过hook handleLaunchActivity方法手动加载插件,创建并调用插件Application的onCreate。同时,文中详细解释了如何通过ServiceConnection和RemoteCallbackList检测插件进程的死亡。最后,概述了DroidPlugin的简单粗暴的进程管理方式,包括StaticProcessList和RunningProcessList两个进程列表,以及进程选择和回收策略。
摘要由CSDN通过智能技术生成

之所以单列一篇写进程管理,是因为看到注释上写“这是一个复杂的进程管理程序”,但是仔细看了一下好像也没那么“复杂”...

这一篇通过分析代码试图搞清楚以下3个问题:

• 插件进程是如何被hook住的?

• 插件进程die是如何被检测到的?

• 插件进程是如何被管理的?

一、插件进程是如何被hook住的?

在写宿主程序的时候,我们知道需要在ApplicationonCreate()attachBaseContext()里调用PluginHelperAPI来安装hook。但是,插件程序本身是不会调用这些API的,那么被启动的插件程序是如何被hook住的呢?

首先我们要再次回顾一下activity启动的一些细节,图比较大切成了两张,缩进表示该方法是在上一级方法里调用的子方法。先看左半边图:


比较简单,宿主在一个新进程里启动插件的时候,AMS会向插件进程的ActivityThread发起两个调用:bindApplication()scheduleLaunchAcitivity()再看右半边图:


这张图主要描述了这两个调用具体干了什么,实际上它们只是向ActivityThreadmH里发送了两个消息,真正干活的是mH(看过第二篇的可能有印象,我们把mH里面的mCallback替换成了我们的PluginCallback)。

看看bindApplication()具体做了哪些事情:

• 调用getPackageInfoNoCheck()创建一个LoadedApk对象,注意,由于AMS并不知道关于插件的事情,所以这里加载的还是宿主apk!所以实际上插件是启动不起来的,具体怎么处理的后面会介绍。创建的LoadedApk会放到一个mPackagesmap中。

• 创建Instrumentation,调用LoadedApk.makeApplication()创建Application,注意只是创建,并没有调用ApplicationonCreate()。创建Application会放到一个mAllApplicationslist中。

再看看scheduleLaunchActivity()具体做了哪些事情:

• 通过Instrumentation加载、创建activity对象,这里会用到class loader

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值