【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();
}


目录
相关文章
|
23天前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
70 6
|
22天前
|
XML 前端开发 Android开发
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
Android面试高频知识点(3) 详解Android View的绘制流程
|
25天前
|
消息中间件 Android开发 索引
Android面试高频知识点(4) 详解Activity的启动流程
Android面试高频知识点(4) 详解Activity的启动流程
24 3
|
25天前
|
Android开发
Android面试之Activity启动流程简述
Android面试之Activity启动流程简述
17 0
|
Android开发
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )
150 0
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )
|
Android开发
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )(二)
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )(二)
139 0
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )(二)
|
Android开发
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )(三)
【Android 插件化】“ 插桩式 “ 插件化框架 ( 运行应用 | 代码整理 )(三)
178 0
|
3天前
|
搜索推荐 Android开发 开发者
探索安卓开发中的自定义视图:打造个性化UI组件
【10月更文挑战第39天】在安卓开发的世界中,自定义视图是实现独特界面设计的关键。本文将引导你理解自定义视图的概念、创建流程,以及如何通过它们增强应用的用户体验。我们将从基础出发,逐步深入,最终让你能够自信地设计和实现专属的UI组件。
|
5天前
|
Android开发 Swift iOS开发
探索安卓与iOS开发的差异和挑战
【10月更文挑战第37天】在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统扮演着主角。它们各自拥有独特的特性、优势以及面临的开发挑战。本文将深入探讨这两个平台在开发过程中的主要差异,从编程语言到用户界面设计,再到市场分布的不同影响,旨在为开发者提供一个全面的视角,帮助他们更好地理解并应对在不同平台上进行应用开发时可能遇到的难题和机遇。
|
7天前
|
XML 存储 Java
探索安卓开发之旅:从新手到专家
【10月更文挑战第35天】在数字化时代,安卓应用的开发成为了一个热门话题。本文旨在通过浅显易懂的语言,带领初学者了解安卓开发的基础知识,同时为有一定经验的开发者提供进阶技巧。我们将一起探讨如何从零开始构建第一个安卓应用,并逐步深入到性能优化和高级功能的实现。无论你是编程新手还是希望提升技能的开发者,这篇文章都将为你提供有价值的指导和灵感。