Service Hook解析

本文详细介绍了Android中Service Hook的工作原理,重点讨论了Service的代理分发技术。通过ActivityManagerProxy的Hook方法,如startService、stopService等,实现对Service生命周期的控制。文中讲解了匹配、替换和代理分发三个关键步骤,强调LocalService和RemoteService的角色,以及如何在LocalService的onStartCommand方法中进行目标Service的控制。
摘要由CSDN通过智能技术生成

4,Service Hook解析

Service/ContentProvider由于没有Activity那么复杂的启动过程,并且Activity的生命周期是由用户交互决定的,

而Service的声明周期是主动通过代码调用的。因此虽然也有替换/还原过程,但是有点不同,是采用代理分发技术。

就是启动宿主的Service/ContentProvider对象,然后管理插件的Service/ContentProvider对象。

Service 的Hook 是通过ActivityManagerProxy完成的。

ActivityManagerProxy类Hook了ActivityManager的7个方法,其中和service相关的有5个,分别是startService/ stopService/ 

stopServiceToken/bindService/ unbindService,这5个方法主要和service的生命周期有关。并且所有方法的调用流程

完全相同,因此,以startService方法为例来论述。

在AndroidManifest中注册了两类service,一类LocalService,多进程时为RemoteService,

<!-- Local Service running in main process -->
<service android:name="com.didi.virtualapk.delegate.LocalService" />

<!-- Daemon Service running in child process -->
<service android:name="com.didi.virtualapk.delegate.RemoteService" android:process=":daemon">
    <intent-filter>
       <action android:name="${applicationId}.intent.ACTION_DAEMON_SERVICE" />
    </intent-filter>
</service>

ActivityManagerProxy的invoke方法中有关startService处理的代码如下,

if ("startService".equals(method.getName())) {
    try {
        return startService(proxy, method, args);

startService方法如下,

private Object startService(Object proxy, Method method, Object[] args) throws Throwable {
        IApplicationThread appThread = (IApplicationThread) args[0];
        Intent target = (Intent) args[1];
        ResolveInfo resolveInfo = this.mPluginManager.resolveService(target, 0);
        if (null == resolveInfo || null == resolveInfo.serviceInfo) {
            // is host service
            return method.invoke(this.mActivityManager, args);
        }

        return startDelegateServiceForTarget(target, resolveInfo.serviceInfo, null, RemoteService.EXTRA_COMMAND_START_SERVICE);
    }

首先调用PluginManager的resolveService方法匹配出目标intent的相关信息,然后调用startDelegateServiceForTarget方法进行替换.

4.1 匹配

PluginManager的reso

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值