文章目录
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>() { @Override protected 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
1
反射代码 :
// 获取 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(); }