mayinquan / EasyPlug

An Android Plugin Framework

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

EasyPlug--最简单的Android开源插件框架

2015年Android的插件开发热情空前高涨,开源的插件框架也如雨后春笋,初步了解对比了一下各个开源框架,感觉各有千秋。因为面对不同的业务需求,所以在针对性和实现方式上都略有不同。

在没有开源框架的时候,世界很安静,大家只能低头研究android机制和framework的代码自己闭门造车,一直怨恨无人同行且不能踩在前辈的肩膀向上。而今面对扑面而来的开源插件时,大家又陷入选择的泥潭而不能自拔,这真是幸福的烦恼。每个插件框架都各有各的优缺点,当你花时间去熟悉对比完各个插件框架后,你也不一定能百分百确定某某框架一定适合你用。你终于在绕了一圈后又回到起点,是自己写一个框架呢还是用开源框架呢?因为你始终不能确认开源的框架是否能经得起实际项目的检测,害怕还有N多不知道的坑在等着你。

这就是我推出EasyPlug的目的,无他就是要easy!大道至简,对系统HOOK太多也就会依赖太多,GOOGLE或手机产商任何一点小改动都可能会让你的HOOK失效。太多的功能就会面对太多的不稳定性,太多的类和设计模式会加剧开发者学习曲线,所以EasyPlug要在实现既定目标的前提下,用尽可能少的代码来实现一个基本的插件框架,并用实际中的经验帮大家把兼容性的坑填平。

需求

首先明确一下EasyPlug要解决的问题:

模块化开发:模块可以独立开发,甚至在Android设备上安装运行和调式;各个模块应相互解耦,也可以有效的解决DEX方法数65535上限的问题。 不改变原生开发规范:插件的开发仍然按原生开发APK应用的规范,不需要额外学习成本;插件不需要添加需置文件。 动态部署:可以动态安装、卸载和更新插件,安装和更新完成后插件可以直接运行,不需要宿主进程重启。 支持插件调用宿主的类:这样很多基础功能(OKHttp, Retrofit, RxJava等)可以编译打包在宿主的APK中,插件无需将这个包打入自己的APK,在运行时用到会从宿主的类加载器中加载。可以极大的减小插件包的大小,并可以对基础库进行统一处理。 支持常用功能:Activity, Service,自定义View, so库等;

Demo

如何确认EasyPlug是否合适你的项目使用,请直接看如下的例子,直接不做修改将百度和高德地图的DEMO做为插件。

我们写了三个应用:

  1. 宿主APK:运行EasyPlug框架,负责安装卸载插件,插件的跳转入口。
  1. 两个个插件:高德地图Demo,一个简单的APK应用(调用地图DEMO中的自定义MapView)。

当你看完上面的应用,发现适合你的需求,那么最重要的来了:兼容性问题。所以第二步,你需要做的是把上面的DEMO运行在你需要支持的各个手机平台,看是否可个插件都能正常运行。如果有兼容性问题,可以参看源码进行修改,或者发送相关的问题报告给我,我很乐意为大家解决(在下班空闲时间)。

总结

  1. EasyPlug很多地方参考了其他的开源插件框架,有些代码直接从360的DroidPlugin项目复制过来。在此鸣谢。
  2. EasyPlug有别于其他的开源框架,大而全不是我们追求目标,我们的目的是用尽可能少的代码实现基础的框架能力,去除一些对插件核心无关的代码,不使用复杂的设计模块,降低刚接触插件开发的朋友入门的难度。当你掌握这些核心的知识并能灵活运用时,在框架中添加对其他的组件支持并不是难事。
  3. 不要迷信插件框架,插件框架虽然解决了很多现实的业务问题,可以实现模块化开发,极大的提高了开发协同效率。但所有的Android插件框架都或多或少的使用反射(或者HOOK),如果过于依赖它,把所有Android功能都希望在插件中实现,那么势必要承担更大的风险,Android SDK的每次更新都可能威胁到你的框架。这个度的取舍问题需要各自去把握了。
  4. 如果大家在使用中遇到问题,可以在Github上发起讨论。

对Android开发和面试感兴趣的话可以关注我的微信公众号:Android面试启示录

About

An Android Plugin Framework


Languages

Language:Java 100.0%