VirtualApk源码分析

  • 时间:
  • 浏览:2
  • 来源:uu快3app娱乐_uu快3辅助_官方网址

PulginManager.hookSystemServices

LocalService.onStartCommand首先反射创建插件Service对象,返回反射调用了其attach土办法,最后调用了Service.onCreate,原本就完成了startService启动插件Service的插件化。

bindService流程

ActivityThread.handleBindService

startService中会调用startDelegateServiceForTarget:

这一Service土办法的插件化之类 ,可自行分析。

1、Hook掉AMS的startService bindService等函数

InnerConnection

hookSystemService会替换掉当前守护线程池池的AMS本地代理,实现了当时人的ActivityManagerProxy

通过hook掉AMS启动Service相关的土办法,不可能 发现是启动插件的Service,就将目标Service转化为宿主占坑的Service,再由宿主占坑Service实现代理转发,在宿主Service中反射加载插件Service的实例,并调用其对对应的土办法,这里以LocalService为例,描述下整个流程:

InnerConnection是Binder Service端的存根,返回给Binder Client端进行跨守护线程池池调用的,在bindService的以前将InnerConnection对象传送给AMS,原本AMS就必须跨守护线程池池调用bindService调用方的ServiceConnection。这一点和ApplicationThread以及广播的IIntentReceiver如出一辙。

mIServiceConnection的实现类是InnerConnection:

ContextImpl.bindServiceCommon首先调用mPackageInfo.getServiceDispatcher获取IServiceConnection对象,IServiceConnection是个Binder类型,具体内容如下:

mPackageInfo.getServiceDispatcher

在bindServiceLocked函数中,判断否是是是AUTO_CREATE,不可能 是,就调用bringUpServiceLocked启动Service并触发Service.onCreate,而且再requestServiceBindingLocked:

其中wapperTargetIntent将启动插件Service的Intent转为启动宿主占坑Service:

其中mIServiceConnection是在ServiceDispatcher中赋值的:

ServiceDispatcher构造函数

ServiceDispatcher.doConnected最终调用了ServiceConnection.onServiceConnectioned,并传入第三步中s.onBind的返回值。

ActivityThread.handleBindService首先从mServices中取出要Binde的service(在第二步bindServiceLocked函数中会创建Service对象并保存),取到以前就调用s.onBind土办法获取当前Service返回给远程bindService调用方的binder对象,最后调用AMS.plublishService,并将s.onBind传过去,该值最终会传给bindService的ServiceConnection.onServiceConnected中。

ActiveServices.publishServiceLocked

ActiveServices.publishServiceLocked中调用了c.conn.connected,c.conn只要第一步中创建的InnerConnection对象,c.conn.connected会调用ServiceDispatcher.doConnected:

创建完IServiceConnection后就调用AMS的bindService并传入IServiceConnection对象。

ActivityManagerProxy.invoke

ServiceDispatcher.doConnected

mPackageInfo.getServiceDispatcher中先创建了ServiceDispatcher,并传入bindService调用方的ServiceConnection,返回调用ServiceDispatcher.getIServiceConnection:

4、AMS.publishService-->ActiveServices.publishServiceLocked

2、LocalService的处里

ActivityManagerProxy hook调用Service相关的土办法,这里以startService为例:

VitualApk在实现Service插件化的以前依然是采用的宿主占坑的方案,通过在宿主实现占坑的LocalService和RemoteService,

5、bindService的调用以AMS.serviceDoneExecuting收尾。

占坑Service

requestServiceBindingLocked会调用ApplicationThread.scheduleBindService

1、Activity.bindService-->ContextImpl.bindService-->ContextImpl.bindServiceCommon

2、AMS.bindService-->ActiveServices.bindServiceLocked-->ActiveServices.requestServiceBindingLocked

LocalService.onStartCommand

第一步将启动插件Service的Intent转为了启动宿主占坑的LocalService,LocalService中会实现代理转发。LocalService.onStartCommand包含如下代码:

ActivityManagerProxy .startService

ServiceDispatcher.getIServiceConnection

3、ApplicationThread.scheduleBindService-->ActivityThread.handleBindService

ContextImpl.bindServiceCommon

android启动Service有本身土办法,本身是startService,还本身是bindService,关于startService的启动流程必须参照https://www.jianshu.com/p/fd31917c518a ,bindService的运行流程如下所示:

requestServiceBindingLocked

startDelegateServiceForTarget

wapperTargetIntent

猜你喜欢

三星w2018组装机怎么样?能不能买?

 我来答为你推荐:可选中三个 多多或多个下面的关键词,搜索相关资料。也可直接点“搜索资料”搜索整个问题。你对你你这种回答的评价是?本回答被提问者采纳展开完整篇 展开完整篇

2020-03-22

2018上半年电信三大运营商净利多少?

财报显示,上四天,中国移动净利润656.41亿元,同比增长4.7%;中国联通净利润25.8亿元,同比增长231.8%;中国电信净利润135.7亿元,同比增长8.1%。 经计算,

2020-03-22

为何风口过去之后,百果园反而要在无人零售上发力?

一次未果的试水百果园办公室无人货架尝试为啥悄然停止?這個次的无人零售,和上一次哪些不同?对百果园的整体战略来说,这次的无人零售尝试,又扮演着如保的角色?针对以上难题,百果园无人

2020-03-22

[LeetCode] Number of 1 Bits 位1的个数

本文转自博客园Grandyang的博客,原文链接:[LeetCode]Numberof1Bits位1的个数,如需转载请自行联系原博主。Forexample,the32-biti

2020-03-22

想买个thinkpad,那款的性价比高点。资金4k左右。

有点痛 推荐联想集团是1984年中科院计算所投资十五万元人民币,由11名科技人员创办,是一家在信息产业内多元化发展的大型企业集团,充足创新性的国际化的科技公司。从1996年刚

2020-03-22