Android培训班(72)Dex文件里类定义dvmDefineClass |
您所在的位置:网站首页 › Android培训班 › 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; 这段代码是从已经加载的类引用一份就可以返回给调用函数了。 } |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |