文章目录

  • 一、Instrumentation 源码分析
  • 二、Instrumentation 创建 Application 相关的部分源码

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

一、Instrumentation 源码分析


Instrumentation.java 类参考源码 : 6.0.1_r16/xref/frameworks/base/core/java/android/app/Instrumentation.java 常用方法 :

  • newActivity : 创建 Activity ;
  • newApplication : 创建 Application ;
  • sendKeyDownUpSync : 模拟按键 ;

上一篇博客中讲解了 LoadedApk 中调用 makeApplication 方法创建应用的 Application , 在该方法中通过调用 Instrumentation 的 newApplication 方法创建 Application ;

在 Application newApplication(ClassLoader cl, String className, Context context) 中 , 调用了其重载函数 Application newApplication(Class<?> clazz, Context context) , 前者包含 333 个参数 , 后者包含 222 个参数 ;

    public Application newApplication(ClassLoader cl, String className, Context context)throws InstantiationException, IllegalAccessException, ClassNotFoundException {return newApplication(cl.loadClass(className), context);}

完整源码参考 : 6.0.1_r16/xref/frameworks/base/core/java/android/app/Instrumentation.java

在 Application newApplication(Class<?> clazz, Context context) 函数中就执行了两行代码 , 调用 clazz.newInstance() 反射创建 Application 对象 , 然后调用 Application 的 attach 函数 , 传入 Context 上下文对象 ;

    static public Application newApplication(Class<?> clazz, Context context)throws InstantiationException, IllegalAccessException, ClassNotFoundException {Application app = (Application)clazz.newInstance();app.attach(context);return app;}

完整源码参考 : 6.0.1_r16/xref/frameworks/base/core/java/android/app/Instrumentation.java

Application 的 void attach(Context context) 方法中 , 调用了 attachBaseContext(context) 方法 , 由此可以看出在 Application 中 , attachBaseContext 函数要比 onCreate 先执行 ;

在 Application 使用反射方法创建出来之后 , 马上就会调用 attach 方法 , 进而先调用 attachBaseContext 方法 ;

public class Application extends ContextWrapper implements ComponentCallbacks2 {/*** @hide*//* package */ final void attach(Context context) {attachBaseContext(context);mLoadedApk = ContextImpl.getImpl(context).mPackageInfo;}
}

源码参考 : xref/frameworks/base/core/java/android/app/Application.java

二、Instrumentation 创建 Application 相关的部分源码


public class Instrumentation {/*** Perform instantiation of the process's {@link Application} object.  The* default implementation provides the normal system behavior.* * @param cl The ClassLoader with which to instantiate the object.* @param className The name of the class implementing the Application*                  object.* @param context The context to initialize the application with* * @return The newly instantiated Application object.*/public Application newApplication(ClassLoader cl, String className, Context context)throws InstantiationException, IllegalAccessException, ClassNotFoundException {return newApplication(cl.loadClass(className), context);}/*** Perform instantiation of the process's {@link Application} object.  The* default implementation provides the normal system behavior.* * @param clazz The class used to create an Application object from.* @param context The context to initialize the application with* * @return The newly instantiated Application object.*/static public Application newApplication(Class<?> clazz, Context context)throws InstantiationException, IllegalAccessException, ClassNotFoundException {Application app = (Application)clazz.newInstance();app.attach(context);return app;}
}

完整源码参考 : 6.0.1_r16/xref/frameworks/base/core/java/android/app/Instrumentation.java

