一、Android插件化发展历程
序号 | 插件方案名 | 发布时间 | 厂商 | 特点 | 开源地址 |
---|---|---|---|---|---|
1 | dynamicApkLoader | 2012年7月 | 大众点评(屠毅敏) | 利用Fragment代理实现页面跳转,首次使用了通过反射AssetManager来调用addAsset()方法实现处理插件中的资源 | https://github.com/mmin18/AndroidDynamicLoader |
2 | dynamic-load-apk | 百度(任玉刚) | 利用壳Activity来代理实现插件中的PluginActivity,Service也类似 | https://github.com/singwhatiwanna/dynamic-load-apk | |
3 | CJFrameForAndroid | 张涛 | DynamicLoadApk类似,但是解决了Activity的LaunchMode问题 | https://github.com/kymjs/CJFrameForAndroid | |
4 | android-pluginmgr | houkx | 首次提出在AndroidManifest中埋stubActivity实现欺骗AMS,使用dexmaker.jar动态生成stubActivity | https://github.com/houkx/android-pluginmgr | |
5 | direct-load-apk | loady | 对android-pluginmgr实现改造,hook了Instrumentation,并结合了dynamicLoadApk的静态代理和stub桩位欺骗AMS思想 | https://github.com/mmyydd/Direct-Load-apk | |
6 | virtualApp | virtualApp | Android虚拟化技术,可以直接加载独立的第三方应用。完全模拟了一个Android运行环境 | https://github.com/asLody/VirtualApp | |
7 | android-plugin-framework | limpoxe | Android插件框架,免安装运行插件APK ,支持独立插件和非独立插件 | https://github.com/limpoxe/Android-Plugin-Framework | |
8 | android-dynamical-loading | kaedea | https://github.com/kaedea/android-dynamical-loading | ||
9 | DroidPlugin | 360 | 通过stub欺骗AMS和hook instrumentation实现Activity的启动,完全模拟了一个Android运行环境。可以加载独立的第三方app | https://github.com/DroidPluginTeam/DroidPlugin | |
10 | openAtlas(ACDD) | 阿里 | 通过修改aapt来修改插件的资源id。hook了instrumentation来实现Activity启动,hook了ContextWrapper并重写getResource来获取插件资源 | ||
11 | DynamicApk | 携程 | 基于阿里的openAtlas,定制了一些相关业务特性 | ||
12 | small | 林光亮 | 单个classloader。hook了instrumentation,修改了R.java与sources.arsc文件的id | https://github.com/wequick/Small | |
13 | zeus | 掌阅 | https://github.com/iReaderAndroid/ZeusPlugin | ||
14 | Atlas | 阿里 | https://github.com/alibaba/atlas | ||
15 | RePlugin | 360 | https://github.com/Qihoo360/RePlugin | ||
16 | VirtualApk | 滴滴 | https://github.com/didi/VirtualAPK | ||
17 | shadow | 腾讯 | https://github.com/Tencent/Shadow |
二、插件化技术的演变
三、插件化的技术细节
- Activity的启动过程分析
1.1、Android版本小于26
1.2、Android版本大于等于26
1.3、原理归纳