【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | 反射获取 IActivityManager 对象 )
Android 插件化系列文章目录
【Android 插件化】插件化简介 ( 组件化与插件化 )
【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 )
【Android 插件化】插件化原理 ( 类加载器 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 类加载器创建 | 资源加载 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 注入上下文的使用 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 获取插件入口 Activity 组件 | 加载插件 Resources 资源 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )
【Android 插件化】Hook 插件化框架 ( Hook 技术 | 代理模式 | 静态代理 | 动态代理 )
【Android 插件化】Hook 插件化框架 ( Hook 实现思路 | Hook 按钮点击事件 )
【Android 插件化】Hook 插件化框架 ( Hook Activity 启动过程 | 静态代理 )
【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 )
【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )
【Android 插件化】Hook 插件化框架 ( hook 插件化原理 | 插件包管理 )
【Android 插件化】Hook 插件化框架 ( 通过反射获取 “插件包“ 中的 Element[] dexElements )
【Android 插件化】Hook 插件化框架 ( 通过反射获取 “宿主“ 应用中的 Element[] dexElements )
【Android 插件化】Hook 插件化框架 ( 合并 “插件包“ 与 “宿主“ 中的 Element[] dexElements | 设置合并后的 Element[] 数组 )
【Android 插件化】Hook 插件化框架 ( 创建插件应用 | 拷贝插件 APK | 初始化插件包 | 测试插件 DEX 字节码 )
【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | Hook 点分析 )
【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | 反射获取 IActivityManager 对象 )
文章目录
- Android 插件化系列文章目录
- 前言
- 一、反射相关源码说明
- 1、Instrumentation
- 2、ActivityManager
- 3、Singleton
- 二、反射获取 IActivityManager 对象
- 1、反射获取 ActivityManager 类
- 2、反射获取 IActivityManagerSingleton 字段
- 3、反射获取 IActivityManagerSingleton 对象
- 4、反射获取 Singleton 类
- 5、反射获取 mInstance 字段
- 6、反射获取 mInstance 字段
- 三、完整代码
- 四、博客资源
前言
在上一篇博客 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | Hook 点分析 ) 中分析了 Activity 启动过程中的 Hook 点 ;
本篇博客中开始进行 Hook Activity 的操作 ;
一、反射相关源码说明
1、Instrumentation
在 Instrumentation 中的 execStartActivity 方法 , 在最后 , 通过如下代码 , 启动 Activity ;
public class Instrumentation {public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token, Activity target,Intent intent, int requestCode, Bundle options) {int result = ActivityManager.getService().startActivity(whoThread, who.getBasePackageName(), intent,intent.resolveTypeIfNeeded(who.getContentResolver()),token, target != null ? target.mEmbeddedID : null,requestCode, 0, null, options);}
}
源码路径 : /frameworks/base/core/java/android/app/Instrumentation.java
2、ActivityManager
ActivityManager.getService() 是静态方法 , 只要反射 ActivityManager 类之后 , 就可以直接调用该 getService 静态方法 ;
ActivityManager 中的 IActivityManagerSingleton 成员是 Singleton<IActivityManager> 类型的 , 其中的单例变量是 mInstance ;
public class ActivityManager {/*** @hide*/public static IActivityManager getService() {return IActivityManagerSingleton.get();}private static final Singleton<IActivityManager> IActivityManagerSingleton =new Singleton<IActivityManager>() {@Overrideprotected IActivityManager create() {final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);final IActivityManager am = IActivityManager.Stub.asInterface(b);return am;}};
}
源码路径 : /frameworks/base/core/java/android/app/ActivityManager.java
3、Singleton
Singleton 类是单例的实现 , 注意该类只能由系统使用 , 应用开发者不能调用 ;
package android.util;/*** Singleton helper class for lazily initialization.** Modeled after frameworks/base/include/utils/Singleton.h** @hide*/
public abstract class Singleton<T> {private T mInstance;protected abstract T create();public final T get() {synchronized (this) {if (mInstance == null) {mInstance = create();}return mInstance;}}
}
源码路径 : /frameworks/base/core/java/android/util/Singleton.java
二、反射获取 IActivityManager 对象
1、反射获取 ActivityManager 类
首先反射获取 获取 android.app.ActivityManager 类 ;
反射代码 :
// 获取 android.app.ActivityManager 类
Class<?> activityManagerClass = null;
try {activityManagerClass = Class.forName("android.app.ActivityManager");
} catch (ClassNotFoundException e) {e.printStackTrace();
}
2、反射获取 IActivityManagerSingleton 字段
获取 ActivityManager 类中的 的 IActivityManagerSingleton 成员字段 , 下面是该字段的完整声明 ; 注意凡是涉及到字段获取 , 一般都要设置其可见性为 true ;
( 一般情况下 , 只有非 public 的字段才需要使用反射方式获取 )
private static final Singleton<IActivityManager> IActivityManagerSingleton
反射代码 :
// 获取 android.app.ActivityManager 类 中的 IActivityManagerSingleton 属性
// private static final Singleton<IActivityManager> IActivityManagerSingleton 成员变量
Field iActivityManagerSingletonField = null;
try {iActivityManagerSingletonField =activityManagerClass.getDeclaredField("IActivityManagerSingleton");// 设置成员字段的可访问性iActivityManagerSingletonField.setAccessible(true);
} catch (NoSuchFieldException e) {e.printStackTrace();
}
3、反射获取 IActivityManagerSingleton 对象
获取 android.app.ActivityManager 类的静态成员变量 , 直接调用 Field 字段 iActivityManagerSingletonField 的 get 方法 , 传入 null 即可获取 ;
// 获取 android.app.ActivityManager 类的静态成员变量
// private static final Singleton<IActivityManager> IActivityManagerSingleton
// 直接调用 Field 字段 iActivityManagerSingletonField 的 get 方法 , 传入 null 即可获取
Object iActivityManagerSingletonObject = null;
try {iActivityManagerSingletonObject = iActivityManagerSingletonField.get(null);
} catch (IllegalAccessException e) {e.printStackTrace();
}
4、反射获取 Singleton 类
在 ActivityManager 中 , IActivityManagerSingleton 成员是 Singleton<IActivityManager> 类型的 ,
private static final Singleton<IActivityManager> IActivityManagerSingleton
通过反射获取 android.util.Singleton 类 ;
// 获取 Singleton 类
// ActivityManager 中的 IActivityManagerSingleton 成员是 Singleton<IActivityManager> 类型的
Class<?> singletonClass = null;
try {singletonClass = Class.forName("android.util.Singleton");
} catch (ClassNotFoundException e) {e.printStackTrace();
}
5、反射获取 mInstance 字段
// 反射获取 Singleton 类中的 mInstance 字段
Field mInstanceField = null;
try {mInstanceField = singletonClass.getDeclaredField("mInstance");// 设置字段的可访问性mInstanceField.setAccessible(true);
} catch (NoSuchFieldException e) {e.printStackTrace();
}
6、反射获取 mInstance 字段
反射获取 Singleton 类中的 mInstance 成员对象 , 该 mInstanceObject 成员对象就是 IActivityManager ;
// 反射获取 Singleton 类中的 mInstance 成员对象
// 该 mInstanceObject 成员对象就是 IActivityManager
// private static final Singleton<IActivityManager> IActivityManagerSingleton
Object mInstanceObject = null;
try {mInstanceObject = mInstanceField.get(iActivityManagerSingletonObject);
} catch (IllegalAccessException e) {e.printStackTrace();
}
三、完整代码
package kim.hsl.plugin;import java.lang.reflect.Field;/*** 主要职责 : Hook Activity 的启动过程* 本工具类只针对 API Level 28 实现 , 如果是完整插件化框架 , 需要实现所有版本的 Hook 过程* 不同的版本 , Activity 的启动过程是不同的 , 需要逐个根据 Activity 启动源码进行 Hook 适配*/
public class HookUtils {/*** 最终目的是劫持 ActivityManagerService 的 startActivity 方法 ,* 修改 Intent 中药启动的 Activity 类*/public static void hookAms(){// 获取 android.app.ActivityManager 类Class<?> activityManagerClass = null;try {activityManagerClass = Class.forName("android.app.ActivityManager");} catch (ClassNotFoundException e) {e.printStackTrace();}// 获取 android.app.ActivityManager 类 中的 IActivityManagerSingleton 属性// private static final Singleton<IActivityManager> IActivityManagerSingleton 成员变量Field iActivityManagerSingletonField = null;try {iActivityManagerSingletonField =activityManagerClass.getDeclaredField("IActivityManagerSingleton");// 设置成员字段的可访问性iActivityManagerSingletonField.setAccessible(true);} catch (NoSuchFieldException e) {e.printStackTrace();}// 获取 android.app.ActivityManager 类的静态成员变量// private static final Singleton<IActivityManager> IActivityManagerSingleton// 直接调用 Field 字段 iActivityManagerSingletonField 的 get 方法 , 传入 null 即可获取Object iActivityManagerSingletonObject = null;try {iActivityManagerSingletonObject = iActivityManagerSingletonField.get(null);} catch (IllegalAccessException e) {e.printStackTrace();}// 获取 Singleton 类// ActivityManager 中的 IActivityManagerSingleton 成员是 Singleton<IActivityManager> 类型的Class<?> singletonClass = null;try {singletonClass = Class.forName("android.util.Singleton");} catch (ClassNotFoundException e) {e.printStackTrace();}// 反射获取 Singleton 类中的 mInstance 字段Field mInstanceField = null;try {mInstanceField = singletonClass.getDeclaredField("mInstance");// 设置字段的可访问性mInstanceField.setAccessible(true);} catch (NoSuchFieldException e) {e.printStackTrace();}// 反射获取 Singleton 类中的 mInstance 成员对象// 该 mInstanceObject 成员对象就是 IActivityManager// private static final Singleton<IActivityManager> IActivityManagerSingletonObject mInstanceObject = null;try {mInstanceObject = mInstanceField.get(iActivityManagerSingletonObject);} catch (IllegalAccessException e) {e.printStackTrace();}}}
四、博客资源
博客资源 :
- GitHub : https://github.com/han1202012/Plugin_Hook
【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | 反射获取 IActivityManager 对象 )相关推荐
- 【Android 插件化】Hook 插件化框架总结 ( 插件包管理 | Hook Activity 启动流程 | Hook 插件包资源加载 ) ★★★
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | 主线程创建 Activity 实例之前使用插件 Activity 类替换占位的组件 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | AMS 启动前使用动态代理替换掉插件 Activity 类 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | Hook 点分析 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 二 | AMS 进程相关源码 | 主进程相关源码 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】Hook 插件化框架 ( 从 Hook 应用角度分析 Activity 启动流程 一 | Activity 进程相关源码 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- android activity启动流程_1307页!一线大厂Android面试全套真题解析!
/ 前言 / 金九银十到了,很多读者都反映有面试的需求,所以我特地给大家准备了一点资料! 下面的题目都是大家在面试一线互联网大厂时经常遇到的面试真题和答案解析,如果大家还有其他好的题目或者好的 ...
- Android Instrumentation源码分析(附Activity启动流程)
转载请注明出处:http://blog.csdn.net/ahence/article/details/54959235 Instrumentation概念 官方说明 Instrumentation类 ...
- 【Android 启动过程】Android 应用启动流程 | Activity 启动流程
文章目录 一.Android 系统启动流程 二.Activity 启动流程 一.Android 系统启动流程 打开 Android 手机电源键后 , 先运行 BootLoader , 然后使用 Boo ...
最新文章
- 卡尔曼滤波——车定位(GPS与车运动方程)
- CCommandLineInfo类
- 跳出数据计算拯救人工智能之自然法则
- spring部分注解
- 深度学习英文文献_文献速递 | 预测术后30天死亡率的深度学习模型
- 根本不值得一提的乒乓球国手王浩
- Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.9
- 04 - Masonry使用练习
- 6.0新特性 权限管理方式
- 【PPT已更新】给开发者的区块链技术指南 | JTalk 掘金线下活动第五期
- 纯前端支持拼音搜索功能
- pyinstaller打包有pandas和numpy库过程中遇到的bug及处理
- GitHub:git push问题remote:Support for password authentication was removed on August 13,2021.
- 光伏电站清扫机器人_光伏电站清扫机器人
- 微电子封装技术的发展趋势
- 使用libCurl进行百度图片翻译一直返回invalid_sign错误
- 电脑服务器独立显卡显示配置,电脑显卡装完驱动,英伟达显示设置不可用解决方发...
- 云展网教程 | 数据统计功能
- 19 冲动:像阿尔法狗一样,兼顾直觉和理性
- 小白学 Python 爬虫(20):Xpath 进阶
热门文章
- 如何确定一个IAR工程所使用的IAR版本
- 网络化机房的绿色安全卫士——万联OMM网络化机房动力环境监控系统案例分析...
- 解决SELinux导致Apache更改端口后无法启动的问题
- Tengine(nginx) 搭建Tomcat集群
- UIGraphicsBeginImageContext系列知识
- 关于年终奖励的扣税算法BUG
- Awk中调用shell命令
- hdu4763 KMP
- c++ -- 构造函数与析构函数
- 如何判断应用已经安装,如何判断Service,BroastCastReceiver,ContentProvider是否存在...