1. 插件化的原理html
是 Java ClassLoader 的原理:Java ClassLoader基础 java
经常使用的其余解决方法还包括:Google Multidex,用 H5 代替部分逻辑,删无用代码,买付费版的 Proguardandroid
当插件化做用包括:(1) 模块解耦,(2) 动态升级,(3) 高效并行开发(编译速度更快) (4) 按需加载,内存占用更低 (5) 节省升级流量 git
2. 插件化github
Android 插件化 —— 指将一个程序划分为不一样的部分,好比通常 App 的皮肤样式就能够当作一个插件缓存
Android 组件化 —— 这个概念实际跟上面相差不那么明显,组件和插件较大的区别就是:组件是指通用及复用性较高的构件,好比图片缓存就能够当作一个组件被多个 App 共用app
Android 动态加载 —— 这个实际是更高层次的概念,也有叫法是热加载或 Android 动态部署,指容器(App)在运⾏状态下动态加载某个模块,从而新增功能或改变某⼀部分行为 框架
3. 开源的插件化框架有:ide
(1) DynamicLoadApk
GitHub:https://github.com/singwhatiwanna/dynamic-load-apk组件化
项目描述:这个项目实现了一部分的动态加载,原理是 DexClassLoader 加 Activity 代理,能够看看。即在容器中注册几个代理的 Activity,启动插件的 Activity 时实际启动的都是代理的 Activity,这样就解决了 Activity 必须注册的问题。
(2) AndroidDynamicLoader
GitHub:https://github.com/mmin18/AndroidDynamicLoader
这是点评一个工程师介绍的方式,和上面不一样的是:他不是用代理 Activity 的方式实现而是用 Fragment 以及 schema 的方式实现
(3) Android PluginManager
GitHub:https://github.com/houkx/android-pluginmgr
项目描述:这个项目的原理实际也是 DexClassLoader 加 Activity 代理,不一样的是上面的 dynamic-load-apk 项目中,插件须要依赖框架的 lib,插件组件继承框架 lib 的 Base 组件。而这个框架经过字节码操做动态生成一个子类去继承插件组件解决插件必须依赖框架的问题,从而达到插件无需作任何改动(理论上)便可加载的效果。
(4) DroidPlugin
GitHub: https://github.com/Qihoo360/DroidPlugin
项目描述:这是360手机助手在Android系统上实现了一种新的插件机制:它能够在无需安装、修改的状况下运行APK文件.(支持Androd 2.3以上系统)
(5) DynamicAPK
GitHub: https://github.com/CtripMobile/DynamicAPK
项目描述:http://www.open-open.com/lib/view/open1446714684951.html
淘宝伯奎:Android插件化及动态部署—ATLAS http://v.youku.com/v_show/id_XNTMzMjYzMzM2.html
360技术团队地址:http://blogs.360.cn/blog/proxydelegate-application/
实现一些特殊需求,如界面换肤、插件化等,咱们但愿改变应用的运行环境(surrounding)。例如,咱们但愿某个应用在运行时,全部Class(包括自定义Application,下面假设它叫MyApplication)都被一个自定义的ClassLoader加载。
要实现这个需求,须要在MyApplication被加载以前,先替换掉API层的默认ClassLoader,不然MyApplication就会被默认ClassLoader加载。但这会产生一个悖论,MyApplication被加载以前,没有任何应用代码能够运行,替换ClassLoader没法办到。Proxy/Delegate Application框架就是用来解决这类问题的。
在Proxy/Delegate Application框架里,应用一共有两个Application对象,一个称为ProxyApplication,另外一个称为DelegateApplication:
(1) ProxyApplication:框架会提供一个ProxyApplication抽象基类(abstract class),使用者须要继承这个类,并重载其initProxyApplication()方法,在其中改变surrounding,如替换ClassLoader等。
(2) DelegateApplication:即应用原有的Application,应用从getApplicationContext()等方法中取到的都是DelegateApplication。注意DelegateApplication只是一个称谓,并无一个叫DelegateApplication的基类存在。