[Android 插件化(一)] DynamicLoadApk的用法

本文介绍了Android插件化的一种实现方案——DynamicLoadApk,包括其特点、使用方法和优缺点。DynamicLoadApk允许插件不依赖宿主,但存在插件开发门槛高、启动时间短等问题。文章还提到了DroidPlugin作为另一种选择,并给出了DynamicLoadApk的使用步骤,包括导入库、创建插件和宿主项目,以及解决相关问题的技巧。
摘要由CSDN通过智能技术生成

1 简介

Android大型项目中为了减小apk的体积,可以采用插件化的方法,即一些不常用的功能独立成插件,当用户需要的使用的时候再从服务器上下载回来,动态加载。这样就避免了为了满足所有用户需求而把功能全部打包到apk,导致apk体积的膨胀。所谓的插件,其实也是一个apk,但是一般都依赖正式对外发布的app,也叫宿主。本篇不讨论插件化的原理和实现难点,只介绍怎么使用以及优缺点。
Android插件化常用实现方案有两种:

(1) DynamicLoadApk
(2) DroidPlugin

这两个是目前比较主流的Android插件化实现方案,在Github的星星数很高,两者的Github地址如下:

DynamicLoadApk的Github地址:https://github.com/singwhatiwanna/dynamic-load-apk
DroidPlugin的Github地址:https://github.com/Qihoo360/DroidPlugin

2 特点

(1) DynamicLoadApk是由团队维护的,但是目前已经很长时间没有更新了,途牛用的就是这个插件化框架
优点:

  • 插件不依赖宿主,对宿主开发者透明,提供三种依赖方式
  • 宿主和插件可以频繁交互,启动时间短

缺点:

  • 插件apk必须实现DLBasePluginActivity,属于侵入式的,以及不支持service
  • 宿主调用插件和插件内部的相互调用都要使用DL提供的方法,而不能使用Android原生的api,例如:启动Activity
  • 插件开发有一套规定,因此造成插件开发门槛高,学习成本高

(2) DroidPlugin是360公司开源的一个框架,已经在360手机助手上使用
优点:

  • 宿主和插件完全隔离,插件不依赖宿主,可以独立安装运行
  • 低入侵设计,插件不需要继承任何类
  • 插件apk和普通apk一样的,所以插件开发没有门槛
  • 有大公司维护,有360手机助手这样的商用app在使用

缺点:

  • 插件启动速度太慢,而且宿主只能调用插件的LaunchMode的Activity,不能调用其他Activity

3 使用方法

(1) 导入Dynamic-load-apk中的lib。
下载Dynamic-load-apk后解压,在Android Studio中新建工程DLTest(自己命名) –> new –> import module –>选择lib所在的目录:dynamic-load-apk-master\DynamicLoadApk\lib

这里写图片描述

(2) 新建插件模块plugin,宿主模块host,这两个模块都是application, 最后都要生成apk的。项目目录如下:

这里写图片描述

编译lib模块,命令是build菜单–>make module lib,目的是为了获得生成的jar文件,jar文件所在位置是lib\build\intermediates\bundles\debug\class.jar,复制jar文件重命名为lib.jar

这里写图片描述

(3) 导入lib.jar到plugin项目的libs目录下,开发plugin项目,注意Activity要继承DLBasePluginActivity ,R.layout.activity_test上就一个TextView,显示”这个界面来自Plugin”
插件项目Plugin的MainActivity:

public class MainActivity extends DLBasePluginActivity {
   

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);
    }
}

注意:plugin模块的buidle.gradle需要修改为如下:

dependencies {
    provided fileTree(dir: 'libs', include: ['*.jar'])
    .........
}

provided 意思是编译时候使用,但不打包到APK中,这样做是因为我们的宿主项目host中已经包含了lib.jar,如果插件中也包含的话就会报找不到plugin中的Activity的错,原因是两个包重复,必须要用host中的DL框架来加载plugin,而不是plugin自带的DL框架

(4) 导入lib.jar到host项目的libs目录下,开发host项目
host项目的MainActivity:

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值