请尊重分享成果,转载请注明出处:
http://blog.csdn.net/hejjunlin/article/details/52264977

在了解系统的activity,service,broadcastReceiver的启动过程后,今天将分析下360 DroidPlugin是如何预注册占坑的?本篇文章主要分析Service预注册占坑,Service占了坑后又是什么时候开始瞒天过海欺骗AMS的?先看下Agenda:

  • AndroidMainfest.xml中概览
  • Service中关键方法被hook时机
  • startService被hook
  • 瞒天过海流程图
  • 认识ServiceManager

AndroidMainfest.xml中概览

android:process=”:PluginP02” 表示自定义一个名为PluginP02的进程,该属性一旦设置, 那么App启动之后, Service肯定会以远程服务方式启动, —- 可通过adb shell ps 就可以看到有一个独立的进程启动了.

项目 Package为 com.morgoo.droidplugin , 并设置 android:process=”:PluginP02”, 那么App运行时, 通过 adb shell ps | grep com.morgoo.droidplugin , 可以看到有两个进程:

startService被hook

IActivityManagerHookHandle.startService方法

replaceFirstServiceIntentOfArgs()

接下来我们继续回到StartService类中,看下afterInvoke方法

stopService,bindService,unbindService,setServiceForeground都是类似逻辑,可从源码中证实。
在前一篇《插件开发之360 DroidPlugin源码分析(四)Activity预注册占坑》,我们曾了解到,8个进程中的service在预注册占坑,在AndroidManifest.xml中只有一个,那如果插件要启动多个service怎么办?这是第一个问题,而我们知道所有和服务相关的都要在系统的systemServer进程中进行注册,难道DroidPlugin要逆天的本事?这是第二个问题
我们从代码中发现有一个ServceManager,这和android系统中大管家ServiceManager相差一个i,难道要改大管家的职责?又多了一个疑惑
仔细看了下ServceManager中的代码:



以上代码可总结为:(以虚线分上下两部分)
1.上部分主要是ServceManager单例及有一个handleXXX相关的方法,下部分主要是Service的一些生命周期方法。
2.我们基本可以确定之前问题2和问题3的答案了,没有那么逆天的本事来操作ServiceManager,也不能修改大管家ServiceManager的职责
3.那问题又来了,这个类到底是做啥的?还起一个叫ServceManager的名字,
以hanldeOnTaskRemoveOne方法为例看看:

接着再看下ServceManager中的onBind方法:

然后调到handleOnBindOne方法中,我们前面分析了一个handleOnTaskRemovedOne方法,下面1-7步骤套路都是一样,主要在return时,直接调用service自身的onBind了,这和我们平时在Activity中new Intent,然后把这个intent传到onBind中.

那么问题来了,还要这么一个类倒腾来干啥呢?还记得上面有一处逻辑service为null时,就调用了handleCreateServiceOne,好戏在这里:


看了上面的分析后,我们再去回想第一个问题,那如果插件要启动多个service怎么办?不知道不没有注意到mTokenServices,mNameService,mServiceTaskIds这些成员变量,它们都是Map,key不一样,value全是Service,如个有多个service在插件中启动了,mTokenServices,mNameService,mServiceTaskIds这些成员变量分别掌握了Service的Token,name,及任务id(通过token拿到的)。那岂不是已经在管理这些多个service了。至于附属于这个类起的名字,叫什么都无所谓。
以上可用如下流程图表示:

前面一直有个问题解释的不彻底,就是问题3,ServceManager是否担当了修改系统大管家ServiceManager的职责?接下来,我们就稍微了解下系统大管家ServiceManager是做什么的?(PS: ServiceManager和Binder机制一样,不是一天两个就能研究的清楚的)

认识ServiceManager

Android系统Binder机制的总管是ServiceManager,所有的Server(System Server)都需要向它注册,应用程序需要向其查询相应的服务。平时,我们在studio上的DDMS中调试程序时,下图这个就是ServiceManager

这里以Java层加入ServiceManager及getService为数据流分析一下。

