【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 )(一)

简介: 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 )(一)

文章目录

Android 插件化系列文章目录

前言

一、Activity 任务栈相关源码

1、任务栈管理者 ActivityStackSupervisor

2、任务栈 ActivityStack

3、Activity 启动涉及到的组件

二、Activity 进程相关源码

1、Instrumentation 源码分析

三、博客资源

前言

上一篇博客 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动过程 | 静态代理 ) 使用了静态代理 , hook 了 Activity 的启动过程 ;


在 hook Android 的内部流程时 , 注意版本兼容 , 不同的 Android 版本底层源码实现机制可能有区别 , 需要使用不同的 hook 兼容方式 ;


hook 本身实现起来很简单 , 但是其 与底层源码耦合性太高 , 在 Android 8.0 8.08.0 可以 hook 住的方法 , 在 Android 10.0 10.010.0 可能就无法使用了 ;


Hook 插件化框架的 难点是版本兼容 , 需要逐个手动兼容 Android 低版本到最新版本 , 一旦系统更新 , 或者某厂商 ROM 更新 , 都要进行兼容测试以及改进 ;


如果 Android 高版本禁止反射 @hide 方法 , 可以在 调用链上找到一个非隐藏的方法 , 总能 hook 住 ; 极端情况下 , 使用 动态字节码技术 , 在运行时修改字节码数据 , 删除 @hide 注解 ;


插件化模块选择 : 一般的业务逻辑不建议使用插件化 ; 功能比较单一 , 业务逻辑更新比较频繁 , 并且很重要的模块 , 使用插件化实现 ;



插件化框架主要是 通过 hook 修改 Instrumentation , 以及 劫持 ActivityManagerService ;



源码分析的大忌就是死磕每一行源码的细节 , 只看自己能看懂的 , 每个方法最多看 2 22 层 , 不要偏离主线 ;

现在的源码参考资料很多 , 参考别人已经分析完毕的源码经验 , 可以节省很多时间 ;






一、Activity 任务栈相关源码


基于 Android 28 2828 源码 , 分析 Activity 的启动过程 ; ( Android 27 2727 , 28 2828 , 29 2929 中 Android 启动源码都进行了不同程度的改进 , 3 33 个版本的源码是不同的 )




1、任务栈管理者 ActivityStackSupervisor


Activity 任务栈 : ActivityStack ; Activity 启动后 , 都加入到 ActivityStack ( 任务栈 ) 中 ;


任务栈管理者 : ActivityStack 由 ActivityStackSupervisor 来管理 , ActivityStackSupervisor 中有两个数组 , 分别是


mHomeStack : Launcher 应用使用的任务栈 ;

mFocusedStack : 当前聚焦的任务栈 , 可以接收输入 , 或启动下一个 Activity ;

public class ActivityStackSupervisor extends ConfigurationContainer implements DisplayListener,
        RecentTasks.Callbacks {
    /** The stack containing the launcher app. Assumed to always be attached to
     * Display.DEFAULT_DISPLAY. */
    ActivityStack mHomeStack;
    /** The stack currently receiving input or launching the next activity. */
    ActivityStack mFocusedStack;
}


源码地址 : frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java



2、任务栈 ActivityStack


ActivityStack ( 任务栈 ) 中存在两个集合 :


ArrayList<TaskRecord> mTaskHistory : 之前运行的 ( 可能仍在运行 ) 的 Activity 的历史记录 , 每个 TaskRecord 都包含了 1 11 个 ActivityRecord 集合 ;

ArrayList<ActivityRecord> mLRUActivities : 当前正在运行的 Activity 列表 , 按照最近最少使用算法 LRU 机制进行排序 , 列表中第一个 Activity 是最近最少使用的 ;

ActivityRecord 就是 Activity 的信息 , 注意不是 Activity 的实例对象 , 是历史任务栈中的一个条目 , 可以代表一个 Activity ;


TaskRecord 中 维护了 1 11 个 ArrayList<ActivityRecord> , 用于保存 ActivityRecord ;


class ActivityStack<T extends StackWindowController> extends ConfigurationContainer
        implements StackWindowListener {
    /**
     * The back history of all previous (and possibly still
     * running) activities.  It contains #TaskRecord objects.
     */
    private final ArrayList<TaskRecord> mTaskHistory = new ArrayList<>();
    /**
     * List of running activities, sorted by recent usage.
     * The first entry in the list is the least recently used.
     * It contains HistoryRecord objects.
     */
    final ArrayList<ActivityRecord> mLRUActivities = new ArrayList<>();
}


3、Activity 启动涉及到的组件


ActivityThread : 应用主线程 , 每个应用都是从该主线程的 main 函数开始的 ;


/frameworks/base/core/java/android/app/ActivityThread.java

Instrumentation : 每个 Activity 都持有该类对象 , 档调用 startActivity 启动其它 Activity 时 , 就会调用 Instrumentation 进行先关操作 ; ActivityThread 控制 Activity 也是通过该类进行 ; 一个应用中只有一个 Instrumentation 实例对象 ;


