前言

动态加载系列文章
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文件

更多相关文章

  1. (window)Android(安卓)Studio安装以及Fetching android sdk comp
  2. Android: Java的ClassLoader和Android的ClassLoader的区别
  3. Android(安卓)Studio无法加载API帮助文档问题
  4. Android(安卓)面试题总结之Android(安卓)基础(五)
  5. android与javascript交互(Binding JavaScript code to Android(安
  6. Android加载对话框,异步执行代码的封装类
  7. android 加载图片到gallery
  8. Android(安卓)Selector 与 Shape 基本用法
  9. android中空的view,可以设置为水平线

随机推荐

  1. A first hand look at building an Andro
  2. TableLayout
  3. android sim卡 TelephonyManager类:Androi
  4. Android(安卓)开发 — 开机自启动
  5. 2010.10.30———Android(安卓)03
  6. Android官方入门文档[14]停止和重新启动
  7. android NDK 开发环境配置
  8. android emulator 配置_
  9. 安卓编程小tips
  10. Android(安卓)Jetpack架构组件Navigation