Dalvik虚拟机
文章平均质量分 81
风语
这个作者很懒,什么都没留下…
展开
-
关于获取Java的调用栈的实现
为了比较方便地分析代码的动态运行情况,有时候需要在没有发生异常的情况下打印堆栈,只需插入如下一段代码即可:Log.d(TAG, Log.getStackTraceString(new Throwable()));可见,这里堆栈是通过Log.getStackTraceString(new Throwable())获取的,我们看看里面是如何实现的。public static String getStac原创 2016-01-17 18:52:28 · 8366 阅读 · 2 评论 -
Dalvik虚拟机反射调用函数执行流程
Dalvik虚拟机函数执行有以下几种方式:interpreted 调用 interpretedinterpreted 调用 nativenative 调用 interpretednative 调用 native反射调用 interpreted反射调用 native本章主要分析反射调用。新建一个工程如下: public class MainActivity extends Activit原创 2016-01-10 20:04:29 · 1897 阅读 · 0 评论 -
Dalvik虚拟机线程初始化及函数执行流程
研究dalvik线程创建,只因为想搞清楚dalvik函数执行流程,那么这个流程的开端在哪里呢?我想到了线程,因为每个线程都有自己的Runnable,而这个入口一定就是Runnable开始执行的地方。带着这个疑问,我展开了一系列研究。首先,Thread开始执行时,要调用Thread.start(),如下public synchronized void start() { VMThread.cr原创 2016-01-10 10:21:34 · 1570 阅读 · 0 评论 -
如何获取Java层的函数在Dalvik中对应的Method?
为什么要获取Java层的函数在Dalvik中对应的Method数据结构呢?因为要Hook Java层的某个函数,首先得获取该函数在Dalvik中对应的Method数据结构,然后修改其函数指针指向另外一个函数,从而达到Hook的效果。首先提出一个猜想,Java层通过反射可以获取函数的Method,而这个Method是否和Dalvik中的Method是一回事呢?新建一个工程来验证一下(工程下载地址)分别原创 2016-01-02 12:57:09 · 2969 阅读 · 4 评论 -
Dalvik虚拟机中so的加载和JNI调用
本文主要目的是搞清楚so加载和调用的整体脉络,以便遇到so相关的问题时做到心中有数,能迅速把握解决问题的大方向。先抛出两个问题: 1. 退出插件时如何卸载so,以免内存占用越来越大? 2. 热修复中如何实现native函数的热替换?这两个问题我会在文章结尾给出解决思路。so是在System.loadLibrary中加载的,如下:public static void loadLibrary(Str原创 2016-01-25 15:59:06 · 2204 阅读 · 0 评论 -
Dalvik虚拟机异常处理机制
在写这篇文章之前首先提几个问题,try catch的时候虚拟机到底做了些什么,Thread的UncaughtExceptionHandler是怎么回事?jni函数的异常是如何抛出的,又是如何被虚拟机捕获的?我们以抛出一个异常为入口,来分析Dalvik虚拟机的异常处理机制,由于throw是关键字,执行时肯定为字节码,所以我们需要到虚拟机的解释器中查看,如果对解释器不太了解的话可以参考我之前的文章:原创 2016-01-20 17:53:40 · 1589 阅读 · 0 评论 -
Android热修复技术总结
这两年Android热修复是个挺时髦的东西,基本分为两派,一个是Hook虚拟机的,一个是Hook ClassLoader的。本文就来聊聊这两类方案,算是我自己的理解了。先说说Hook虚拟机的,这个技术源于国外的Xposed,又被阿里发扬光大,总体来说是个逼格很高的技术。将Java的函数在虚拟机层面改成一个Native函数,之后这个函数的走向就完全由我们来控制了,我们可以将其指向一个我们精心设计的Na原创 2016-03-06 20:00:59 · 1662 阅读 · 0 评论