插件化之插件Service 新的Hook方法

本文同步自wing的地方酒馆

给大家分享一个新的Hook插件Service的方法,与Activity替换类似,可以先在AndroidManifest.xml预留一个service,然后通过intent启动,并且将真正的Service的classname传递过去。可是Service没有涉及到Instrumentation更没有Instrumentation.newService()方法,怎么办呢? 且听我细细道来。

观察Service的创建流程,发现我们只需要想办法拿到intent即可做一些手脚。大家都知道,创建Service的时候,会走到H类里:

他接收一个CreateServiceData类型的参数,恰好这个参数里面有intent参数:

那么能不能从这里下手呢,答案是否定的。因为data初始化的时候,并没有将intent传入,见下代码:

所以我们换一种思路,bind的时候,有没有intent呢?阅读源码得到以下信息:

哈哈,确实传进来了。所以我们可以在bind的时候,拿到真正要启动的classname,再bind的时候,把他给偷梁换柱! 具体怎么做呢。H类是个Handler,观察Handler内部有个callback,他可以在真正处理消息之前去做一些手脚,所以我们搞个callback给他干进去。

新建一个callback ,在里面把intent取出:

由于是基于bind的,所以要看一下之后做了什么,观察handleBindService方法,可以发现bind的时候service是已经创建好了的,并且存在一个名为mService的ArrayMap里。key为token ,IBinder:

所以要做的事情就很明了了,他不是从这里取吗,那我们就给他替换掉呀,所以把mService取出来:

此时我拥有bind的msg里面包含了intent、token等等信息,所以只要把对应key的value替换掉即可。在intent里拿到真正的service class name,用classloader加载,此时service已经创建完毕了,但是还没有初始化。

观察系统service初始化过程,发现还需要context.setOuter attch等操作:

所以我们来手动模拟这个过程:

attach方法全部参数设置为原本service自带的参数。这里只是改变了实例。初始化完毕之后,发现还需要进行binder通信

所以反射调用他,然后因为是在bind的时候做的手脚,所以service丢失了onCreate()这个生命周期,所以手动调用他:

这样就完成了Service的插件操作~~

欢迎加入我的Android酒馆:425983695 讨论技术~~

时间: 2024-10-05 14:29:32

插件化之插件Service 新的Hook方法的相关文章

软件插件化,大势所趋新势力

英特尔公司总裁安迪·格罗夫说,创新是唯一出路,淘汰自己,否则竞争将淘汰我们. 国际知名软件开发公司负责人表示,产品的插件化,模块化,无疑是未来产品研发的趋势之一. 2011年,360浏览器开放平台推出购物插件,用户安装插件后,便可轻轻松松实现购物比价返利.坐拥数千万流量的360推出的购物插件,其使用者之众,给淘宝带来了很大的影响.最后淘宝不得不与360及时做了沟通,才勉强平息了事件. 但购物插件的推广趋势,却凭借此次事件的东风不可逆转,且以迅雷不及掩耳之势席卷了各大浏览器.短短几个月过后,购物助

android 广播的插件化

------本文转载自 Android插件化原理解析--广播的管理 这一系列的文章实在是写的好! 1, 概述 为了实现Activity的插件化我们付出了相当多的努力:那么Android系统的 其他组件,比如BroadcastReceiver,Service还有ContentProvider,它们又该如何处理呢? 相比Activity,BroadcastReceiver要简单很多--广播的生命周期相当简单:如果希望插件能够支持广播,这意味着什么? 回想一下我们日常开发的时候是如何使用Broadca

Android插件化原理(一)Activity插件化

Android深入四大组件系列 Android解析AMS系列 Android解析ClassLoader系列 前言 四大组件的插件化是插件化技术的核心知识点,而Activity插件化更是重中之重,Activity插件化主要有三种实现方式,分别是反射实现.接口实现和Hook技术实现.反射实现会对性能有所影响,主流的插件化框架没有采用此方式,关于接口实现可以阅读dynamic-load-apk的源码,这里不做介绍,目前Hook技术实现是主流,因此本篇文章主要介绍Hook技术实现. Hook技术实现主要

