插件化学习读书笔记(一)

1.定义

插件化:是用于免安装的apk,这个免安装的apk可以理解为插件,而支持插件的应用一般称为宿主,很早之前使用过的plungin机制

  2.插件化可以解决的问题:

1)当APP的功能模块越来越多时,体积就会越来越大

2)模块之间的耦合度高,开发沟通成本越来越高

3)当方法数目比较大时,APP占用的内存也会越来越大

4)应用之间的相互调用

3.插件化的实现

如何实现一个插件化呢?

插件的apk时没有加载的,我们是如何加载的呢?

如所知,一个应用主要有源码和资源组成的?所以我们就可以理解为:如何加载的资源?如何加载的源码?还有宿主类和插件类的调用问题,主要指四大组件,即宿主类是如何调用的插件类的?

4.先分析类加载的原理

4.1基本的ClassLoder介绍

Android的类加载(classLoader)

ClassLoader:

ClassLoader是一个抽象类,实现类主要分为两类:系统类加载器和自定义类加载

系统类加载如下:

BootClassLoader: 用于加载Android framework层的class文件

PathClassLoader:用于android应用程序类加载器,主要加载的文件为:指定的dex文件,jar,zip,apk中的class.dex

DexClassLoader:指定的dex文件,jar,zip,apk中的class.dex

类继承如下:

而PathClassLoader和DexClassLoader都是继承自BaseDexClassLoader,这两者的区别在哪里?

查看源码如下:

Android10.0

源码为Android7.0

从源码中看到两者在Android8.0以上代码都是调用BaseDexClassLoader 的构造函数,而在以下唯一的区别为:DexClassLoader传入的参数为new File(optimizdeDirectory),之后的版本变为null

4.2类加载原理

分析如何用类加载器加载一个类,首先看一段如何使用类加载器加载的调用代码:

通过看源码,需要先看DexClassLoader的loadClass方法,通过往上查找,父类BaseDexClassLoader也没有实现此方法,最终在ClassLoader中查找此方法的实现,代码如下:

源码为Android10的:

ClassLoader的loadClass方法,其主要实现的功能为:

1.首先调用findLoaderClass方法来检查是否已经加载此类,最终调用到Native的方法去查找,如果查找到,直接返回

2.如果没有查找到此类,如果parent不为null,会调用parent的loaderClass方法进行加载,

parent.loadClass,parent 为BootClassLoader,其实现在ClassLoader类中,所以else中的一般不会被执行到

   2.1  如果 parent即BootClassLoder调用findLoaderClass还没有找到加载此类,继续调用findclass来查找

  2.2 如果调用BootClassLoder的 findclass方法没有找到加载类

3.继续调用findclass

上面的主要思想为:首先检查这个类是否被加载了,如果被加载了,直接加载并返回。如果没有被加载,且parent不为

null,就会调用parent的loadClass进行加载,依次递归,如果找到了就直接返回,如果没有找到或者无法加载,才会自己加载

,这个过程叫双亲委托机制

loaderclass的调用方法代码如下

findclass的调用代码如下:

 

流程如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值