1、Activity的管理与生命周期执行机制
2、ActivityThread源码分析
3、Apk的启动流程与Activity启动机制
AMS 可以通过以下三个维度去看
一、Activity 启动过程可以说明AMS的作用
二、AMS与ActivityThread的交互关系 系统机制
三、hookams 启动Activity 会去调用哪些AMS
首先可以看一下Android 的启动流程
然后我们可以回顾以下Activity 的启动流程,打开一个应用程序时,第一眼看到的并不是主程序的界面,而是一个类似欢迎的界面,它叫SplashActivity。
当我们用startActivity启动一个apk或者一个Activity的时候,会调用Activity类里的startActivity重载方法,接着又调用了startActivityForResult方法,里面启动Activity的代码如下(API30)
mInstrumentation.execStartActivity(
this, mMainThread.getApplicationThread(), mToken, who,
intent, requestCode, options);
然后就会调用Instrumentation的startActivity,里面真正的启动代码如下:
int result = ActivityTaskManager.getService().startActivity(whoThread,
who.getBasePackageName(), who.getAttributionTag(), intent,
intent.resolveTypeIfNeeded(who.getContentResolver()), token,
target != null ? target.mEmbeddedID : null, requestCode, 0, null, options);
getService()会返回一个IActivityManager接口的对象,就是我们所说的AMS,他是SystemService里面的一个服务
Hook技术
Hook英文翻译过来就是“钩子”的意思,那么我们在什么时候使用这个钩子呢?
答:在Android操作系统中系统维护着自己的一套事件分发机制。应用程序,包括应用出发事件和后台逻辑处理,也是根据事件流程一步步地向下执行。而“钩子”的意思,就是事件传送到终点前截获并监控事件的传输,像个钩子钩上事件,并且能够在钩上事件时,处理一些自己特定的事件。
Hook 钩子一定是静态的 或者是对象,静态的只有一份,我们可以反射拿到
如何寻找Hook点
一. Hook选择的关键点
二. Hook的选择点:尽量静态变量和单例,因为一旦创建对象,它们不容易变化,非常容易定位
三. Hook过程
1、寻找Hook点,原则是尽量静态变量或者单例对象,尽量Hook public的对象和方法
2、选择合适的代理方式,如果是接口可以用动态代理
3、 偷梁换柱-- 用代理对象替换原始对象
四. Android 的 API 版本比较多,方法和类可能不一样,所以要做好API的兼容工作。
最后附上APK的启动过程图和流程图