Android中Hook Instrumentation的一些思考

原创 2016年07月31日 14:28:17

众所周知,稍微知道Android主线程ActivityThread的人都知道有这个Instrumentation的存在,这个类是用来做什么的呢,通过源代码可以知道,这个类的作用非常重要,它是创建Activity,Application,等组件的一个分水岭,简单的说,它是ActivityThread的一个管家吧,也许你会问,Hook Instrumentation有什么作用,其实作用还是蛮大的,通过替换掉为我们自己的instrumentation的话,可以实现一些特别的事情,比如我们可以在创建Activity之前做些自己的事情,在美团的多dex分包中,链接为:

http://tech.meituan.com/mt-android-auto-split-dex.html

就是Hook 了Instrumentation,来实现自己的行为,那么如何Hook Instrumentation呢, 下面是代码:

public static void hookInstrumentation() throws Exception{
        Class<?> activityThread=Class.forName("android.app.ActivityThread");
        Method currentActivityThread=activityThread.getDeclaredMethod("currentActivityThread");
        currentActivityThread.setAccessible(true);
        //获取主线程对象
        Object activityThreadObject=currentActivityThread.invoke(null);

        //获取Instrumentation字段
        Field mInstrumentation=activityThread.getDeclaredField("mInstrumentation");
        mInstrumentation.setAccessible(true);
        Instrumentation instrumentation= (Instrumentation) mInstrumentation.get(activityThreadObject);
        CustomInstrumentation customInstrumentation=new CustomInstrumentation(instrumentation);
        //替换掉原来的,就是把系统的instrumentation替换为自己的Instrumentation对象
        mInstrumentation.set(activityThreadObject,customInstrumentation);
        Log.d("[app]","Hook Instrumentation成功");

    }

OK,以上便是Hook Instrumentation的代码,当然了,还有 CustomInstrumentation 这个类的源代码,这个类就是继承了Instrumentation,然后重新了生成Activity的方法,代码如下:

public class CustomInstrumentation  extends Instrumentation{
    private Instrumentation base;

    public CustomInstrumentation(Instrumentation base) {
        this.base = base;
    }

    private void  getLoaderApk() throws NoSuchFieldException, IllegalAccessException, ClassNotFoundException {
        MyApplication myApplication=MyApplication.getInstance();
        Field mLoadedApk=myApplication.getClass().getSuperclass().getDeclaredField("mLoadedApk");
        mLoadedApk.setAccessible(true);
        Object mLoadedApkObject=mLoadedApk.get(myApplication);
        Log.d("[app]","获取的mLoadedApkObject="+mLoadedApkObject);
    }

    //重写创建Activity的方法
    @Override
    public Activity newActivity(ClassLoader cl, String className, Intent intent) throws InstantiationException, IllegalAccessException, ClassNotFoundException {
        Log.d("[app]","哈哈,你被Hook了");
        try {
            getLoaderApk();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
        Log.d("[app]","className="+className+" intent="+intent);
        return super.newActivity(cl, className, intent);
    }
}

OK,代码写好了,我们只需在application中的onCreate方法中注入就好了,测试一下吧,现在运行程序,由于注入了我们的Instrumentation,因此进入主页的时候会打印出,哈哈,你被Hook这句话,如图:
这里写图片描述
可以看到是有这句话了,因此Hook Instrumentation是成功的,当然你也许会说这没有什么卵用啊,不是的,在一些特殊的时候还是很有用的,在一篇文章中的秒开优化中就是用了这种方法,下面是链接

http://zhengxiaoyong.me/2016/07/18/Android%E7%AB%AF%E5%BA%94%E7%94%A8%E7%A7%92%E5%BC%80%E4%BC%98%E5%8C%96%E4%BD%93%E9%AA%8C/

其实原理就这样,在第三方sdk优化的时候,根据优先级并行优化,因此可以在创建Activity的时候判断做些自己的事情,当然能做的事情很多,你可以拦截其他方法实现自己的目的,今天的文章就写到这吧,谢谢大家阅读。

版权声明:本文为博主原创文章,未经博主允许不得转载。

关于android instrumentation的理解、使用

一般的应用不太会用到instrumentation,所以网上对其介绍也比较少。 但因其强大的跟踪application及activity生命周期的功能,在一些android 应用测试框架中被做为基类使...
  • shan987
  • shan987
  • 2016年01月13日 16:09
  • 10421

Android白盒测试之Instrumentation初探(一)

一、Instrumentation简介 Instrumentation是Android 测试的核心框架,可使用它进行Android应用的单元测试和自动化测试。Instrumentation可以在主程序...
  • yiwaChen
  • yiwaChen
  • 2016年09月07日 23:34
  • 3305

Android Instrumentation 简介

Instrumentation 简介APIs && Source code 官方APIs地址(需要翻墙) Source code Instrumentation 特点 该框架基于JUnit,因此既可以...
  • gb112211
  • gb112211
  • 2015年05月01日 15:36
  • 9166

android Instrumentation

Android提供了一系列强大的测试工具,它针对Android的环境,扩展了业内标准的JUnit测试框架。尽管你可以使用JUnit测试Android工程,但Android工具允许你为应用程序的各个方面...
  • crystal_ooo
  • crystal_ooo
  • 2013年12月19日 18:04
  • 1041

Android Instrumentation基础使用

Android Instrumentation基础使用 http://stream-town.iteye.com/blog/2020299 AndroidInstrumentation   ...
  • youxiansanren
  • youxiansanren
  • 2015年03月15日 21:19
  • 1367

Android Instrumentation源码分析(附Activity启动流程)

Instrumentation概念官方说明Instrumentation类位于android.app包中,继承自java.lang.Object,一些测试用类如InstrumentationTestR...
  • u014738140
  • u014738140
  • 2017年02月09日 22:48
  • 1459

Android instrumentation原理

instrumentation原理1.官方描述 instrumentation can load both a test package and the application under tes...
  • a19891024
  • a19891024
  • 2017年01月11日 14:02
  • 1456

android.app.instrumentation解析

已经在Android SDK中学习了很多关于JUnit的内容,但是感觉一直有几个问题没有解决(不知道大家是否有同样的感受)JUnit的测试都自动化的,完全是不需要任何操作的,有2个问题我一直都还没有找...
  • startFromWeb
  • startFromWeb
  • 2012年08月17日 14:40
  • 10124

Android中Hook Instrumentation 的实现

Android中Hook Instrumentation 的实现之前一直听说有 Hook 这个技术,但是一直不知道有什么作用,今天通过 Hook Instrumentation 小试牛刀过把瘾。 在...
  • u012341052
  • u012341052
  • 2017年05月05日 09:55
  • 709

【Android源码-AMS】(一)Instrumentation类解析

本文解析android.app.Instrumentation类源码,及Instrumentation类在组件生命周期中的作用。...
  • Nemo__
  • Nemo__
  • 2016年01月16日 15:05
  • 2985
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android中Hook Instrumentation的一些思考
举报原因:
原因补充:

(最多只允许输入30个字)