/*found a match, try to load it */
clazz =loadClassFromDex(pDvmDex, pClassDef, loader);
这行代码是已经发现合适的类,并且找到相应的Dex文件时,就可以调用函数loadClassFromDex来加载类到内存,并准备好可以运行的状态。
if(dvmCheckException(self)) {
/*class was found but had issues */
dvmReleaseTrackedAlloc((Object*)clazz, NULL);
gotobail;
}
这段代码是当从Dex文件时加载类出错时返回。
/*
* Lock the class while welink it so other threads must wait for us
* to finish. Set the"initThreadId" so we can identify recursive
* invocation.
*/
dvmLockObject(self,(Object*)clazz);
clazz->initThreadId= self->threadId;
这段代码是锁住别的线程访问,然后设置这个类的初始化线程的ID,以便防止递归调用时可以判断出来。
/*
* Add to hash table solookups succeed.
*
* [Are circularreferences possible when linking a class?]
*/
下面这段代码是添加新加载的类到hash表里,以便后面查找快速。
assert(clazz->classLoader== loader);
if(!dvmAddClassToHash(clazz)) {
这行代码是调用dvmAddClassToHash函数来添加新加载的类clazz到hash表,也就是保存在gDvm.loadedClasses里。但是添加到hash表里,也不是每次成功的,因为加载类是多线程进行的,可能同一个类在不同的线程里加载了,另一个线程加载就不成功,因此dvmAddClassToHash函数会返回插入不成功,这时就需要进行下面的处理了。
/*
* Another thread musthave loaded the class after we
* started but beforewe finished. Discard what we've
* done and leave somehints for the GC.
*
* (Yes, thishappens.)
*/
//LOGW("WOW:somebody loaded %s simultaneously\n", descriptor);
clazz->initThreadId= 0;
dvmUnlockObject(self,(Object*)clazz);
这段代码是发现已经有别的线程加载同一个类,就设置这个类初始化的线程为空,然后释放这个线程锁。
/*Let the GC free the class.
*/
assert(clazz->obj.clazz== gDvm.unlinkedJavaLangClass);
dvmReleaseTrackedAlloc((Object*)clazz, NULL);
这段代码释放分配类占用的内存。
/*Grab the winning class.
*/
clazz =dvmLookupClass(descriptor, loader, true);
assert(clazz != NULL);
gotogot_class;
这段代码是从已经加载的类引用一份就可以返回给调用函数了。
}
分享到:
相关推荐
Android中dump出dex文件
生成dex源码
android运行时生成dex文件,动态加载运行
通过封装Dalvik_dalvik_system_DexFile_openDexFile_bytearray函数,可以在解密出dex文件的byteArray数组后,不需要保存到文件系统的路径上,直接通过4.0的函数在内存中读取。
Android内存加载运行DEX文件示例代码。 解决自定义CLassLoader加载文件不安全的问题
这是关于打包工具的文档,为广大的移动开发用户提供多 dex打包方法
Android反编译工具dex2jar,用于加.dex反编译成.class文件
Android_DEX_文件格式详解
dex文件字段和方法定义解析样本及代码
利用androidStudio打包Jar的方法,DEX,打包单个类,多个类
Android中内存加载dex
Android系统应用程序DEX文件保护方法研究.pdf
《APK+Dex文件反编译及回编译工具》 简称:APKDB 是一款,针对Android OS系统的APK程序,直接反编译修改的工具。 APKDB集合了当今最强悍,最犀利的APK及Dex文件编译工具; 正常安装后,它直接在【鼠标右键】创建...
把classes.dex文件,放入dex2jar文件夹,然后打开终端,输入命令进行去壳操作: cd dex2jar文件夹 sh dex2jar.sh classes.dex
Android 反编译工具 ,dex2jar ,Android 反编译工具Android 反编译工具 ,dex2jar ,Android 反编译工具
TurboDex: Fast load dex in memory 中文 It is generally known that load an unoptimized Dex file at runtime in Android (especially in ART mode) would take a long time. When your App is using MultiDex ...
标 题: 【原创】Android dex文件通用自动脱壳器 作 者: zyqqyz 时 间: 2015-09-01,13:03:30 链 接: http://bbs.pediy.com/showthread.php?t=203776 之前做了一个Android dex的通用脱壳器,主要思想是以AOP的模式对...
主意,最好把odex文件放到framework目录下执行上面的命令,免得报缺少类文件的错误。 3. 通过class生成classes.dex 文件。 java -Xmx512M -jar smali-1.2.6.jar out -o classes.dex 4. 将classes.dex放到apk...
首先将apk文件后缀改为zip并解压,得到其中的classes.dex,它就是java文件编译再通过dx工具打包而成的,将classes.dex复制到dex2jar.bat所在目录dex2jar 文件夹。 在命令行下定位到dex2jar.bat所在目录,运行 dex2...
使用StringFog插件自动对 dex 中的字符串进行加密