复习一下典型的Binder模式,有利于后面的理解:
1、客户端通过某种方式得到服务器端的代理对象。从客户端角度看来代理对象和他的本地对象没有什么差别。它可以像其他本地对象一样调用其方法,访问其变量。
2、客户端通过调用服务器代理对象的方法向服务器端发送请求。
3、代理对象把用户请求通过Android内核(Linux内核)的Binder驱动发送到服务器进程。
4、服务器进程处理用户请求,并通过Android内核(Linux内核)的Binder驱动返回处理结果给客户端的服务器代理对象。
5、客户端收到服务器端的返回结果。

JAVA层代码分析:
ServiceManager.java (frameworks\base\core\java\android\os)

对于xxxManager获取服务端service基本如此用法:
举例:
利用ContextImpl.java中的 public Object getSystemService(String name)

然后再调用:ServiceManager.getService(ServiceName);获取相应的服务端

知道了客户端获取一个Service的方法之后,我们回到ServiceManager的服务端:

BinderInternal.getContextObject() @ BinderInternal.java 是一个native 函数:

android_os_BinderInternal_getContextObject @ android_util_Binder.cpp
返回一个 BinderProxy对象保存到类成员mRemote(ServiceManagerProxy类成员)

public abstract class ServiceManagerNative extends Binder implements IServiceManager
ServiceManagerNative 继承自 Binder 并实现了 IServiceManager 接口,利用 asInterface()则提供一个 ServiceManagerProxy 代理对象使用

class ServiceManagerProxy implements IServiceManager
定义了类ServiceManagerProxy(代理),ServiceManagerProxy继承自IServiceManager,并实现了其声明的操作函数,只会被ServiceManagerNative创建,它实现了IServiceManager的接口,IServiceManager提供了getService和addService两个成员函数来管理系统中的Service。

上面代码总结如下:Java层先利用Parcel对象将数据进行序列化,然后利用transact将数据传给binder驱动,就是上面mRemote.transact,mRemote在JNI层是一个叫BpBinder的对象:

JNI层代码分析:
android_util_Binder.cpp

每当我们利用BpBinder的transact()函数发起一次跨进程事务时,其内部其实是调用IPCThreadState对象的transact()。BpBinder的transact()代码如下:

到此,不再向下深究,具体想了解可以看Binder机制及IPC相关内容。
所以,到这把第2个问题彻底弄明白了,ServceManager和ServiceManager根本不是一回事。到次,Service的瞒天过海得以实现,接着,就是介绍时候说的那样无需修改源码,多进程,多service等功能。另外ContentProvider及BroadCast原理是类似,不再进行分析。
下篇将开始分析包管理(宿主插件和插件包名有什么规则),APK解析(为什么可以免安装),进程管理(能确保隐藏起来,不会在process轻易被kill)

第一时间获得博客更新提醒,以及更多android干货,源码分析,欢迎关注我的微信公众号,扫一扫下方二维码或者长按识别二维码,即可关注。

如果你觉得好,随手点赞,也是对笔者的肯定,也可以分享此公众号给你更多的人,原创不易

