Android 开发之AMS服务执行流程

1、Activity的管理与生命周期执行机制

2、ActivityThread源码分析

3、Apk的启动流程与Activity启动机制

AMS 可以通过以下三个维度去看

一、Activity 启动过程可以说明AMS的作用
二、AMS与ActivityThread的交互关系 系统机制
三、hookams 启动Activity 会去调用哪些AMS

首先可以看一下Android 的启动流程
image.png

然后我们可以回顾以下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的启动过程图和流程图

image.png

image.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值