Android插件化及动态加载

缘由及作用

  1. App方法爆棚
    方法数超过了一个Dex最大方法数65535的上限,可以通过多个 Dex来解决这个问题,因而便有了插件化的概念,将一个App 划分为多个插件(Dex或相关格式)
    其他解决方法还包括:删无用代码,用H5代替部分逻辑,买付费版的Proguard

  2. 作用
    a、模块解耦;
    b、动态升级;
    c、高效并行开发(编译速度更快) ;
    d、按需加载,内存占用更低;
    e、节省升级流量

原理

插件化的原理实际是 Java ClassLoader 的原理,具体可参考Java ClassLoader基础

但是对比于java还是有区别的:

  1. Java ClassLoader加载的是class文件到JVM
  2. 对于Android应用程序,本质上使用的是java开发,使用标准的java编译器编译出Class文件,和普通的java开发不同的地方是把class文件再重新打包成dex类型的文件,这种重新打包会对Class文件内部的各种函数表、变量表等进行优化,最终产生了dex文件。

在Android中可以动态加载,但无法像Java中那样方便动态加载jar

原因:Android的虚拟机(Dalvik VM)是不认识Java打出jar的byte code,需要通过dx工具来优化转换成Dalvik byte code才行。这一点在Android项目打包的apk中可以看出:引入其他Jar的内容都被打包进了classes.dex。
这里写图片描述
将打包的jar包拷贝到SDK安装目录android-sdk-windows\platform-tools下,执行命令:dx –dex –output=test.jar suishen_exitpage_sdk.jar

Android ClassLoader

  1. DexClassLoader API地址
    用来从.jar和.apk类型的文件内部加载classes.dex文件,通过这种方式可以执行非安装的程序代码,作为程序的一部分进行运行。
  2. PathClassLoader
    只能加载已经安装到Android系统中的apk文件,一般用于系统应用。

DexClassLoader的使用:
调用构造函数,获得classLoader对象
这里写图片描述
通过classLoader加载相应的类,反射调用方法。
这里写图片描述

开源项目

  1. dynamic-load-apk
    缺点:遵守一套插件apk的开发规范,开发不便。
    DynamicLoadApk 源码解析
    git上源码地址
  2. AndroidDynamicLoader
    git上源码地址

参考文章

Android 插件化
Android动态加载jar/dex
携程Android App插件化和动态加载实践

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值