美文网首页
ClassLoader类加载机制与分包原理

ClassLoader类加载机制与分包原理

作者: 铁肩侠 | 来源:发表于2019-08-15 14:37 被阅读0次

    Multidex分包

    热修复,插件技术。

    apk文件目录结构:

    --manifest.xml
    --R 资源文件 drawable string等
    --resource.arsc 资源的索引
    --assets 资源,没id
    --lib so库文件
    --META-INF 签名信息
    --classes.dex 代码

    分包解决的问题:

    andorid5.0之前Dalvik虚拟机,short字段保存一个dex里的方法数,所以最大只能到65535.

    java中常见的类加载器:

    \color{green}{BootstrapClassLoader}
    纯C++实现的类加载器,没有对应的java类,主要加载jre/lib/目录下的核心库。

    \color{green}{ExtClassLoader}
    主要加载jre/lib/ext目录下的扩展包

    \color{green}{AppClassLoader}
    主要加载CLASSPATH路径下的包。

    类加载器如何加载类的:

    QQ图片20190815145242.png
    如图,类加载器是如何加载的呢?

    首先finidLoadedClass(name)方法检查这个类有没有被加载过。

    有就直接返回

    没被加载过就判断有没有父加载器?

    有父类加载器?

    类加载器是APPCalssLoader,parent是EXTClassloader,在EXTclassloader中又会调用loadClass代码如图。

    所以最终都会走parent为空,调用navtive方法findBootstrapClass方法。

    这样的加载机制叫做——父委托加载机制

    QQ图片20190815150354.png
    父委托机制的优点:

    提高软件系统的安全性,自己写的类即使名字和jdk里的相同,这个类不会被加载,任然加载的是jdk里面的类。

    Andorid中常用的类加载器

    \color{green}{PathClassLoader}
    加载/data/app目录下的apk文件,主要用来加载已经安装了的apk
    \color{green}{DexClassLoader}
    加载路径需要在创建时传入,可以加载任何路径下的apk/dex/jar

    gradle的两种动态加载dex

    1,将DexClassLoader插入到PathClassLoader和BootstrapClassLoader中间。

    2,将DexClassLoader的加载路径追加到PathClassLoader路径中

    相关文章

      网友评论

          本文标题:ClassLoader类加载机制与分包原理

          本文链接:https://www.haomeiwen.com/subject/ofrzjctx.html