面试:插件化相关---activity

news2024/11/27 2:28:39

我们先来看下Android常规Activity的启动流程

如何评价360的Android插件化框架RePlugin? - 知乎

1、调用Context.startActivity -> ActivityManagerProxy -> AMS, AMS通过Intent从PMS拿到ActivityInfo并创建ActivityRecord和token放入前台ActivityStack,接着按需启动Activity所属进程

2、进程启动后,马上执行入口ActivityThread.main并调用attachApplication将启动信息反馈到AMS,AMS通过pid找到对应的ProcessRecord并更新其数据

3、从前台ActivityStack中拿到栈顶的ActivityRecord,如果其proecssrecord为null,并且uid和processname跟新创建的ProcessRecord一致,则正式调用app.thread.scheduleLaunchActivity

4、ActivityThread在scheduleLaunchActivity中创建ActivityClientRecord,用于跟AMS中的ActivityRecord对应,ActivityClientRecord最重要的两个字段是token和activityinfo,token用于关联ActivityRecord,activityinfo则包含activity的描述和所属包等信息

5、在scheduleLaunchActivity内部接着发送LAUNCH_ACTIVITY message到mH这个handler,mH收到LAUNCH_ACTIVITY message后执行handleLaunchActivity

请求阶段:

ActivityManagerProxy是ActivityManagerService在app进程中的Binder代理对象。调用ActivityManagerProxy.startActivity()最后会调用ActivityManagerService.startActivity()。这样请求就到了ActivityManagerService

响应阶段:

在不考虑多进程的情况下,Activity的启动过程是一个Binder双向通信的过程。AMS要主动与app进程通信要依靠请求启动Activity阶段传过来的IBinder对象,这个IBinder对象就是上面介绍过的Instrumentation.execStartActivity()中的 whoThread对象,它实际上是一个ApplicationThreadProxy对象,用来和ApplicationThread通信。AMS通知app进程启动Activity是通过调用ApplicationThreadProxy.scheduleLaunchActivity()完成的。根据Binder通信,ApplicationThread.scheduleLaunchActivity()会被调用。

  1. scheduleLaunchActivity()将从AMS中传过来的参数封装成ActivityClientRecord对象,然后将消息发送给mH,mH是一个Handler对象。
  2. H是ActivityThread的内部类,继承自Handler,它在收到LAUNCH_ACTIVITY的消息后,会调用ActivityThread.handlerLaunchActivity()。
  3. handleLaunchActivity()主要调用了两个方法:performLaunchActivity()和handleResumeActivity()。performLaunchActivity()会完成Activity的创建,以及调用Activity的onCreate()、onStart()等方法。handleResumeActivity()会完成Activity.onResume()的调用。

假如在插件中有一个未在AndroidManifest.xml注册的TargetActivity,我们想启动它,可以分为三步。Activity启动流程和插件化原理 - 掘金

  1. 在AndroidManifest.xml中预先注册一个我们项目中没有的Activity,例如ProxyActivity。我们把这种行为称为插桩。
  2. 在请求启动Activity阶段,我们把TargetActivity替换成AndroidManifest中预先注册的ProxyActivity。
  3. 在AMS响应阶段,Activity实例产生之前,我们再做一个完全相反的动作。即把响应信息中要启动的ProxyActivity替换回TargetActivity。

第一步十分简单,没什么好说的。要实现第二步和第三步就需要用到Activity启动流程的知识了。 在Activity启动流程中,Instrumentation无论在请求阶段还是响应阶段都扮演着重要的角色。在请求阶段Instrumentation.execStartActivity()会被调用,而在响应阶段Instrumentation.newActivity()会被调用。因此如果我们可以Hook Instrumentation,那么我们就可以在execStartActivity()和newActivity()分别完成第二步和第三步中的功能。

最终目的:Hook Instrumentation

1、通过反射替换ActivitThread的Instrumentation

2、Instrumentation.execStartActivity()执行前将我们要启动的Activity替换成预注册的ProxyActivity

3、在Instrumentation.newActivity()执行前将预注册的ProxyActivity替换回我们要启动的Activity

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/48022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

