android开发-类加载

来源:互联网 发布:破解版office for mac 编辑:程序博客网 时间:2024/06/06 13:03


apk的目录
AndroidManifest.xml
assets 这里的资源是没有id的
lib apk的so库
MATE-INF 存放的是签名信息
R 目录 整个项目的资源文件
resource.arsc 资源的索引
classes.dex 优化过的class文件
如果有分包,那么就有多个dex
那么就有多了classes2.dex

分包解决65535的问题 ,android dalivk虚拟机 用short保存方法数目
最多也就65535个方法

DexClassLoader 可以加载任何路径的apk/dex/jar
PathClassLoader只能加载/data/app中的apk,也就是已经安装到手机中的apk


类加载器 api分类的角度
BootStrap ClassLoader
纯c++实现的类加载,没有对应的java类 主要加载jre/lib目录下的核心库
他是启动类加载器,加载完他之后 才能加载其他的类加载库
Extension ClassLoader
类的全名是sun.misc.luncher$ExtClassLoader 主要加载jre/lib/ext目录下的扩展包
App ClassLoader
sun.misc.Luncher$AppClassLoader 主要加载CLASSPATH路径下的包


App ClassLoader的getParent 就是Extension ClassLoader
Extension ClassLoader的parent 是null 但是他会委托BootStrap ClassLoader
BootStrap ClassLoader不会委托 自己会尝试处理

java 的 ClassLoader 的loadClass方法

Class c=findLoadClass(name);//检查是否已经被加载过
if(c==null){
    if(parent!=null){
        c=(parent.loadClass(name,false);//会去%java_home%/jre/lib/ext下去加载
    }else{
        c=findBootstrapClass0(name);//会去%java_home%/jre/lib去加载
    }
    if(c==null){//如果
        c=findClass(name);
    }
    
}

findBootstrapClass0会调用private native findBootstrapClass
这就叫父委托加载机制
为什么引入父委托机制,就是为了 即使创建和JDK一样的的类的时候,一样会去加载系统指定的类,而不是加载我们自定义的假的系统类,这样保证软件的安全性


android的ClassLoader类
protected Class loadClass(String className,boolean resolve){
    Class<?> class =findLoadedClass(className);
    if(class==null){
    try{
    class=parent.loadClass(className);
    
}catch(ClassNotFoundException e){

}
if(class==null){
class=findClass(className);
}
}
}
android的parentLoader永远不会为空,因为构造方法里面判断了,
如果parentLoader为null 会抛出异常
ClassLoader(ClassLoader parentLoader){
    if(parentLoader==null){
        throw new NullPointerException(".....")
    }
parent=parentLoader;
}


android中的ClassLoder 一般是 PathClassLoader

PathClassLoader 需要BootClassLoader  也是继承自ClassLoader

原创粉丝点击