1.前言
本文大部分内容来自于《android进阶解密》这本书,不同的是书中实现的是android9.0之前的hook,在android9.0中,activity的启动过程会有些不同,因此本文主要是讲解9.0的hook.
2.activiy启动流程的不同之处
1.简要分析不同之处
在android9.0中,采用handler机制启动activity时,消息标识变为了EXECUTE_TRANSACTION
,和之前的LAUNCH_ACTIVITY
不同,并且msg
携带的内容也不同,从这里可以看到ClientTransaction transaction=msg.obj
和之前msg携带的ActivityRecord
参数不同,transaction
里边并没有Intent
这个类型的变量
那么我们能像书上一样在此hook吗?
答案是可以的,为什么没有intent也能hook呢?看下边分析
我们沿着调用链一直深入,mTransactionExecutor.execute(transaction)
接着调用executeCallbacks(transaction)
方法
在executeCallback
方法中,调用item.execute
方法,这个item为
final List<ClientTransactionItem> callbacks = transaction.getCallbacks();
···
final ClientTransactionItem item = callbacks.get(i);
那么这个item的类型为ClientTransactionItem
,这是个抽象类,必须找到它的一个实现类,还记得这个callback
吗?在activity的启动流程中,在ActivityStackSupeisor
中的realStartActivityLocked()
方法中