我在好久以前就想写一系列关于插件化的博客,但是总被这样或那样的事情打断。上周终于下定决心去作这个事情。今天这篇文章是一个开篇,做用有两个:一是把吹的牛发布到网上,前面已经说过了;二是对插件化的知识作一个简单的介绍,顺便帮本身整理一下接下来的写做思路。网络
一般,咱们的app只有一个apk文件。而插件化是一种将app拆分为多个apk的技术,每个apk都是app功能的一部分。通常,咱们把app启动时由系统加载的apk称之为宿主。而宿主是能够加载其余的apk的,这些被宿主加载的apk咱们称为插件。app
在学习一项新技能以前,咱们首先要弄清楚它能为咱们带来什么。那插件化能给咱们带来什么呢?框架
从项目管理角度来讲:学习
从程序运行角度来讲:gradle
从公司运营角度来讲:优化
插件化像是一门十分高深的武功,它须要修习者有必定理论基础后才能修炼。那它须要哪些理论支撑呢?操作系统
ClassLoader插件
ClassLoader是由JVM平台提供的类加载器。它容许程序从网络、硬盘甚至是内存加载Class,这就为Android插件化提供了最基础的技术保障。咱们知道Android平台对字节码文件做了优化,摒弃了传统JVM须要的.jar文件,而是采用体积更小的.dex文件。所以,Android自定义了一系列ClassLoader以知足对dex加载。在这些ClassLoader中,有一个DexClassLoader,它容许咱们的app加载外部的.jar和.apk文件。翻译
反射和Hook技术调试
Hook的翻译是"钩子"。咱们知道Android操做系统有一套本身的机制,例如,Activity启动流程、事件分发机制、资源管理机制等。有时候,这些机制没法知足咱们的需求,经过系统的API也无能为力。这时候就须要Hook技术对原有流程进行拦截,而后将系统流程替换成咱们本身的流程。而反射是Hook技术的一种必要手段。
APP安装过程
咱们知道apk文件中包含了app运行须要的Activity、Service等信息。这些信息是在程序安装过程当中经过PackageManagerService解析AndroidManifest文件取得的。只有了解了这些原理,咱们才能知道如何解析插件中的Activity、Service等信息。
四大组件的启动流程
单纯解析出插件的Activity、Service等信息是不行,咱们指望的是这些Activity、Service等能够像咱们普通App中的同样能够正常运行。这就须要咱们去熟悉四大组件的启动流程,而后经过Hook技术加入宿主启动插件的Activity、Service等逻辑。
资源管理
插件化会给资源管理带来两个问题:
在Android打包编译时,gradle会为图片、文案等资源生成一个惟一的Id。在运行期,经过对资源Id的引用来查找相应的资源。因为宿主apk和各插件apk打包不是在一次gradle assemble命令中完成的,这就有可能形成多个apk中产生的资源id相同,咱们称之为资源冲突
各apk中的资源是没法共享的,例如在宿主中没法引用插件中的资源。
为了解决这两个问题,咱们有必要掌握Android平台的资源管理机制。
后续文章我会采用原理+DEMO的表现形式。在每篇文章的前半部分主要是介绍原理知识;后半部分是代码Demo,这些Demo串联在一块儿就是一个简单的插件化框架。