android开发-类加载

本文详细介绍了APK文件的组成结构,包括关键文件如AndroidManifest.xml、资源文件及DEX执行文件等,并深入探讨了Android中类加载机制,包括PathClassLoader与DexClassLoader的区别及其在解决方法数限制方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 


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
 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值