Actiivity启动流程
- 通过AMS代理对象调用transact函数,将请求参数data写入binder驱动。通过binder驱动将请求 参数data转发给AMS。
- AMS在回调函数onTransact中收到data和code。然后判断activity所在进程是否启动,并且是否向自己注册ApplicationThread。如果满足就调用realStartActivityLocked(),真正启动Activity,不满足先启动进程再启动Activity。
- entryPont 入口函数的java类。
- Process.start(entryPoint) 发起一个启动进程的请求,进程启动后,会执行entryPoint的main函数。进程启动以后会返回进程的Pid。
- mHandler.sendMessageDelayed() 如果应用程序超时没有向AMS报告,AMS会清理应用程序的相关信息(比如要启动的组件)。
- openZygoteSocketIfNeeded 打开通往zygote的Socket。
- zygoteSendArgsAndGetResult 发送启动进程参数并接受返回结果。
- handleChildProc 在子进程里面启动binder机制,调用子进程的入口函数。
- 在父进程里面通过handlerParentProc向AMS通过socket返回子进程的Pid。
- 入口函数做了3件事,1 准备好Loop,2 向AMS报告(将binder句柄注册到AMS),3 开启loop循环。
- topRunningActivityLocked函数获得堆栈顶端的Activity,这里就是MainActivity了。
- sendMessage 发送消息到主线程。
- LoadedApk就是用来描述已加载的APK文件。
总结:
- 点击桌面App图标,Launcher进程采用Binder
- IPC向system_server进程发起startActivity请求;
- system_server进程接收到请求后,向zygote进程发送创建进程的请求;
- Zygote进程fork出新的子进程,即App进程;
- App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
- system_server进程在收到请求后,进行一系列准备工作后,再通过binder
- IPC向App进程发送scheduleLaunchActivity请求;
- App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
- 主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。
Hook-Activity启动
ActivityThread的performLaunchActivity方法,在这个方法里面进行activity的创建和生命周期的回调,这里调用了mInstrumentation.newActivity所以这里进行提换成我们插件的activity就可以,这里有个类加载器也必须使用插件的。