- 博客(20)
- 资源 (36)
- 收藏
- 关注
转载 Android类动态加载技术
Android应用开发在一般情况下,常规的开发方式和代码架构就能满足我们的普通需求。但是有些特殊问题,常常引发我们进一步的沉思。我们从沉思中产生顿悟,从而产生新的技术形式。如何开发一个可以自定义控件的Android应用?就像eclipse一样,可以动态加载插件;如何让Android应用执行服务器上的不可预知的代码?如何对Android应用加密,而只在执行时自解密,从而防止被破解?……熟悉J
2013-12-07 23:39:37
824
原创 Dalvik 分析之准备篇
前言:dalvik 是 Android 的重要组成部分 ,掌握其运行机制对理解整个Android系统有着相当之大的帮助。本文将介绍GDB单步调试和Dexdump工具的使用,期望为探索dalvik打下一定的基础。 1. Dalvik 之编译为了能够更方便的调试dalvik,我们需要编译一个在X86上运行的dalvik和相关工具。编译步骤如下:首先进入到Android 源码根目录
2013-12-07 23:34:51
838
转载 Dalvik虚拟机的垃圾回收
垃圾回收技术已经出现很久了,可以追溯到20世纪60年代,在LISP语言中就开始进行应用,而后的Smalltalk,java,c#等语言更是一步一步地将其推向新的高潮。它广受技术专家的推崇,并被高度的评价,被认为是提高软件质量和生产力的一个有效的银弹,是一个具有革命性技术。由于计算机的内存资源总是有限的,为了不同的程序运行,必须把不需要使用的内存回收,以便重新使用。假如那一天计算机的内存足够大,可以
2013-12-07 22:30:38
933
转载 Dalvik虚拟机的寄存器操作
在前面已经说到Dalvik虚拟机是基于寄存器运行的虚拟机,这是与JAVA虚拟机有本质上的区别,因为它是基于栈运行的虚拟机,因而Dalvik虚拟机运行的速度更快,更高效。下面就来分析一段代码片段,看看是怎么样基于寄存器操作的,以便有更深入的了解。代码如下:#defineHANDLE_OP_SHX_INT(_opcode, _opname, _cast, _op) \HANDLE_OPCO
2013-12-07 22:25:47
1035
转载 Dalvik虚拟机的dvmInterpretStd函数
通上面的学习,先初始化解释器的状态,然后调用解释器来执行方法。解释器又分为两种,一种是使用汇编写成性能优化的解释器,一种是使用标准C语言写成的解释器,可以很通用,理解起来也容易一些。接着下来,就先来理解C语言写成的解释器,函数dvmInterpretStd的代码如下:boolINTERP_FUNC_NAME(Thread* self,InterpState* interpState){
2013-12-07 22:24:51
742
转载 Dalvik虚拟机的CallStaticVoidMethod函数
在前面两个函数的介绍里,已经找到要执行方法的类,要执行的方法ID,那么接着下来要做的事情,就是执行方法,其实就是解释Java程序的字节码。那么Davlik虚拟机是怎么样执行方法的代码呢?又是怎么样解释这些字节码指令呢?因此,就先来分析函数CallStaticVoidMethod的代码,直接拿这个函数名称在源程序里查找,是查找不到的,因为代码里并没有直接使用这个名称来声明函数,其实是使用宏来实现的,
2013-12-07 22:23:44
1573
转载 Dalvik虚拟机的GetStaticMethodID函数
在Dalvik虚拟机启动时,曾经使用函数GetStaticMethodID获取静态函数main的ID,以便调用整个Java程序运行起来,那么这个函数怎么样从加载的类里查找到静态方法的ID呢?下面就来分析这个函数的代码,来回答这个问题。函数GetStaticMethodID调用JNI的代码如下:staticjmethodIDGetStaticMethodID(JNIEnv*env,jcl
2013-12-07 22:21:26
2578
转载 Dalvik虚拟机的FindClass函数
从前面我们知道,在虚拟机初始化后,运行Java代码的方法时,要先查找到类,也就是调用函数FindClass。接着后面分析怎么样从dex文件加载类数据到内存,现在开始对查找函数FindClass进行分析,就很好理解了,因为前面介绍加载类到内存的流程已经很清楚。函数FindClass代码如下:static jclass FindClass(JNIEnv* env, const char* name
2013-12-07 22:20:02
742
转载 Dex文件里类定义
当在虚拟机里加载Dex文件后,这个文件的数据已经读取到内存里,能不能马上使用呢?能不能使用里面的类呢?显然是不行的,因为那些加载到内存的数据,只是储存的格式,不具备运行的条件,因此需要调用方法defineClass来定义类,才可以运行在虚拟机里。所有Java编译后的类保存在Dex文件里,使用上面介绍的方法openDexFile打开Dex文件,接着需要调用方法defineClass来定义类,其实就是
2013-12-07 22:15:58
2512
转载 dex文件打开
我们知道,要读取一个类代码,或读取类里的方法代码,都需要打开Dex文件,然后按前面介绍的格式去分析,并且读取出相应的内容,才可以给虚拟机进行解释执行。现在,我们就来学习和分析Dex文件的读取相关的代码。如下:/**Open the specified file read-only. We memory-map the entire thingand*parse the contents
2013-12-07 22:12:16
13232
转载 dex文件格式
在android系统里,通过复杂的编译过程,会把java源代码生成dex文件,然后在虚拟机里就会加载这个文件运行。那么这个文件的格式是什么样的呢?为什么android不直接使用class文件,而采用这个不一样文件呢?其实它是针对嵌入式系统优化的结果,比如dex文件采用的指令码,并不是java的标准虚拟机指令,而是自己独立成一套。如果有自己的编译系统,可以不生成class文件,直接生成dex文件。还
2013-12-07 22:09:29
1563
1
转载 Dalvik虚拟机的指令格式
在分析Dalvik虚拟机运行之前,先要了解Davlik指令,但是了解Davlik指令之前又要先懂得指令的格式,才能看得懂指令是怎么样构成,怎么样表达,怎么样查看,下面就来仔细地学习指令格式,这样在代码里看到指令时,就会很自然而然知道这条指令是干什么用了。在Dalvik虚拟机的目录下面有这样一份文档,我们来仔细学习它,如下:本文描述了在Dalvik虚拟机里字节码的指令格式,这种指令格式是
2013-12-07 22:05:23
699
转载 Dalvik虚拟机的JNI方法和类表示
从上一节里,我们学习到JNI的方法表示可知,GetStaticMethodID方法最后一个参数“([Ljava/lang/String;)V”。这个参数是一个字符串,但内容排列比较奇怪,其实它是一种对函数返回值和参数的编码。这种编码叫做JNI字段描述符(JavaNative Interface FieldDescriptors)。这里只是方法描述符,但也有类描述符。其实这串参数“([Ljava
2013-12-07 22:04:19
600
转载 Dalvik虚拟机运行ZygoteInit类
从上一节可以知道Dalvik虚拟机入口点和创建虚拟机的函数,这一节继续分析运行时类调用虚拟机的代码片段,需要搞清楚怎么样运行JAVA的ZygoteInit类,Dalvik虚拟机又提供什么样的接口调用。运行时类代码如下:/* start the virtual machine */if (startVm(&mJavaVM, &env) != 0)goto bail;这一段是创建虚拟机
2013-12-07 22:03:17
569
转载 Dalvik虚拟机的入口点
要分析Dalvik虚拟机的代码,到底从那里开始比较好呢?从事软件开发人员都知道,每个程序都有生命周期,都有出生点,也就是程序的进入位置。像C语言里控制台程序是使用main函数作为入口点的,java程序也是使用main函数作为入口点。其实Dalvik虚拟机作为应用程序启动时,也是一样的从main函数开始。从Dalvik虚拟机源码目录dalvik/dalvikvm/Main.c文件,就可以看到入口函数
2013-12-07 22:01:57
689
转载 Dalvik虚拟机的目录结构
为了挖掘Dalvik虚拟机的秘密,需要仔细分析Dalvik的每一个目录,每一个文件,才能把它的细节了然于胸。下面就开始吧! Android.mk 这个文件是虚拟机编译的makefile文件。 dalvikvm 这个目录是虚拟机命令行调用入口文件的目录,主要用来解释命令行参数,调用库函数接口等。 dexdump 这个目录是生成dex文件反编译查看工具,主要用来查看
2013-12-07 22:00:38
719
转载 虚拟机的历史
虚拟机的英文名称是Virtual Machine,简称为VM。通过这个名称就可知虚拟机是假的,不真实的机器,当然是与硬件的机器相比。比较科学的理解是这样:指通过软件模拟的具有完整硬件系统功能的、运行在一个完全环境中的完整计算机系统。从这个科学的定义里,可以注意这几个词:软件模拟、硬件系统功能、计算机系统软件模拟意味着虚拟机是使用软件的方法来实现,不是真实的硬件实现。硬件系统功能意味着虚
2013-12-07 21:59:08
2803
原创 android dalvik vm alloc
gagbage collection:为了跟踪对象的使用情况,必须知道内存中的对象是否在被使用,这就需要一个标志指示对象是否正在使用,也就是mark bits。一种方案是每个对象有自己相关联的mark bits。还有一种是将对象和mark bits分开,有独立的存放mark bits的内存区域。当你将mark bits 与对象一起存放的时候,就会消耗更多的缓冲区。当你将mark bits分开存
2013-12-07 21:42:22
738
原创 android dalvik vm oo
java.lang.Class&ClassObject 在java语言里的特殊的类java.lang.Class,它保存了类的信息。我们可以用它得到类的名字、成员、方法包括构造方法等等。举个例子,我们写java.lang.String stringClass=Class.forName(“java.lang.String”);于是我们得到了java.lang.Class的一个实例,它存储的
2013-12-07 21:35:47
1032
原创 Dalvik 分析 - Class加载篇
Java 源代码经过编译后会生成后缀为class的文件,也即字节码文件。然后在Android中使用dx工具将其转换为后缀为jar 的dex类型文件。Dalvik 虚拟机负责解释并执行编译后的字节码。在解释执行字节码之前,当然要读取文件,分析文件的内容,得到字节码,然后才能解释执行之。在整个的加载过程中,最为重要的就是对Class的加载 – Class包含Method,Method 又包含code。
2013-12-07 21:26:27
1077
android的init[1].rc文件的语法
2012-12-09
Android_启动过程分析
2012-12-09
Android_init_启动过程分析
2012-12-09
android开发培训课件
2012-12-09
Android-教程精华-开发
2012-12-09
Android+学习笔记
2012-12-09
android_应用程序开发
2012-12-09
Android Intent和Intent Filter详解
2012-12-09
Android_Activity&Intent;
2012-12-09
android多媒体框架
2012-12-09
wifi驱动分析文档
2012-12-09
Android系统中Wi-Fi网络的研究与实现
2012-12-09
Android消息处理机制Thread、Handler、Looper、TimerTask
2012-12-09
Android应用开发
2012-12-09
Andriod PM电源管理
2012-12-09
深入理解Android++卷I +卷 II+高清版
2012-12-09
《Android系统源代码情景分析》
2012-12-09
javascript王者归来
2008-12-20
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人