美文网首页
Android插件化原理

Android插件化原理

作者: Athephoenix | 来源:发表于2020-06-12 21:27 被阅读0次

学以致用,但暂时不用不代表不学,知识储备重在平时。
不积跬步,无以至千里。

插件化技术的作用

首先,它的作用是什么,解决什么问题;
其次,实现的方式有那些。
最后,现有的热门框架有那些可以直接使用和学习;

插件化,把功能或者模块抽出来单独处理,减小宿主app的体积。基于此种特性可以实现诸如,热修复,补丁更新等,当然这里只是从实现原理上来归类,并非这些技术之间关系。

已有的主要分为三种实现原理:

  1. 类加载机制
  2. InstantRun
  3. native层method替换

本篇主要带你了解基于类加载机制实现插件化。

基于类加载机制

PathClassLoader 可以加载已经安装的apk文件
DexClassLoader 可以加载任意位置的zip文件

  try {
            // 1.加载应用程序的dex
            PathClassLoader pathLoader = (PathClassLoader) appContext.getClassLoader();
            for (File dex : loadedDex) {
                // 2.加载指定的修复的dex文件
                DexClassLoader dexLoader = new DexClassLoader(
                        dex.getAbsolutePath(),// 修复好的dex(补丁)所在目录
                        fopt.getAbsolutePath(),// 存放dex的解压目录(用于jar、zip、apk格式的补丁)
                        null,// 加载dex时需要的库
                        pathLoader// 父类加载器
                );
                // 3.合并
                Object dexPathList = getPathList(dexLoader);
                Object pathPathList = getPathList(pathLoader);
                Object leftDexElements = getDexElements(dexPathList);
                Object rightDexElements = getDexElements(pathPathList);
                // 合并完成
                Object dexElements = combineArray(leftDexElements, rightDexElements);
                // 重写给PathList里面的Element[] dexElements;赋值
                Object pathList = getPathList(pathLoader);// 一定要重新获取,不要用pathPathList,会报错
                setField(pathList, pathList.getClass(), "dexElements", dexElements);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

通过解析zip(可能包含dex,jar,aar等)文件获得dex文件,并且将其和加入Element[]数组,并和app本身的element数组合并,然后通过反射将合并后的结果赋值给app实际使用的pathLoader。

基于Android虚拟机的运行状态,会在需要使用时,从内存中查找class,使用更新后的功能,进而完成我们的需求。那么为什么从内存中能查找到我们更新后的lclass,而不是之前的class呢。
首先,已经将更新后的包含class文件的dex文件插在Element[]首位,其次,classLoader类在设计时遵循双亲委派/可见性/唯一性原则,简单的理解从首个dex文件中查找到更新后的class文件之后,则停止,不再查找后面原来的class。

参考:
https://juejin.im/post/5a0ad2b551882531ba1077a2

相关文章

  • 代理模式

    Android插件化原理解析——Hook机制之动态代理 Android插件化原理解析——概要 Retrofit2 ...

  • 插件化、模块化、组件化、热修复、增量更新、Gradle

    对热修复和插件化的理解 插件化原理分析 模块化实现(好处,原因) 描述清点击 Android Studio 的 b...

  • Android LayoutInflater inflate过程

    Android插件化换肤原理 1.Android View的加载流程分析 Activity的view都是通过set...

  • Android插件化之Small框架原理解析

    Small框架原理简介 Small是Github上一款开源的插件化框架。实现Android插件化的核心技术是:动态...

  • Android部分技术点目录(3)

    目录 Android插件化原理oom_adj的具体计算方法ActivityStack/ActivityRecord...

  • Android插件化原理探究

    Android插件化原理探究 一、简介 android动态加载插件机制一直以来就是探索的热门领域,各种动态加载框架...

  • Android插件化原理

    1,Android平时开发过程中会用到系统资源(android.R),这些资源并不在我们自己的APK中,为何可以引...

  • Android插件化原理

    1、前言 这篇文章来讲一下Android插件化的原理和大概的一个运行流程,最后将一个demo呈现出来。 2、分析 ...

  • Android插件化原理

    学以致用,但暂时不用不代表不学,知识储备重在平时。不积跬步,无以至千里。 插件化技术的作用 首先,它的作用是什么,...

  • Android插件化原理

    Android插件化的具体表现就是在无需将应用包(apk)安装到操作系统,就可以启动的过程,我觉得与其叫插件化,不...

网友评论

      本文标题:Android插件化原理

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