macOS端React的项目WebPack热更新(HMR)失效问题分析及解决,原因竟是Windows文件系统不区分大小写导致

项目场景: 最近做的项目是一个使用UmiJS搭建的React的前端老项目,项目是上一个开发团队遗留下来的老项目,我们接着在原来的基础上开发。团队成员中有的是Windows电脑,有的是Mac电脑,所以存在规范不统一的情况。 问题描…

[附源码]计算机毕业设计springboot基于web的建设科技项目申报管理系统

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: SSM mybatis Maven Vue 等等组成,B/S模式 M…

微服务框架 SpringCloud微服务架构 5 Nacos 5.6 环境隔离

微服务框架 【SpringCloudRabbitMQDockerRedis搜索分布式,系统详解springcloud微服务技术栈课程|黑马程序员Java微服务】 SpringCloud微服务架构 文章目录微服务框架SpringCloud微服务架构5 Nacos5.6 环境隔离5.6.1 环境隔离 - namespace5.6.2 使用 namespace5.6.…

Python的PyQt框架的使用-创建主窗体篇

Python的PyQt框架的使用-构建环境篇一、前言二 、创建主窗体一、前言 个人主页: ζ小菜鸡大家好我是ζ小菜鸡,小伙伴们,让我们一起来学习Python的PyQt框架的使用。如果文章对你有帮助、欢迎关注、点赞、收藏(一键三连) 二 、创建主窗体 (1&am…

【Linux】高频指令及简单的vim使用(0基础带你快速入门)

目录 一、目录操作指令 1.1、ls 1.2、pwd 1.3、cd 1.4、touch 1.5、cat 1.6、echo 1.7、mkdir 1.8、rm 1.9、mv 1.10、cp 二、Linux中如何手动安装插件 三、vim 3.1、打开文件 3.2、编辑文件 3.3、保存退出 一、目录操作指令 1.1、ls 语法: 第一种&#…

高维多元时序数据之间的相似性度量

1. 简介 时间序列作为一种按时间顺序排列的特殊数据,是数据挖掘的重要研究内容,其中包括数据准备、数据选择、数据预处理、数据缩减、数据挖掘目标确定、挖掘算法确定、数据挖掘、模式解释及知识评价9个处理步骤W。数据挖掘方面的…

@SentinelResource注解的使用

SentinelResource注解的使用 1、按资源名称限流后续处理 前置条件&#xff1a; 启动Nacos启动Sentinel 1.1、修改cloudalibaba-sentinel-service8401 引入自己的API通用包 <!--自己的公共包,可以使用Payment支持Entuty--> <dependency><groupId>com.zcl.s…

word目录怎么自动生成?用这个方法,快速自动生成

当我们在写论文或者是编写文档的时候&#xff0c;都需要生成导航目录。很多人写完文档之后想要将其自动生成目录&#xff0c;但是不知道该怎么操作&#xff1f;word目录怎么自动生成&#xff1f;下面我就为大家分享三个步骤&#xff0c;快速自动设置文档的目录。 操作环境&…

SpringBoot配置文件

文章目录配置文件的作用配置文件的格式.properties 配置文件说明.properties 基本语法.properies 读取配置信息.yml 配置说明.yml 基本语法.yml 进阶使用.yml 读取配置信息.properties VS .yml配置文件的作用 整个项目中所有重要的数据都是在配置⽂件中配置的&#xff0c;比如…

社区系统项目复盘-6

文章目录什么是Elasticsearch&#xff1f;Spring是怎么整合Elasticsearch的&#xff1f;开发社区搜索功能Elasticsearch实现全文搜索功能什么是Elasticsearch&#xff1f; Elasticsearch简介 一个分布式的、Restful风格的搜索引擎支持对各种类型的数据的检索搜索速度快&#xf…

FSR-Unity-URP 1.0 的性能和兼容性问题

1&#xff09;FSR-Unity-URP 1.0 的性能和兼容性问题 ​2&#xff09;计算大文件MD5耗时问题 3&#xff09;如何监听Unity即将Reload Script 4&#xff09;如何对Unity游戏的Android崩溃和ANR问题进行符号化解析 这是第315篇UWA技术知识分享的推送。今天我们继续为大家精选了若…

2022年GPS广播星历精密星历如何下载

注意&#xff1a;&#xff01;&#xff01;网上现有很多教程的星历下载地址 ftp://cddis.gsfc.nasa.gov/已经访问不了了&#xff0c;最新的方法见下文&#xff0c;亲测有效~ 1、星历下载网址&#xff08;需要注册一下&#xff09;Earthdata Loginhttps://cddis.nasa.gov/archiv…

我的居家生活--爱摸鱼的美工(二)

-----------作者&#xff1a;天涯小Y 这失败的拉花叫”海上升明月” 呜一 做自己&#xff0c;不太好也没关系 我给自己居家的时间不多了 11月30日我决定”解封” 从身心开始&#xff0c;愿脚步跟上 突如其来的“银丝” 让我沮丧 黑芝麻的疗法因快递又安排不上 算了.幼笑吧 白发…

C#线程的参数传递、获取线程返回值以及处理多线程冲突

C#作为一门优秀的开发语言&#xff0c;现在国内的流行度貌似不如以前&#xff0c;大家都不在意它的无所不能了。 C#的灵活与强大只有在经常使用中才会有所领悟&#xff0c;适当地掌握它还是有必要的。 在这里总结一下线程的传递参数以及获取线程的返回值&#xff0c;还有处理多…

【毕业设计】17-基于单片机的矿井提升机_步进电机控制装置设计(原理图+仿真+源代码+实物图+答辩论文+答辩PPT)

typora-root-url: ./ 【毕业设计】17-基于单片机的矿井提升机_步进电机控制装置设计&#xff08;原理图仿真源代码实物图答辩论文答辩PPT&#xff09; 文章目录typora-root-url: ./【毕业设计】17-基于单片机的矿井提升机_步进电机控制装置设计&#xff08;原理图仿真源代码实…

IB中文(语言与文学)介绍分析

Intro to Group 1 Subjects&#xff1a;语言A 语言A科目主要针对学生的母语语言运用与文学鉴赏能力进行考核&#xff0c;旨在培养学生文学素养的同时注重社会关怀、全球视角与批判性思维的意识形成。 IB文凭要求每位学生至少在语言A中学习一门课程。 今天我们就来仔细介绍一下其…

全波形反演的深度学习方法: 第三章 常规反演

本章介绍反演的基础知识, 以及工程中的常规反演. 仅供内部培训. 3.1 地震数据采集 地震勘探中常使用人工激发的振动进行数据采集. 相应装置包括: 激发器是产生震动的装置, 如炸药, 地震车 (撞击地面). 在城市道路等具有车辆会产生振动的地方, 也可以不安装这类装置;地震检波…

为什么我推荐用户故事地图?

最近在给几个客户的培训和辅导中&#xff0c;都用到了用户故事地图(User Story Mapping or USM)&#xff0c;越来越发现USM是一个强大的工具。USM有它特殊的妙用之处和适用范围&#xff0c;我们不用指望USM能解决多的问题&#xff0c;比如产品架构和用户体验旅程就不在USM的范围…

TSN新技术,让您的设备网络“更实时、更确定、更安全”

近日,工业和信息化部发布了2022年第23号公告,批准发布行业标准YD/T 4134-2022《工业互联网时间敏感网络需求及场景》。该标准是国内首个时间敏感网络(TSN)技术标准,标志着我国TSN技术标准体系建设迈出了坚实的一步,对构建工业互联网网络标准体系具有重要意义。 TSN源于Time…

【解决方法】错误:无法和SFTP服务器建立FTP连接,请选择合适的协议

在家连实验室的服务器时&#xff0c;出现了如下的情况&#xff1a;当时一直在想为啥协议不合适。 解决方案&#xff1a; 1. 点击【文件】->【站点管理器】&#xff0c;出现如下界面&#xff1a; 可能你的那里没有新站点&#xff0c;如果没有就点击新站点哦。 2. 点击【协议…