Android类加载流程是什么


这篇“Android类加载流程是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Android类加载流程是什么”文章吧。从loadClass开始,我们来看下Android中类加载的流程/libcore/ojluni/src/main/java/java/lang/ClassLoader.java::loadClassloadClass流程如下:/libcore/ojluni/src/main/java/java/lang/ClassLoader.java::findClassClassLoader类的findClass是没有实际查找代码的,所以调用findClass其实是调用其实现类的findClass函数,例如:BaseDexClassLoader/libcore/dalvik/src/main/java/dalvik/system/BaseDexClassLoader.java::findClass每个BaseDexClassLoader都持有一个DexPathList,BaseDexClassLoader的findClass类调用了DexPathList的findClass。/libcore/dalvik/src/main/java/dalvik/system/DexPathList.java::findClass遍历所有dexElements,并调用Element类的findClass。题外话,dexElements对象其实是DexPathList$Element类的数组,用于存储已加载的dex或者jar的信息。/libcore/dalvik/src/main/java/dalvik/system/DexPathList$Element::findClassElement的findClass,又去调用DexFile类的loadClassBinaryName,可以理解为在单独的dex或者jar对象中加载类libcoredalviksrcmainjavadalviksystemDexFile.java::loadClassBinaryName去调用defineClass函数libcoredalviksrcmainjavadalviksystemDexFile.java::defineClass调用defineClassNative,准备进入Native层artruntimenativedalvik_system_DexFile.cc::DexFile_defineClassNative检查dex是免费云主机域名否加载,类名是否合理,并遍历DexFile对象,查找Dex文件中的类的定义,找到就去调用ClassLinker::DefineClass函数。artruntimeclass_linker.cc::DefineClassDefineClass这个函数做了许多工作,相当于底层类加载逻辑的分发器,整体逻辑如下图:artruntimeclass_linker.cc::SetupClassSetupClass设置类的一些基本字段信息。延申:mirror命名空间下的类是底层对Java层类的映射,比如:mirror::Class类就是对java.lang.Class类的映射,SetAccessFlags就是对Class类的accessFlags字段赋值。artruntimeclass_linker.cc::InsertClassInsertClass函数判断类是否在列表中:如果在列表中,则直接返回;如果没有,则添加到列表。artruntimeclass_linker.cc::LoadClassLoadClass函数获取了dex文件中的classData部分,然后去调用LoadClassMembersartruntimeclass_linker.cc::LoadClassMembersLoadClassMembers函数主要逻辑是遍历类中的所有字段和函数,然后分别调用LoadField,LoadMethod和LinkCodeartruntimeclass_linker.cc::LoadFieldLoadField设置ArtField结构中字段的一些值artruntimeclass_linker.cc::LoadMethodLoadMethod函数主要做设置ArtMethod结构的一些属性,比如函数的MethodIdx,CodeItem在dex文件中的偏移,函数的AccessFlag等。延申:ArtMethod是存储Java函数在虚拟机内相关信息的结构,它不同于mirror命名空间下的Method类,ArtMethod在Java层没有类与之直接映射。artruntimeclass_linker.cc::LinkCodeLinkCode函数主要功能是判断代码是否编译从而为函数设置入口代码。以上就是关于“Android类加载流程是什么”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注百云主机行业资讯频道。

相关推荐: Git管理分支怎么创建

本篇内容介绍了“Git管理分支怎么创建”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!分支操作允许创建另一条开发线。我们可以使用此操作将开发过程分为两个不同的方向…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

(0)
打赏 微信扫一扫 微信扫一扫
上一篇 04/07 19:45
下一篇 04/07 19:45

相关推荐