Android 动态加载(二) - 基础篇(二)

前言

动态加载系列文章
Android 动态加载(一) - 基础篇(一)
Android 动态加载(二) - 基础篇(二)
Android 动态加载(三) - 类的加载流程源码分析
Android 动态加载(四) - 简单demo实现
Android 动态加载(五) - 借尸还魂之代理Activity模式
Android 动态加载(六) - 360开源框架DroidPlugin的使用介绍

上一节我们记录了动态加载了基础知识:动态加载的定义、好处、Java中的动态加载与Android中的动态加载、及Android中动态加载的大致流程,那么这一节我们就来记录下ClassLoader类加载器、动态加载的两种方式。

1. 什么是类加载器?


类加载器就是ClassLoader,专门用于处理类加载问题,一个运行中的 APP不仅只有一个类加载器;

Java虚拟机使用Java类如下:
Java编译器把 .java文件 编译为 .class文件,类加载器只会读取 .class文件,将其转为 Class实例,每个这样的实例表示一个Java类,调用 newInstance()可以创建该类的一个对象

2. 动态加载的两种方式


2.1 动态加载so库

动态加载 so库是最早的动态加载,so库文件可以放在 Apk文件内部,也可以放在外部存储,可以把 so库挪动到 Apk外部,可以减小 Apk体积,因为很多的 so库体积比较大;

2.2 动态加载dex、jar、apk

动态加载 dex、jar、apk文件,采用ClassLoader,不能直接用ClassLoader,只能使用其子类,DexClassLoader或者PathClassLoader,虚拟机就是用 类加载器ClassLoader加载它们的class,然后调用 newInstance()方法;

  • DexClassLoader:可以加载jar/apk/dex,可以加载sd卡中未安装的apk;
  • PathClassLoader:只能加载系统中已经安装过的 apk;

无论哪种动态加载,加载的可执行文件一定要存放在内部存储

基于类加载器ClassLoader动态加载的开源项目,大致分为3种形式:

1>:简单的动态加载模式:

Android的app在运行时候在运行的时候使用 ClassLoader动态加载 dex文件很简单,不用重新安装app,直接可以更新。这种方式是不能使用 Apk插件中的 res资源,也就是说不能使用 插件中的xml文件按、图片、AndroidManifest、启动新的Activity,都是不可以的;

可以一开始就把 要用到的所有res资源都放到主Apk中、把所有Activity全部写到AndroidManifest中,只去通过动态加载更新代码,不更新res资源,如果需要修改UI界面,直接通过 Java代码动态创建布局的方式绕开 xml文件,也可以使用 Fragment代替Activity,这样可以最大限度避开 "无法注册插件中的Activity的限制" ;

这种不能直接启动插件Apk插件中的 Activity;

2>:代理Activity模式:

代理Activity模式就是:直接从主Apk中是不能启动 插件Apk中的TestActivity,因为插件中的 TestActivity没有在 主Apk中的AndroidManifest中注册,所以在这个时候可以定义一个 ProxyActivity先占一个坑,用于代替 插件中的TestActivity注册,这个时候就已经从 主Apk中的 MainActivity跳转到 插件Apk中的TestActivity,最后还需要换回来,采用 hook技术,具体可以参照我之前的文章

插件化架构 - 借尸还魂之代理Activity模式

  • 代理Activity模式特点:
    a:主Apk可以启动 自身没有安装的插件Apk;
    b:插件Apk可以试任意第三方的Apk,可独立运行;
3>:其他动态修改代码技术

jni、hook动态加载,前者在虚拟机操作,后者在Native层工作,直接修改运行时内存地址,不用重启App就能生效;

3. 基于ClassLoader动态加载的特点


动态修复App或者动态修复Bug,都需要重启App才能生效;

4. 第三方动态加载开源项目


1>:Small;
2>:DL动态加载框架;
3>:360的RePlugin;
4>:360的DroidPlugin;
这个可以参照我之前写的文章:
360开源框架DroidPlugin的使用介绍
5>:滴滴的VirtualAPK;

下一节就写一个示例代码来演示 动态加载的本地的 assets下边的 jar文件

你可能感兴趣的:(Android 动态加载(二) - 基础篇(二))