【Android 插件化】Hook 插件化框架 ( Hook Activity 启动流程 | 反射获取 IActivityManager 对象 )(一)

简介: 【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>() {
                @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();
}


目录
相关文章
|
12月前
|
存储 消息中间件 人工智能
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
342 11
【05】AI辅助编程完整的安卓二次商业实战-消息页面媒体对象(Media Object)布局实战调整-按钮样式调整实践-优雅草伊凡
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
429 6
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
555 3
|
缓存 前端开发 Android开发
Android实战之如何截取Activity或者Fragment的内容?
本文首发于公众号“AntDream”,介绍了如何在Android中截取Activity或Fragment的屏幕内容并保存为图片。包括截取整个Activity、特定控件或区域的方法,以及处理包含RecyclerView的复杂情况。
506 3
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
414 0
|
Android开发 开发者
Android面试之Activity启动流程简述
每个Android开发者都熟悉的Activity,但你是否了解它的启动流程呢?本文将带你深入了解。启动流程涉及四个关键角色:Launcher进程、SystemServer的AMS、应用程序的ActivityThread及Zygote进程。核心在于AMS与ActivityThread间的通信。文章详细解析了从Launcher启动Activity的过程,包括通过AIDL获取AMS、Zygote进程启动以及ActivityThread与AMS的通信机制。接着介绍了如何创建Application及Activity的具体步骤。整体流程清晰明了,帮助你更深入理解Activity的工作原理。
687 0
|
Java Android开发 容器
|
11月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
1880 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡

热门文章

最新文章