安卓插件化学习 - 类的加载

本文探讨了安卓插件化的类加载原理,通过分析ClassLoader的继承关系,阐述了如何利用DexClassLoader加载插件APK,并将插件的dexElements合并到宿主APK,以实现在宿主中调用插件类和方法。文章通过代码示例展示了在宿主APK中创建插件管理器、配置AndroidManifest.xml、初始化插件以及调用插件方法的步骤。
摘要由CSDN通过智能技术生成

引言

本次博客主要学习插件化知识,插件化多用于热修复,app主从功能分离等。通过学习ClassLoader的基本知识掌握类的加载。

一、类的加载

1. 原理

类加载器的继承关系
类加载器之间的继承关系如上图所示,一般宿主apk通过PathClassLoader进行加载,插件apk通过DexClassLoader进行加载。宿主apk启动时,类加载顺序图如下。
宿主类加载

从宿主的类加载顺序看,最终调用到了宿主dexElements,那么我们实现插件化的方法是用DexClassLoader加载插件apk后,利用反射获取插件的dexElements,然后拷贝到宿主的dexElements。这样宿主apk就有了插件apk的dexElements信息,也就是能在宿主apk内利用反射调用到插件的类、方法等。方案如下。
插件化方案

这里注意下:
1)实例化DexClassLoader加载插件宿主类加载没有先后顺序之分,两者的目的在于改变dexElements的信息。
2)而在宿主调用插件化的类、方法之前,就必须要把插件的dexElements合并到宿主的dexElements里。
3)源码中,类PathClassLoader和类DexClassLoader中的方法和变量都能在其父类BaseDexClassLoader中找到,子类的构造函数提供参数输入。

2. 代码

2.1 宿主apk代码

2.1.1 插件管理器

创建一个空白activity的工程,用一个单例加载插件apk,此段代码为核心代码。

public class PluginManager {
   
    private static final String TAG = "PluginManager";
    private static PluginManager instance;
    private Context context;

    private PluginManager(Context context) {
   
        this.context = context;
    }

    public static PluginManager getInstance(Context context) {
   
        if (instance == null) {
   
            instance = new PluginManager(context);
        }
        return instance;
    }

    public void init() {
   
        try {
   
            loadApk();
        } catch (Exception e) {
   
            e.printStackTrace();
        }
    }

    private void loadApk() throws Exception {
   
        //加载插件的apk路径
        String pluginApkPath = context.getExternalFilesDir(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值