标签:完成 shadow activity 属性 color ui线程 min 字符 位置
需要相关资料的朋友,可以【加入此处即可打包获取】Hook的英文含义是钩子,你可以理解为用钩子把要Hook的对象勾过来,然后再把替换的对象送回去。Hook其实就是把原来的对象替换成仿造的对象,还有就是必须拿到当前对象里的某个属性进行Hook,否则你的hook是失败的,没有意义的。
1.先定义两个活动界面,完成跳转,如下图所示。
2.要实现跳转需要调用startActivity这个方法,此时就需要代理这个startActivity方法。查看一下它的底层源码找它的相关实现,真正启动活动界面是由execstarActivities去完成的,而它又是被mInstrumentation调用,如下图所示。
3.要找到它的定义位置,发现mInstrumentation没有相应的接口,需要通过继承的方式来实现,也就是通过静态代理来实现,如下图所示。
4.声明一个tag日志信息以及需要代理的类,代理的类就是找到真正启动activity的那个类,如下图所示。
5.定义ActivityThread里面原始的Instrumentation对象,千万不能写成mInstrumentation,否则会抛出异常。
6.通过构造函数来传递对象,如下图所示。
7.定义一个方法,这个方法是由于原始方法里面的Instrumentation有execStartActivity方法来定的,此方法需要相关参数,如下图所示。
8.打印activity启动前后的日志信息,修改相应的参数信息,如下图所示。
9.调用的方法在底层是隐藏的,需要反射来进行调用,所以先找到这个方法,然后把他设置可见,如下图所示。
10.准备完成以后,在MainActivity进行代理,在Application程序的入口点进行代理的代码书写。
11.在Application定义一个线程和其他一些字符串,如下图所示。
12.接着根据包名加类名去获取当前的ActivityThread对象、主线程(UI线程),设置显示获取到以后进行调用,如下图所示。
13.拿到在ActivityThread类里面的原始mInstrumentation对象,如下图所示。
14.构建代理对象,进行静态代理,如下图所示。
15.通过反射换掉字段,注意是反射代码,不是Instrumentation里面的方法,如下图所示。
16.做个标记,方便后面查看,如下图所示。
17.运行完毕查看日志是否HOOK成功,成功代理startActivity并且打印相关的内容参数,如下图所示。
标签:完成 shadow activity 属性 color ui线程 min 字符 位置
原文地址:https://blog.51cto.com/15002917/2564096