对于App而言,所谓的插件化,个人的理解就是把一个完整的App拆分成宿主和插件两大部分,我们在宿主app运行时可以动态的载入或者替换插件的部分,插件不仅是对宿主功能的扩展而且还能减小宿主的负担,所谓的宿主就是运行的app,插件即宿主运行时加载的apk文件,这样宿主和插件结合的方案技术就是插件化。
-
解耦,独立各大模块的业务成为插件,互不干扰,即用即插,方便开发与维护。当业务庞大、繁琐之后,是否存在牵一发而动全身的感觉,是否存在逻辑过于复杂、耦合度较高、难以掌控整个项目。
-
加快编译。每次修改后无需重新编辑整个工程项目,可以单独编译某个插件工程,对于庞大的项目而言,速度就是至上的武功。
-
动态更新。无需重新下载与安装app,可以单独下载某个插件apk,直接加载,从动态更新、包体积和流量上感觉是个不错的选择。
-
模块定制。需要什么模块下载什么模块,无需让app变得庞大,所需所得。
大家其实都知道,Android 应用本身是基于魔改的 Java 虚拟机的,动态加载代码简直不要太简单,只需要使用 DexClassLoader 加载 Apk,然后反射里面的代码就可以了。
但是光能反射代码是没有意义的,插件化真正的魅力在于,可以动态加载执行 Android 组件(即 Activity、Service、BroadcastReceiver、ContentProvider、Fragment)等。
仔细想一下,其实要做到这一点是有难度的,最主要的阻碍是,四大组件是在系统里面中注册的,具体来说是在 Android 系统的 ActivityManagerService (AMS) 和 PackageManagerService (PMS) 中注册的,而四大组件的解析和启动都需要依赖 AMS 和 PMS,如何欺骗系统,让他承认一个未安装的 Apk 中的组件,就是插件化的最大难点。
另外,资源(特指 R 中引用的资源,如 layout、values 等)也是一大问题,想象一下你在宿主进程中使用反射加载了一个插件 Apk,代码中的 R 对应的 id 却无法引用到正确的资源,会产生什么后果。
总结一下,其实做到插件化的要点就这几个:
-
反射并执行插件 Apk 中的代码(ClassLoader Injection)
-
让系统能调用插件 Apk 中的组件(Runtime Container)
-
正确识别插件 Apk 中的资源(Resource Injection)
当然还有其他一些小问题,但可能不是所有场景下都会遇到,下次再另外详细阐述。
插件化是一门很有意思的学问,网上已经有很多“入门知识”和“实现原理”之类的文章,但是关于插件化的实战却没有一个系统、全面的分享,下面我要分享的是最近小编有幸在腾讯高工手里扒到这份“插件化实战学习手册”,这位大佬主导开发过多个采用插件化架构的APP项目。手册中收录了各互联网大厂热门的插件化项目实战,从新手到架构师,这份学习手册足以。
-
插件化提要
-
插件化发展历史
-
类加载
-
双亲委托机制
-
资源加载
-
四大组件支持
-
Proxy Activity代理
-
hook方式
-
从零开始实现一个插件化框架
-
Activity的启动流程
-
寻找Hook点
-
撸码阶段
-
代理对象
-
偷天换日,替换原来的Intent
-
ActivityThread
-
将代理的intent替换回来
- 360插件开发之DroidPlugin
插件开发之360 DroidPlugin源码分析
插件开发之360 DroidPlugin源码分析之Hook机制
Hook机制的包结构关系
Hook机制类图关系
Hook机制的时序图关系
Manifest权限申请
基类Hook做了什么?
…
- 滴滴VirtualApk实战
配置
应用
原理
最后
只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。
真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。
腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析
资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
、百度等BAT大厂 2019-2021面试真题解析**
[外链图片转存中…(img-s4CYhOCM-1715420377541)]
资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!