美文网首页第三方库源码分析Android好文章Android知识
[Android]用架构师角度看插件化(1)-Replugin入

[Android]用架构师角度看插件化(1)-Replugin入

作者: CangWang | 来源:发表于2017-07-08 20:07 被阅读3325次

    大家好,我系苍王。

    以下是我这个系列的相关文章,有兴趣可以参考一下,可以给个喜欢或者关注我的文章。

    [Android]如何做一个崩溃率少于千分之三噶应用app--章节列表

    多谢一直以来的支持,组件化的内容,应该会有一段时间不再更新,一些非常关键的技术将会在我将要出版的组件化书籍中提及。

    组件化模块化的开发适合于中小型企业的业务叠加,和代码重用。而插件化的开发将组件化和模块的功能完全解耦出来。

    在国内的开发环境,插件化是用户体验和开发周期的产物,我们要做的是顺应潮流,正如我组件化&模块化&插件化演进中分析一样。

    Replugin,滴滴出品的VirtualApk,还有阿里出版了一本热修复框架的书籍,这些估计都足够很多人学习很久了。

    这里我将挑选了一下Replugin的技术作为接下来方向的研究,将会给大家剖析他的运行过程,希望大家不腻赐教。

    将会有多个章节介绍,希望大家一起进步吧。

    一.Github介绍

    Replugin地址(https://github.com/Qihoo360/RePlugin)

    强大的介绍,希望大家都去看看起介绍,有个基础的了解吧。

    其一些配置原理再这里(详细介绍

    这里是当然看完了应该就对他有一个基本的了解了。

    只有真正深切去了解过插件化,才明白它做到的飞跃性。

    二.工程布局

    下载一下源码,我们可以看到,其里面包含了五个文档。

    replugin-host-gradle 是宿主gradle脚本

    replugin-host-library 是宿主library源代码,我们依赖的源代码就是这个了

    replugin-plugin-gradle 插件的Gradle脚本

    replugin-plugin-library 插件的源代码,插件都需要依赖这个

    replugin-sample 当然就是例子啦

    我们看一下replugin-sample,里面包含了host宿主,还有两个plugin的的demo,这章就先研究这个例子,然后下节将会开始深入的源码介绍。

    三.host宿主

    首先是在build.gradle的classpath引用 gradle

    然后源码中引用

    然后我们需要在Application中配置

    这里是动态配置Application

    然后当然就是一般关心的跳转问题

    这里demo1是包名,然后之后的是跳转Activity的地址

    Replugin.startActivity是使用坑位跳转的,坑位在哪里声明,下一章节会介绍。

    然后官网有介绍一些跳转方法,最重要是用到隐式跳转,通过包名和类跳转。

    然后还有跳转Fragment的示例

    这里面想要加载插件的Fragment,需要先注册Fragment整个的包名+地址名称。

    然后还需要Replugin中的ClassLoader机制,而这里每个dex貌似都会有一个classloader,这个之后会介绍。

    这里面loadCalss是先获取到Fragment为Class对象,然后通过asSubClass改为Fragment.clas类型,当然newInstance就是真正的创建对象了。

    然后我们看一下app中,安装前需要内置插件,将插件(XXX.jar)放到assets里面,将会和app一起跟随安装,这是作为连同宿主初始时加载某些必要插件的内置安装。

    我们看一下引用了replugin的gradle命令会有什么额外的编译

    rpGenerateDebugBuiltinJson编译出插件的json目录

    rpGenerateDebugHostConfig会显示出整个Replugin的配置

    rpShowPluginsDebug命令是打印出插件版本信息。

    rpGenerateReleaseBuitInJson、rpGenerateReleaseHostConfig、rpShowPluginsRelease编译出Release版本的文件

    四.lib插件

    我们插件还是一样需要Gradle配置

    之前提及到startActivity的方式,Replugin中在插件内因为有ClassLoader是独立,使用平常的startActivity的跳转方式。而插件间使用startActivity跳转,需要使用Replugin.startActivity或者隐式跳转来完成。

    而插件间的通信,Replugin是使用了aidl的方式来完成

    这里需要使用远程通信来完成。Android一开始设计IBinder就是设计为跨进程间的通信的,而这里面就算插件运行为独立进程也是没问题的。

    我们再看一下AndroidManifest,声明方式和平常的Android工程并无不同

    值得注意的是,AndroidManifest通过meta-data来声明的。

    然后看一下Lib中加载的额外的Gradle命令

    运行reInstallPluginDebug来运行安装,我们看到是将其放到sdk,然后再安装

    然后使用reRunPluginDebug应该是运行命令,无奈提示失败

    以后修复后再给大家介绍。

    总结

    我们入门剖析Replugin。

    (1)配置接入-接入成本最低,并不需要编写一般的占坑规则

    (2)跳转效率-插件内原生跳转,插件外隐式跳转或占坑跳转

    (3)插件通信-插件间通信使用aidl,这样就算插件独立进程依然通信正常。

    (4)维护成本-hook点只有一个,减少最少意味着维护成本也降低

    (5)加载方式-宿主内置jar(未发现jar生成方式)和外置加载apk加载的方式

    这些就是接入插件化需要估量的方面,然后深化研究代价利弊才能更加深入一步步评估出适合你们项目的插件化。

    希望以后大家多多关注!下期将不会再在简书首发哦。

    顺应潮流,才能试着改变潮流。

    这里发一条广告,我创立了一个小密圈。

    每天会分享java基础,组件化插件化相关,音视频开源项目分享。最重要,带有发布者分析的点评。

    还有最新插件化框架的分析和运用,组件化架构技巧的分享,都尽在这里。

    不需要一顿饭的价钱 ,68/一整年的学习资料。

    付费是真干货,真正节省时间的途径。

    来到这里希望影响你的不只是技术提升,而且是人生的架构的导向。

    已经有超过180+的小伙伴加入了我们的行列了,并且持续增加,让我们一起成长,群内还有不定时福利。

    下一节将会更精彩,敬请期待!!!

    相关文章

      网友评论

      • 我是菜鸟请指教:楼主 按照官网配置了外置插件 就是调不起来 怎么搞
        王玉鹏Roc:不应该的,是不是环境问题,你可以重新clone
        下代码,再调试下,应该没问题,有问题可以直接联系我qq871791801,我是作者之一,可以为你解答一些疑惑。
      • 10ec977eadee:弄了好几天,同样的代码同样的配置,不同的电脑,不同的结果。同一台电脑,前一刻怎么都不行,后来又可以。这replugin很不成熟啊
        CangWang:@罗伊叶 刚开源几天,不稳定是正常吗的,可以多看看github的case会有帮助
      • 10ec977eadee:实际操作起来,各种跑不起来

      本文标题:[Android]用架构师角度看插件化(1)-Replugin入

      本文链接:https://www.haomeiwen.com/subject/vnqrhxtx.html