插件开发之360 DroidPlugin源码分析(五)Service预注册占坑相关推荐

  1. linux驱动开发之spi-omap-100k.c源码分析

    代码分析 对于linux的驱动代码来说,我们要从后往前分析: /** OMAP7xx SPI 100k controller driver* Author: Fabrice Crohas <fc ...

  2. 安全开发之w9scan扫描器源码学习

    安全开发之w9scan扫描器源码学习 工作流程 信息搜集 子域名扫描 w9scan中的子域名扫描实现 泛解析绕过 cms指纹识别 插件加载 插件格式 加载过程 基于爬虫的漏洞扫描 线程调度 w9sca ...

  3. Wangle源码分析:Service

    2019独角兽企业重金招聘Python工程师标准>>> 前言 Wangle中的Service代表一个远程服务(方法),熟悉RPC的朋友肯定知道这就是一个简单的RPC,当然,和一些常见 ...

  4. MPTCP 源码分析(五) 接收端窗口值

    简述: 在TCP协议中影响数据发送的三个因素分别为:发送端窗口值.接收端窗口值和拥塞窗口值. 本文主要分析MPTCP中各个子路径对接收端窗口值rcv_wnd的处理. 接收端窗口值的初始化 根据< ...

  5. 【Android 电量优化】JobScheduler 相关源码分析 ( ConnectivityController 底层源码分析 | 构造函数 | 追踪任务更新 | 注册接收者监听连接变化 )

    文章目录 一.ConnectivityController 连接控制器引入 二.ConnectivityController 构造方法解析 ( 注册接收者 ) 三.mConnectivityRecei ...

  6. 【转】ABP源码分析五:ABP初始化全过程

    ABP在初始化阶段做了哪些操作,前面的四篇文章大致描述了一下. 为个更清楚的描述其脉络,做了张流程图以辅助说明.其中每一步都涉及很多细节,难以在一张图中全部表现出来.每一步的细节(会涉及到较多接口,类 ...

  7. Mybatis-Spring源码分析(五) MapperMethod和MappedStatement解析

    前言 基本上这就是Mybatis-Spring源码的最后一篇了,如果想起来什么再单开博客.比起来Spring源码,Mybatis的确实简单一些,本篇就说一下Mybatis中两个十分重要的类Mapper ...

  8. Vue.js 源码分析(五) 基础篇 方法 methods属性详解

    methods中定义了Vue实例的方法,官网是这样介绍的: 例如:: <!DOCTYPE html> <html lang="en"> <head&g ...

  9. openstack-nova源码分析(五)flavor extra_specs 扩展属性

    Flavors extra-specs (flavors, os-flavor-extra-specs) Flavor 扩展属性设置, 扩展属性可以用来对虚拟机做一些额外的限制设置,具体的参数,将在后 ...

  10. iOS开发之Masonry框架-源码解析

    Masonry是iOS在控件布局中经常使用的一个轻量级框架.Masonry让NSLayoutConstraint使用起来更为简洁.Masonry简化了NSLayoutConstraint的使用方式,让 ...

最新文章

  1. 报名 | 面向智慧城市的人本尺度城市形态:理论、方法与实践讲座
  2. java个人学习笔记:javaBean
  3. 文巾解题 567. 字符串的排列
  4. (八)boost库之异常处理
  5. 闲话WPF之十(Dependency属性 [2] )
  6. java Date获取 年月日时分秒
  7. NCoreCoder.Aop详解
  8. ABP入门系列(1)——通过模板创建MAP版本项目
  9. 7 php 内存泄漏_PHP 内存泄漏分析定位
  10. 【转载】安装pip、pyinstaller并将py脚本打包成exe文件
  11. 【janino】janino 加载自定义函数
  12. eureka服务注册中心集群模式创建
  13. 上帝掷骰子吗--量子物理史话
  14. 三阶魔方中心块调整公式及助记方法
  15. win7加入网络计算机,win7怎么加入局域网连接
  16. linux添加mx记录,在C linux中查询MX记录
  17. 26设计模式之建造者模式
  18. 常用分辨率设置,RGB与CMYK_几何途行_新浪博客
  19. 项目对接支付宝支付,内网穿透实现监听支付宝的支付成功异步回调通知
  20. obs多推流地址_最热门直播工具OBS的下载和设置教程,值得一看

热门文章

  1. 使用JMH框架测试不同Java序列化/反序列化框架:优秀的protostuff,你值得拥有!
  2. vscode 单击跳转 ctrl+鼠标左键不能跳转到函数或变量的定义
  3. 智能锁行业安全分析报告
  4. 超声主瓣,旁瓣,栅瓣概念解析
  5. Mybatis下面的MapperScannerConfigurer 扫描器
  6. idea使用时遇到的一个小问题
  7. 使用 Apache 来限制访问 Confluence 6 的管理员界面
  8. python学习点滴记录-Day14-前端基础之javascript
  9. 委托和事件的一些理解笔记
  10. 利用 SQL Monitor 查看语句运行状态步骤