Lipland是一个基于Android系统的轻量级插件框架(Lightweight plug-in framework for android),一个apk可以免修改、免安装,直接运行在插件系统内,插件可动态网络下载更新。Lipland开发宗旨是:轻便灵活、简单易用、功能稳定、兼容性好。
Lipland在360搜索app中全面应用两年多,几乎每一个独立的入口都是一个插件,插件的开发团队各不相同,各个插件又在各大不同的产品线中得到复用,有的插件本身也是一个独立发布的产品。这种插件化技术,为产品的解耦合和复用带来了极高的效益,功能升级对用户零打扰。
Lipland由 li - 轻量级、pl - 插件、and - 安卓 英文缩写组合而来。 有些同学说不会读,来,看我口型:李 ~ 普 ~ 兰 ~ 德。对没错,就是这样。。
- 轻便易用,体积小,仅支持android 4.0.0或以上版本,不背历史包袱。
- 插件为一个独立apk,免修改,免安装,动态更新升级。
- 支持android四大组件:Activity、Service、ContentProvider、BroadcastReceiver
- 支持插件so加载、Action/Action-Filter、AIDL等。
- 支持android所有的资源定义,不需要任何特殊处理。
- 支持插件与宿主共享jar包、共享so库的机制,可以很好的为插件瘦身。
- 单进程,用一个独立的插件进程统一管理插件和内存,复杂度低。
- 插件更新系统,通过一个简单的配置文件即可实现插件更新。
- 功能模块相对独立,想要单独拆分的应用。
- 应用体积过大,想要瘦身/减流。
- 想要将功能动态化,后台升级,提升用户体验的应用。
- 复用现有产品功能,减少代码堆砌,降低应用耦合度。
- 不同团队间的合作开发。
Lipland允许你的插件直接使用宿主的类和so库,想要共享的库直接放在宿主中即可。
Lipland的类、库加载顺序如下:
-
jar包:插件先从自身的ClassLoader加载类,如果找不到类,则从宿主的ClassLoader中加载。
-
so库:同名so库,先从自身libs下加载,如果找不到库,则从宿主的libs加载。
该机制可以很大程度的缩减插件体积,一些公用库,例如volley、android-support-v4.ja、v7兼容包、第三方sdk等,插件直接用provided方式引用,这样这些库不会编译到插件中。如果是so库,可以不包含在插件中。
在某些情况下,插件想要使用一个不同版本的类、jar包或者so库,那么这个插件只需要把该库以正常的编译方式打包进去即可(jar包使用compile方式编译,so放入libs下)。
- 在你的应用的Application.onCreate()中加入以下代码,即可完成插件框架的安装。
PluginManager.setup(app);
- 安装插件
PluginManager.getInstance().install("myplugin","1.0.0","/sdcard/myplugin.apk");
- 启动插件
- className方式
Intent intent = new Intent();
intent.setClassName("com.testplugin","com.testplugin.MainActivity");
context.startActivity(intent);
- Action方式
Intent intent = new Intent();
intent.setAction("action.testplugin.main");
context.startActivity(intent);
捆包安装、动态升级、插件管理等更多详细配置和使用方法参见文档和demo。
-
Gradle
将编译后的aar包放在主程序的libs下,在gradle中加入以下内容:
dependencies { compile(name: 'Lipland_v2.0.6', ext: 'aar') } repositories { flatDir{ dirs 'libs'; } }
-
eclipse
1. 将编译好的jar包放入主程序的libs下。
2. 将AndroidManifest.xml中的配置拷贝到主工程中。
gradle也可以使用jar包,配置方式和eclipse一样,建议使用gradle和.aar,部分配置可以自动生成,比较方便。
增加一个插件有三种方式:
-
捆包插件
即将插件自带在app中,适合优先级高的插件。在assets/plugin/default_install.xml添加一个插件信息节点,并将插件放入同目录下即可,app第一次启动后,会进行安装。具体配置参加demo。
-
插件更新
插件更新系统在插件未安装的情况下,会将插件直接安装,利用它可以动态的增加插件。
-
直接安装
调用Api直接安装,该方法适合灵活性要求比较高,需要自己管理插件的场景,详情见前述安装插件或者文档。
360搜索
360语音助手
360身边生活
360免费wifi
360导航
360盖娅
360语音助手(功能与独立版一致)
360身边生活(功能与独立版一致)
360导航
360小说
360天气
360影视
360视频播放器
滴滴打车(SDK)
360看图插件
360美图
360扫码
拍题插件
饭补插件
玩图插件
等等