Android培训班(72)Dex文件里类定义dvmDefineClass
/*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;
这段代码是从已经加载的类引用一份就可以返回给调用函数了。
}
相关文章
- 基于chromium for android开发Android浏览器
- android 混淆不起作用,Android代码混淆的写法总结
- android 读取本地数据库db文件(Android sqlite)
- android busybox
- android sdk安装过程,图文详解Android 3.0 SDK安装教程
- Android中mesure过程详解 –[通俗易懂]
- 智能手机功能_android是什么品牌手机
- android应用程序_chrome Android
- textview长按复制_android-TextView的长按复制[通俗易懂]
- android 中 TextView的用法[通俗易懂]
- Android 视图绑定 ViewBinding
- 【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )
- 【错误记录】Android Studio 配置 AspectJ 报错 ( all buildscript {} blocks must appear before any plugins {} )
- 【Android 逆向】ELF 文件格式 ( 安装 010 Editor 二进制查看工具的 ELF.bt 插件模板 | 安装 ELF.bt 模板 | 打开 ELF 文件 )
- 【Android 逆向】Android 进程注入工具开发 ( 远程进程 注入动态库 文件操作 | Android 进程读取文件所需的权限 | fopen 打开文件标志位 | 验证文件权限 )
- 【Android UI】Canvas 画布 ① ( Canvas 状态栈 | Canvas 状态栈入栈与出栈 | 获取 Canvas 状态栈容量 | Canvas 状态栈原点数据 )
- 【Android Gradle 插件】将自定义 Gradle 插件上传到自建 Maven 仓库 ④ ( 默认生成的 pom 文件 | Maven 中的 pom 配置 | 自定义 pom 文件节点 )
- Android键盘EditText只允许输入数字和英文详解手机开发
- [android] 保存文件到SD卡详解手机开发
- Android中资源文件(非代码部分)的使用概览
- android获取屏幕像素大小的正确方法
- Android递归方式删除某文件夹下的所有文件(.mp3文件等等)
- Android中的android:layout_weight使用详解
- android通过蓝牙接收文件打开时无法自动选择合适的应用程序
- Android用ListView显示SDCard文件列表的小例子
- android上传文件到服务器代码实例
- android实现程序自动升级到安装示例分享(下载android程序安装包)
- android读取raw文件示例