11在了解系统的activity,service,broadcastReceiver的启动过程后,今天将分析下360 DroidPlugin是如何预注册占坑的?本篇文章主要分析Service预注册占坑,Service占了坑后又是什么时候开始瞒天过海欺骗AMS的?先看下Agenda:
22
3- - ** AndroidMainfest .xml中概览**
3+ - ** AndroidManifest .xml中概览**
44- ** Service中关键方法被hook时机**
55- ** startService被hook**
66- ** 瞒天过海流程图**
@@ -30,19 +30,19 @@ replaceFirstServiceIntentOfArgs()
3030
3131![ 这里写图片描述] ( http://img.blog.csdn.net/20160821025241211 )
3232
33- stopService,bindService,unbindService,setServiceForeground都是类似逻辑,可从源码中证实。
34- 在前一篇[ 《插件开发之360 DroidPlugin源码分析(四)Activity预注册占坑》] ( http://blog.csdn.net/hejjunlin/article/details/52258434 ) ,我们曾了解到,8个进程中的service在预注册占坑,在AndroidManifest.xml中只有一个,那如果插件要启动多个service怎么办?这是第一个问题,而我们知道所有和服务相关的都要在系统的systemServer进程中进行注册,难道DroidPlugin要逆天的本事?这是第二个问题
35- 我们从代码中发现有一个ServceManager,这和android系统中大管家ServiceManager相差一个i,难道要改大管家的职责?又多了一个疑惑
33+ stopService,bindService,unbindService,setServiceForeground都是类似逻辑,可从源码中证实。
34+ 在前一篇[ 《插件开发之360 DroidPlugin源码分析(四)Activity预注册占坑》] ( http://blog.csdn.net/hejjunlin/article/details/52258434 ) ,我们曾了解到,8个进程中的service在预注册占坑,在AndroidManifest.xml中只有一个,那如果插件要启动多个service怎么办?这是第一个问题,而我们知道所有和服务相关的都要在系统的systemServer进程中进行注册,难道DroidPlugin要逆天的本事?这是第二个问题
35+ 我们从代码中发现有一个ServceManager,这和android系统中大管家ServiceManager相差一个i,难道要改大管家的职责?又多了一个疑惑
3636仔细看了下ServceManager中的代码:
3737
3838![ 这里写图片描述] ( http://img.blog.csdn.net/20160821025303415 )
3939![ 这里写图片描述] ( http://img.blog.csdn.net/20160821025323853 )
4040![ 这里写图片描述] ( http://img.blog.csdn.net/20160821025349024 )
4141
42- 以上代码可总结为:(以虚线分上下两部分)
43- 1.上部分主要是ServceManager单例及有一个handleXXX相关的方法,下部分主要是Service的一些生命周期方法。
44- 2.我们基本可以确定之前问题2和问题3的答案了,没有那么逆天的本事来操作ServiceManager,也不能修改大管家ServiceManager的职责
45- 3.那问题又来了,这个类到底是做啥的?还起一个叫ServceManager的名字,
42+ 以上代码可总结为:(以虚线分上下两部分)
43+ 1.上部分主要是ServceManager单例及有一个handleXXX相关的方法,下部分主要是Service的一些生命周期方法。
44+ 2.我们基本可以确定之前问题2和问题3的答案了,没有那么逆天的本事来操作ServiceManager,也不能修改大管家ServiceManager的职责
45+ 3.那问题又来了,这个类到底是做啥的?还起一个叫ServceManager的名字,
4646以hanldeOnTaskRemoveOne方法为例看看:
4747
4848![ 这里写图片描述] ( http://img.blog.csdn.net/20160821025410931 )
@@ -72,18 +72,18 @@ Android系统Binder机制的总管是ServiceManager,所有的Server(System S
7272
7373这里以Java层加入ServiceManager及getService为数据流分析一下。
7474
75- 复习一下典型的Binder模式,有利于后面的理解:
76- 1、客户端通过某种方式得到服务器端的代理对象。从客户端角度看来代理对象和他的本地对象没有什么差别。它可以像其他本地对象一样调用其方法,访问其变量。
77- 2、客户端通过调用服务器代理对象的方法向服务器端发送请求。
78- 3、代理对象把用户请求通过Android内核(Linux内核)的Binder驱动发送到服务器进程。
79- 4、服务器进程处理用户请求,并通过Android内核(Linux内核)的Binder驱动返回处理结果给客户端的服务器代理对象。
75+ 复习一下典型的Binder模式,有利于后面的理解:
76+ 1、客户端通过某种方式得到服务器端的代理对象。从客户端角度看来代理对象和他的本地对象没有什么差别。它可以像其他本地对象一样调用其方法,访问其变量。
77+ 2、客户端通过调用服务器代理对象的方法向服务器端发送请求。
78+ 3、代理对象把用户请求通过Android内核(Linux内核)的Binder驱动发送到服务器进程。
79+ 4、服务器进程处理用户请求,并通过Android内核(Linux内核)的Binder驱动返回处理结果给客户端的服务器代理对象。
80805、客户端收到服务器端的返回结果。
8181
82- JAVA层代码分析:
82+ JAVA层代码分析:
8383ServiceManager.java (frameworks\base\core\java\android\os)
8484
85- 对于xxxManager获取服务端service基本如此用法:
86- 举例:
85+ 对于xxxManager获取服务端service基本如此用法:
86+ 举例:
8787利用ContextImpl.java中的 public Object getSystemService(String name)
8888
8989![ 这里写图片描述] ( http://img.blog.csdn.net/20160821025616886 )
@@ -98,20 +98,20 @@ ServiceManager.java (frameworks\base\core\java\android\os)
9898
9999BinderInternal.getContextObject() @ BinderInternal.java 是一个native 函数:
100100
101- android_os_BinderInternal_getContextObject @ android_util_Binder.cpp
101+ android_os_BinderInternal_getContextObject @ android_util_Binder.cpp
102102返回一个 BinderProxy对象保存到类成员mRemote(ServiceManagerProxy类成员)
103103
104- public abstract class ServiceManagerNative extends Binder implements IServiceManager
104+ public abstract class ServiceManagerNative extends Binder implements IServiceManager
105105ServiceManagerNative 继承自 Binder 并实现了 IServiceManager 接口,利用 asInterface()则提供一个 ServiceManagerProxy 代理对象使用
106106
107- class ServiceManagerProxy implements IServiceManager
107+ class ServiceManagerProxy implements IServiceManager
108108定义了类ServiceManagerProxy(代理),ServiceManagerProxy继承自IServiceManager,并实现了其声明的操作函数,只会被ServiceManagerNative创建,它实现了IServiceManager的接口,IServiceManager提供了getService和addService两个成员函数来管理系统中的Service。
109109
110110![ 这里写图片描述] ( http://img.blog.csdn.net/20160821025721230 )
111111
112112上面代码总结如下:Java层先利用Parcel对象将数据进行序列化,然后利用transact将数据传给binder驱动,就是上面mRemote.transact,mRemote在JNI层是一个叫BpBinder的对象:
113113
114- JNI层代码分析:
114+ JNI层代码分析:
115115android_util_Binder.cpp
116116
117117![ 这里写图片描述] ( http://img.blog.csdn.net/20160821025737074 )
@@ -120,7 +120,6 @@ android_util_Binder.cpp
120120
121121![ 这里写图片描述] ( http://img.blog.csdn.net/20160821025803184 )
122122
123- 到此,不再向下深究,具体想了解可以看Binder机制及IPC相关内容。
124- 所以,到这把第2个问题彻底弄明白了,ServceManager和ServiceManager根本不是一回事 。到次,Service的瞒天过海得以实现,接着,就是介绍时候说的那样无需修改源码,多进程,多service等功能。另外ContentProvider及BroadCast原理是类似,不再进行分析。
123+ 到此,不再向下深究,具体想了解可以看Binder机制及IPC相关内容。
124+ 所以,到这把第2个问题彻底弄明白了,ServiceManager和ServiceManager根本不是一回事 。到次,Service的瞒天过海得以实现,接着,就是介绍时候说的那样无需修改源码,多进程,多service等功能。另外ContentProvider及BroadCast原理是类似,不再进行分析。
125125下篇将开始分析包管理(宿主插件和插件包名有什么规则),APK解析(为什么可以免安装),进程管理(能确保隐藏起来,不会在process轻易被kill)
126-
0 commit comments