【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | Instrumentation 源码分析 )相关推荐

  1. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | ActivityThread 后续分析 | Application 替换位置 )

    文章目录 一.ActivityThread 后续分析 二.ActivityThread 相关源码 三.Application 替换位置 dex 解密时 , 需要将 代理 Application 替换为 ...

  2. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | LoadedApk 源码分析 )

    文章目录 一.LoadedApk 源码分析 二.LoadedApk 源码 makeApplication 方法分析 dex 解密时 , 需要将 代理 Application 替换为 真实 Applic ...

  3. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | ActivityThread 源码分析 )

    文章目录 一.ActivityThread 源码分析 二.ActivityThread 部分代码示例 dex 解密时 , 需要将 代理 Application 替换为 真实 Application ; ...

  4. 【Android 安全】DEX 加密 ( Application 替换 | Android 应用启动原理 | LoadedApk 后续分析 )

    文章目录 一.LoadedApk 后续分析 二.LoadedApk 后续先关源码 dex 解密时 , 需要将 代理 Application 替换为 真实 Application ; 替换 Applic ...

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

    文章目录 一.Zygote 进程孵化器 二.应用启动概述 dex 解密时 , 需要将 代理 Application 替换为 真实 Application ; 替换 Application 首先要理解系 ...

  6. 【Android 安全】DEX 加密 ( Application 替换 | 兼容 ContentProvider 操作 | 源码资源 )

    文章目录 一. 命中 ActivityThread 中 installProvider 方法的分支三 1. 原理分析 2. 代码实现 二. 在 ContextImpl 的 createPackageC ...

  7. 【Android 安全】DEX 加密 ( Application 替换 | 分析 ContentProvider 组件中调用 getApplication() 获取的 Application 二 )

    文章目录 一. ActivityThread 中的 installProvider 方法 ( 创建 ContentProvider 内容提供者 ) 二. installProvider 方法的第三分支 ...

  8. 【Android 安全】DEX 加密 ( Application 替换 | 分析 BroadcastReceiver 组件中调用 getApplication() 获取的 Application )

    文章目录 一. Service 中的 getApplication() 方法分析 二. ActivityThread 中的 H 处理 RECEIVER 消息 三. ActivityThread 中的 ...

  9. 【Android 安全】DEX 加密 ( Application 替换 | 替换 LoadedApk 中的 Application mApplication 成员 )

    文章目录 一. 当前 Application 替换进度 二. 替换 LoadedApk 中的 Application mApplication 成员 一. 当前 Application 替换进度 上一 ...

最新文章

  1. 2020-12-17 【 java优先队列的用法】
  2. linux系统下一个冷门的RAID卡ioc0及其监控mpt-status
  3. lamp自动部署工具_salt实现lamp自动化部署
  4. 一个php请求的执行过程,PHP程序执行的过程原理
  5. Linq连接查询之左连接、右连接、内连接、全连接、交叉连接、Union合并、Concat连接、Intersect相交、Except与非查询...
  6. Android Sensor架构和原理分析
  7. linux -- open /acess/ftruncate/lstat 函数
  8. 玉柴spn码故障对照表_故障代码一览表
  9. Hybird方案-概述
  10. JDBC简介,JDBC API,,MySQL连接、SQL语句
  11. 大学计算机基础教程第12章软件技术基础
  12. bzoj3039 玉蟾宫
  13. php 验证码数字英文的,验证码的英文_php 中英文验证码程序
  14. APP的缓存文件到底应该存在哪?
  15. Fanuc发那科数据采集
  16. Oracle分析函数(每组数据取一条记录)
  17. 本以为PlusFo是个青铜,没想到竟是个王者
  18. 计算机考研是选地区还是学校,2021考研:举例说明,怎么选择院校和地区
  19. python将json转csv代码示例
  20. Pytorch 中 CAM绘制热度图

热门文章

  1. [ant]通过Android命令自动编译出build.xml文件
  2. 2012年生活方向盘
  3. 最简单EXT调用WCF
  4. EXP、IMP 命令详解
  5. 双节棍---1、动作和杂记
  6. 后盾网lavarel视频项目---Laravel 安装代码智能提示扩展「laravel-ide-helper」
  7. [Linux]lnmp一键安装包,访问yii/tp5/laravel的时候,报错500或者空白页面
  8. 1-3_基本概念_程序进程
  9. 运行nltk示例 Resource u'tokenizers punkt english.pickle' not found解决
  10. Linux Java连接MySQL数据库