/frameworks/base/core/java/android/app/Instrumentation.java


目录
相关文章
|
20天前
|
安全 Android开发 数据安全/隐私保护
深入探讨iOS与Android系统安全性对比分析
在移动操作系统领域,iOS和Android无疑是两大巨头。本文从技术角度出发,对这两个系统的架构、安全机制以及用户隐私保护等方面进行了详细的比较分析。通过深入探讨,我们旨在揭示两个系统在安全性方面的差异,并为用户提供一些实用的安全建议。
|
29天前
|
缓存 Java Shell
Android 系统缓存扫描与清理方法分析
Android 系统缓存从原理探索到实现。
53 15
Android 系统缓存扫描与清理方法分析
|
16天前
|
运维 JavaScript jenkins
鸿蒙5.0版开发:分析CppCrash(进程崩溃)
在HarmonyOS 5.0中,CppCrash指C/C++运行时崩溃,常见原因包括空指针、数组越界等。系统提供基于posix信号机制的异常检测能力,生成详细日志辅助定位。本文详解CppCrash分析方法,涵盖异常检测、问题定位思路及案例分析。
39 4
|
16天前
|
运维 监控 JavaScript
鸿蒙next版开发:分析JS Crash(进程崩溃)
在HarmonyOS 5.0中,JS Crash指未处理的JavaScript异常导致应用意外退出。本文详细介绍如何分析JS Crash,包括异常捕获、日志分析和典型案例,帮助开发者定位问题、修复错误,提升应用稳定性。通过DevEco Studio收集日志,结合HiChecker工具,有效解决JS Crash问题。
37 4
|
20天前
|
JSON Java Android开发
探索安卓开发之旅:打造你的第一个天气应用
【10月更文挑战第30天】在这个数字时代,掌握移动应用开发技能无疑是进入IT行业的敲门砖。本文将引导你开启安卓开发的奇妙之旅,通过构建一个简易的天气应用来实践你的编程技能。无论你是初学者还是有一定经验的开发者,这篇文章都将成为你宝贵的学习资源。我们将一步步地深入到安卓开发的世界中,从搭建开发环境到实现核心功能,每个环节都充满了发现和创造的乐趣。让我们开始吧,一起在代码的海洋中航行!
|
20天前
|
存储 搜索推荐 Java
打造个性化安卓应用:从设计到实现
【10月更文挑战第30天】在数字化时代,拥有一个个性化的安卓应用不仅能够提升用户体验,还能加强品牌识别度。本文将引导您了解如何从零开始设计和实现一个安卓应用,涵盖用户界面设计、功能开发和性能优化等关键环节。我们将以一个简单的记事本应用为例,展示如何通过Android Studio工具和Java语言实现基本功能,同时确保应用流畅运行。无论您是初学者还是希望提升现有技能的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧。
|
24天前
|
搜索推荐 开发工具 Android开发
打造个性化Android应用:从设计到实现的旅程
【10月更文挑战第26天】在这个数字时代,拥有一个能够脱颖而出的移动应用是成功的关键。本文将引导您了解如何从概念化阶段出发,通过设计、开发直至发布,一步步构建一个既美观又实用的Android应用。我们将探讨用户体验(UX)设计的重要性,介绍Android开发的核心组件,并通过实际案例展示如何克服开发中的挑战。无论您是初学者还是有经验的开发者,这篇文章都将为您提供宝贵的见解和实用的技巧,帮助您在竞争激烈的应用市场中脱颖而出。
|
26天前
|
算法 Java 数据库
Android 应用的主线程在什么情况下会被阻塞?
【10月更文挑战第20天】为了避免主线程阻塞,我们需要合理地设计和优化应用的代码。将耗时操作移到后台线程执行,使用异步任务、线程池等技术来提高应用的并发处理能力。同时,要注意避免出现死循环、不合理的锁使用等问题。通过这些措施,可以确保主线程能够高效地运行,提供流畅的用户体验。
38 2
|
30天前
|
Java API Android开发
安卓应用程序开发的新手指南:从零开始构建你的第一个应用
【10月更文挑战第20天】在这个数字技术不断进步的时代,掌握移动应用开发技能无疑打开了一扇通往创新世界的大门。对于初学者来说,了解并学习如何从无到有构建一个安卓应用是至关重要的第一步。本文将为你提供一份详尽的入门指南,帮助你理解安卓开发的基础知识,并通过实际示例引导你完成第一个简单的应用项目。无论你是编程新手还是希望扩展你的技能集,这份指南都将是你宝贵的资源。
48 5
|
30天前
|
移动开发 Dart 搜索推荐
打造个性化安卓应用:从零开始的Flutter之旅
【10月更文挑战第20天】本文将引导你开启Flutter开发之旅,通过简单易懂的语言和步骤,让你了解如何从零开始构建一个安卓应用。我们将一起探索Flutter的魅力,实现快速开发,并见证代码示例如何生动地转化为用户界面。无论你是编程新手还是希望扩展技能的开发者,这篇文章都将为你提供价值。