且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

【我的Android进阶之旅】Android插件化开发学习资料

更新时间:2022-02-26 03:19:14

1、目前开源的插件开发框架大致有哪些?

1、 任玉刚dynamic-load-apk
Github 地址:https://github.com/singwhatiwanna/dynamic-load-apk

2、mmyyddDirect-Load-apk
Github 地址:https://github.com/mmyydd/Direct-Load-apk

3、limpoxeAndroid-Plugin-Framework
Github 地址:https://github.com/limpoxe/Android-Plugin-Framework

4、bunnyblueACDD
Github 地址:https://github.com/bunnyblue/ACDD

5、携程网DynamicAPK
Github 地址:https://github.com/CtripMobile/DynamicAPK

6、奇虎360DroidPlugin
Github 地址:https://github.com/DroidPluginTeam/DroidPlugin/blob/master/readme_cn.md

7、AndroidDynamicLoader
Github 地址:https://github.com/mmin18/AndroidDynamicLoader

8、Galenlin 林光亮Small
Github 地址:https://github.com/wequick/Small

世界那么大,组件那么小。Small,做最轻巧的跨平台插件化框架。– Galenlin

9、Android Frontia

2、插件化介绍和原理博客

Android博客周刊专题之#插件化开发#

Android 插件化 动态升级

Android 动态加载技术文章以及相关项目

Small Android FAQ

android-dynamic-load-awesome

农民伯伯 Android动态加载jar/dex

GMTC演讲PPT - Small插件化轻巧之道

Android 动态加载技术文章以及相关项目

3、框架对比

原文地址: https://github.com/wequick/Small/edit/master/Android/COMPARISION.md

为方便列表,简写如下:

  DyLA  : Dynamic-load-apk          @singwhatiwanna, 百度
  DiLA  : Direct-Load-apk           @FinalLody
  APF   : Android-Plugin-Framework  @limpoxe
  ACDD  : ACDD                      @bunnyblue
  DyAPK : DynamicAPK                @TediWang, 携程
  DPG   : DroidPlugin               @cmzy, 360
  • 功能
\ DyLA DiLA ACDD DyAPK DPG APF Small
加载非独立插件[1] × x ×
加载.so后缀插件 × × ! [2] × × ×
Activity生命周期
Service动态注册 × × × x [3]
资源分包共享[4] × × ! [5] ! [5] × ! [6]
公共插件打包共享[7] × × × × × ×
支持AppCompat[8] × × × × × ×
支持本地网页组件 × × × × × ×
支持联调插件[9] × x × × × ×

[1] 独立插件:一个完整的apk包,可以独立运行。比如从你的程序跑起淘宝、QQ,但这加载起来是要闹哪样?

     非独立插件:依赖于宿主,宿主是个壳,插件可使用其资源代码并分离之以最小化,这才是业务需要嘛。

     – “所有不能加载非独立插件的插件化框架都是耍流氓”

[2] ACDD加载.so用了Native方法(libdexopt.so),不是Java层,源码见dexopt.cpp

[3] Service更新频度低,可预先注册在宿主的manifest中,如果没有很好的理由说服我,现不支持。

[4] 要实现宿主、各个插件资源可互相访问,需要对他们的资源进行分段处理以避免冲突。

[5] 这些框架修改aapt源码、重编、覆盖SDK Manager下载的aapt,我只想说“杀(wan)鸡(de)焉(kai)用(xin)牛(jiu)刀(hao)”

     Small使用gradle-small-plugin,在后期修改二进制文件,实现了PP段分区。

[6] 使用public-padding对资源id的TT段进行分区,分开了宿主和插件。但是插件之间无法分段。

[7] 除了宿主提供一些公共资源与代码外,我们仍需封装一些业务层面的公共库,这些库被其他插件所依赖。

     公共插件打包的目的就是可以单独更新公共库插件,并且相关插件不需要动到。

[8] AppCompat: Android Studio默认添加的主题包,Google主推的Metrial Design包也依赖于此。大势所趋。

[9] 联调插件:使用Android Studio调试![