【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 )

2023-03-28 19:07:26 浏览数 (1)

文章目录

  • 一、Zygote 进程孵化器
  • 二、应用启动概述

dex 解密时 , 需要将 代理 Application 替换为 真实 Application ; 替换 Application 首先要理解系统如何注册应用的 Application 的 ;

一、Zygote 进程孵化器


Zygote 进程孵化器 : Android 中的所有的进程 , 如 系统进程 , 应用进程 , SystemServer 进程 , 都是由 Zygote 调用 fork 方法创建的 ;

SystemServer 进程 : Android 手机开机后 , 就会启动 Zygote 进程 , 并且创建 SystemServer 进程 , SystemServer 进程就是 核心服务 所在进程 , 核心服务如 WindowsManagerService , PowerManagerService , ActivityManagerService 等系统服务 ;

ActivityManagerService 服务 : 简称 AMS , 该服务由 SystemServer 启动 , 其主要功能是 控制四大组件启动和调度工作 , 控制 应用程序的管理和调度工作 ;

二、应用启动概述


Android 启动流程涉及的源码 :

  • /frameworks/base/core/java/android/app/ActivityThread.java
  • /frameworks/base/core/java/android/app/ApplicationThreadNative.java
  • /frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

在 Launcher 应用 ( 系统主界面 ) 中点击应用图标 , Launcher 应用会启动该 app ;

Launcher 应用通过 Instrumentation 经过一系列调用 , 获取 ActivityManagerService ;

在 ActivityManagerService 中调用 start() 方法 , 首先查看要启动的应用是否已经存在 ;

如果存在 , 就直接切换到前台 ;

如果不存在 , 则调用 Process 类 , 通过 Process 类调用 Zygote 的 fork 方法 , 创建一个进程 ;

Zygote 创建新的应用进程后 , 会调用 ActivityThread 的 main 函数 , 在该主函数中 , 会创建 ActivityThread 对象 , 然后启动 Looper.loop , 无限循环处理消息 ;

在 ActivityThread 中会调用 ActivityThread 对象的 attach 函数 , 在该函数中 , 通过 Binder 机制 , 调用 ActivityManagerProxy 的 attachApplication 方法 ;

之后通过一系列调用 , 通过 Binder 机制调用 ActivityThread 的 bindApplication 方法 , ActivityThread 会向其 Handler 发送 BIND_APPLICATION 消息 , 通过 handleMessage 方法调用 handleBindApplication 方法 , 此时真正的启动 Application ;

之前研究 UI 绘制流程时 , 看过一段 ActivityThread 绘制相关代码 , 参考博客 【Android 应用开发】UI绘制流程 ( 生命周期机制 | 布局加载机制 | UI 绘制流程 | 布局测量 | 布局摆放 | 组件绘制 | 瀑布流布局案例 )

0 人点赞