android instrumentation 用法,关于android instrumentation的理解、使用
一般的应用不太会用到instrumentation,所以网上对其介绍也比较少。
但因其强大的跟踪application及activity生命周期的功能,用于android 应用测试框架中,被做为基类使用。
instrumentation的官方文档:http://developer.android.com/intl/zh-cn/reference/android/app/Instrumentation.html
查看其提供的方法,比如:callActivityOnCreate,callApplicationOnCreate,newActivity,callActivityOnNewIntent 等基本上在application和activity的所有生命周期调用中,都会先调用instrumentation的相应方法。并且针对应用内的所有activity都生效。为程序员提供了一个强大的能力,有更多的可能性进入android app框架执行流程。
对于每一个android app来说,它的总入口都是ActivityThread::main. 每一个应用的进程都有一个ActivityThread对象,而每一个ActivityThread对象都有一个Instrumentation mInstrumentation;成员变量。mInstrumentation的初始化在ActivityThread::handleBindApplication函数中:
if(data.instrumentationName !=null) {
...
java.lang.ClassLoadercl= instrContext.getClassLoader();
mInstrumentation = (Instrumentation)
cl.loadClass(data.instrumentationName.getClassName()).newInstance();
...} else {
mInstrumentation =newInstrumentation();
}
自定义的instrumentation只能通过调用Context.startInstrementation或者命令行am instrument启动,这个过程会将目标进程杀死再重启(声明instrumention的应用与目标应用签名必需一致)。如果应用不是通过上述方式启动而是正常情况下(通过launcher或者startActivity)启动,会默认new 一个系统的Instrumentation.
如果某应用要自定义instrumentation且用于跟踪本应用内的application及activity生命周期,通过继承实现Instrumentation并反射修改ActivityThread.mInstrumentation的方法可以做到。以下是具体做法:
1、自定义Instrumentation
class MyInstrumentation extends Instrumentation {
...
};
2、反射调用修改ActivityThread.mInstrumentation
MyInstrumentation ins = new MyInstrumentation();
Class cls = Class.forName("android.app.ActivityThread"); // ActivityThread被隐藏了,所以通过这种方式获得class对象
Method mthd = cls.getDeclaredMethod("currentActivityThread", (Class[]) null); // 获取当前ActivityThread对象引用
Object currentAT = mthd.invoke(null, (Object[]) null);
Field mInstrumentation = currentAT.getClass().getDeclaredField("mInstrumentation");
mInstrumentation.setAccessible(true);
mInstrumentation.set(currentAT, ins); // 修改ActivityThread.mInstrumentation值
至此即可通过MyInstrumentation来跟踪应用内application及activity的生命周期。
android instrumentation 用法,关于android instrumentation的理解、使用相关推荐
- android组件用法说明,Android第三方控件PhotoView使用方法详解
Android第三方控件PhotoView使用方法详解 发布时间:2020-10-21 15:06:09 来源:脚本之家 阅读:74 作者:zhaihaohao1 PhotoView的简介: 这是一个 ...
- android instrumentation 用法,Instrumentation的理解
一般的应用不太会用到instrumentation,所以网上对其介绍也比较少. 但因其强大的跟踪application及activity生命周期的功能,用于android 应用测试框架中,被做为基类使 ...
- [深入理解Android卷二 全文-第四章]深入理解PackageManagerService
由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容 第 ...
- 深入理解 Android 卷I - 第8章 深入理解Surface系统
原文地址:http://wiki.jikexueyuan.com/project/deep-android-v1/ 第8章 深入理解Surface系统 本章主要内容 · 详细分析一个Activit ...
- [深入理解Android卷二 全文-第六章]深入理解ActivityManagerService
由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容 第 ...
- Android Intent 用法总结
From:https://www.jianshu.com/p/67d99a82509b Android 中提供了 Intent 机制来协助应用间的交互与通讯,Intent 负责对应用中一次操作的动作. ...
- android:id = @+id 用法,@+id/android:list和@android:id/list的写法
Android中的列表,当然也可以用ListView来完成所需要的功能,用法是一样的. 废话不说,来关键的. LiveActivity本身继承了关于List操作的众多接口,我们可以方便的重写这些操作中 ...
- [深入理解Android卷二 全文-第三章]深入理解SystemServer
由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的问题而中断,所以我将在CSDN博客中全文转发这两本书的全部内容 第 ...
- Android.mk 用法介绍
一个Android.mk file用来向编译系统描述你的源代码.具体来说:该文件是GNU Makefile的一小部分,会被编译系统解析一次或多次.你可以在每一个Android.mk file中定义一个 ...
最新文章
- 鹅厂机器狗,站起来了!
- Java 集合系列(4): LinkedList源码深入解析2
- 哲学家就餐(避免死锁)(多进程版)
- android像素鸟,像素鸟Flappy Bird
- 查询商品信息报错FreeMark template error
- 安装Vim,提示“Could not get lock......”
- 坡度土方计算案例_【攻略】如何解锁方格网法土方计算?
- 作为开发者不应该畏惧的8件事
- 平民级NER︱pycrfsuite的介绍与应用
- 3分钟tips:泛函中,什么是开映像定理?
- 使用scroll实现Elasticsearch数据遍历和深度分页
- 基于MATLAB中的GUI设计的钢琴界面设计并能发声
- 办理icp许可证对经营范围还有要求吗
- 远程医疗中使用AR眼镜,内窥镜,视频远程诊疗方案
- HTML中的语义化标签
- 关于自制utau软件,widegt,动态更改控件长度等等经验
- 摘自【北京迅为】itop-3568开发板快速启动手册 第二章 Windows安装串口终端
- r7 4800h安装linux,华硕天选(R7-4800H) u盘pe如何重装win7系统
- BoCloud博云完成近亿元B轮融资,向PaaS及自动化运维注入强大加速力
- MySQL 之留言板的功能的实现