怎样将「插件化」接入到项目之中?

本期移动开发精英社群讨论的主题是「插件化」,上网查了一下,发现一篇 CSDN 博主写的文章<Android 使用动态载入框架DL进行插件化开发>.此处引用原作者的话: 随着应用的不断迭代,应用的体积不断增大,项目越来越臃肿,冗余添加.项目新功能的加入,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,仅仅能紧急公布补丁版本号,强制用户进行更新.结果频繁的更新.反而easy减少用户使用黏性,或者是公司业务的不断发展,同系的应用越来越多,传统方式须要通过用户量最大的主项目进行引导下载并安装.

RN学习1——前奏,app插件化和热更新的探索

react_native_banner-min.png React Native(以下简称RN)有大量前端开发者的追捧.前端开发是一个活跃的社区,一直尝试着一统前后端,做一个全栈开发,RN就是他们在客户端领域的尝试. 说是从零开始,但其实我还是懂一点点JS代码的,而且算是一个有经验的iOS.Android开发,对很多js和native交互的细节和特性还算了解,在QDaily里面也做过好多hybird的尝试,还经常用JSPatch做hotfix,总的来说,就是对hot update.插件化以及hy

如何将「插件化」接入到项目之中?

本期移动开发精英社群讨论的主题是「插件化」,上网查了一下,发现一篇 CSDN 博主写的文章<Android 使用动态加载框架DL进行插件化开发>.此处引用原作者的话: 随着应用的不断迭代,应用的体积不断增大,项目越来越臃肿,冗余增加.项目新功能的添加,无法确定与用户匹配性,发生严重异常往往牵一发而动全身,只能紧急发布补丁版本,强制用户进行更新.结果频繁的更新,反而容易降低用户使用黏性,或者是公司业务的不断发展,同系的应用越来越多,传统方式需要通过用户量最大的主项目进行引导下载并安装.怎么办?这

Android热修复与插件化实践之路

第1章 class文件与dex文件解析本章通过从java最基本的class文件与android最基本的dex文件进行对比,并不借助IDE去生成及执行class与dex文件,通过讲解class与dex的手动生成,执行, 格式对比,让学生明白二者的相同与不同.1-1 课程项目整体介绍1-2 本章概述1-3 class文件详解上1-4 class文件详解下1-5 dex文件详解上1-6 dex文件详解下 第2章 虚拟机深入讲解本章主要介绍jvm,dvm,art.通过对这三个虚拟机的介绍让学生明白,an

插件化知识详细分解及原理 之代理,hook,反射

上一篇我们说了Binder机制,通过aidl的demo和系统源码的对比进行了运行过程的分析,这一篇我们说代理模式及反射,之前说过了,只是为了梳理插件化需要了解的知识点,所以不会特别深的去讲解. 代理模式: 也叫做委托模式,分为静态代理和动态代理.代理模式也是平时比较常用的设计模式之一,代理模式有代码简洁,高扩展性的特性.主要目的就是为访问者提供一个代理,以达到限制某个对象的访问,也就是说想访问一个对象,其实我给你的是一个代理,不让你直接使用我.估计不理解的人会问为什么使用代理模式,他限制了对象的

小白也能看懂的插件化DroidPlugin原理(二)-- 反射机制和Hook入门

前言:在上一篇博文<小白也能看懂的插件化DroidPlugin原理(一)-- 动态代理>中详细介绍了 DroidPlugin 原理中涉及到的动态代理模式,看完上篇博文后你就会发现原来动态代理真的非常简单,只不过就是实现一个 InvocationHandler 接口重写一下 invoke 方法而已.不错,其实很多看似 high level 的技术都并没有想象中的那么晦涩难懂,只要你肯下定决心去了解它,去认识它,去学习它你就会发现,原来都是可以学得懂的.本篇博文将介绍 DroidPlugin 框架