最近几年移动开发业界兴起了「 插件化技术 」的旋风,各个大厂都推出了自己的插件化框架,各种开源框架都评价自身功能优越性,令人目不暇接。随着公司业务快速发展,项目增多,开发资源却有限,如何能在有限资源内满足需求和项目的增长,同时又能快速响应问题和迭代新需求,这就是一个矛盾点。此时,插件化技术正好风生水起,去了解各个主流框架实现思路,看看能对目前工作是否有帮助,是很有必要的。
百度百科里是这么定义插件的:「 是一种遵循一定规范的应用程序接口编写出来的程序,只能运行在程序规定的系统平台下,而不能脱离指定的平台单独运行。」,也就是说,插件可以提供一种动态扩展能力,使得应用程序在运行时加载原本不属于该应用的功能,并且做到动态更新和替换。
那么在 Android 中,何为「 插件化 」,顾名思义,就是把一些核心复杂依赖度高的业务模块封装成独立的插件,然后根据不同业务需求进行不同组合,动态进行替换,可对插件进行管理、更新,后期对插件也可进行版本管理等操作。在插件化中有两个概念需要讲解下:
所谓宿主,就是需要能提供运行环境,给资源调用提供上下文环境,一般也就是我们主 APK ,要运行的应用,它作为应用的主工程所在,实现了一套插件的加载和管理的框架,插件都是依托于宿主的APK而存在的。
插件可以想象成每个独立的功能模块封装为一个小的 APK ,可以通过在线配置和更新实现插件 APK 在宿主 APK 中的上线和下线,以及动态更新等功能。
那么为何要使用插件化技术,它有何优势,能给我们带来什么样好处,这里简单列举了以下几点:
现在普通人一听“宿主”第一想到的就是欧美电影里的恐怖画面,甚至感觉瘆得慌。但是在移动开发领域,我们经常会提及的“宿主”却有完全不一样的意义,那就是支持插件的app主体。
从2012年插件化概念被提出,到2016年的时候,插件化技术百家争鸣,被一线大厂广泛使用,可以说成为了Android高级工程师所必须具备的技能之一,几乎引领了Android技术的进步!
近些年,一线互联网大厂几乎对移动互联网形成了垄断,app的功能越来越多,比如下面这些app(美团、支付宝等):
每个app都集成了许多功能入口,美团上有“美食”、“电影”、“外卖”、“打车”等,其实每个入口都是一个app,只不过被集成到这些入口里了。如果没有插件化技术,美团、淘宝这些app会有多大?几个G都有可能!
这些大型app是如何把第三方app作为插件集成到自己的app里的?
随便一个app就能随意调用其他app吗?
当然不能!
插件化技术最初源于免安装运行apk的想法,这个免安装的apk可以理解为插件,而支持插件的app 我们一般叫宿主。支持插件化的app可以在运行时加载和运行插件,这样便可以将app中一些功能独立的模块写成独立的插件,一方面减小了安装包的大小,另一方面可以实现app功能的动态扩展。想要实现插件化,主要是解决下面三个问题:
1、插件中代码的加载和与主工程的互相调用
2、插件中资源的加载和与主工程的互相访问
3、四大组件生命周期的管理
插件化技术涉及得非常广泛,其中最核心的就是Android的类加载机制和反射机制。
虽然现在很多公司开源了插件化框架,但还有非常多的开发者对插件化一知半解。所以我特地给大家整理了167页的高级Android插件化强化实战(附源码),一共分为四个部分:
从基础的插件化原理到Android插件化初探再到大厂架构演化实战应用,总结出了较为全面与完整的安卓插件技术与插件化对 Android开发的重要性。
1.1 插件化提要
1.2 插件化发展历史
2.1 类加载
2.2 双亲委托机制
2.3 资源加载
2.4 四大组件支持
2.5 ProxyActivity代理
2.6 hook方式
2.7 其他组件
2.8 Android动态加载框架DL的架构与基本原理解析
2.9 Android 插件化框架 DynamicLoadApk 源码分析
3.1 从零开始实现一个插件化框架
3.1.1 概念
3.1.2 插件化解决的问题
3.1.3 各插件化框架对比
3.1.4 插件化实现
3.1.5 ClassLoader实现类
3.2 从零开始实现一个插件化框架
3.2.1 Activity的启动流程
3.2.2 寻找Hook点
3.2.3 撸码阶段
3.2.4 代理对象
3.2.5 偷天换日,替换原来的Intent
3.2.6 ActivityThread
3.2.7 将代理的intent替换回来
3.2.8 注意
3.3 从零开始实现一个插件化框架
3.3.1 插件资源加载
3.3.2 Android中资源加载流程
3.3.3 ActivityManager
3.3.4 ActivityThread
3.3.5 AppCompatActivity
4.1 360插件开发之DroidPlugin
4.1.1 插件开发之360 DroidPlugin源码分析
4.1.2 插件开发之360 DroidPlugin源码分析之Hook机制
4.1.3 Hook机制的包结构关系
4.1.4 Hook机制类图关系
4.1.5 Hook机制的时序图关系
4.1.6 Manifest权限申请
4.1.7 基类Hook做了什么?
4.1.8 ProxyHook
4.1.9 BaseHookHandle
4.1.10 HookedMethodHandler
4.1.11 ReplaceCallingPackageHookedMethodHandler
4.1.12 IO重定向
4.1.13 递归遍历
4.1.14 以IPackageManager为例
4.1.15 插件开发之360 DroidPlugin源码分析之Binder代理
4.2 滴滴VirtualApk实战
4.2.1 配置
4.2.2 应用
4.2.3 原理
4.2.4 总结
4.2.5 问题
4.3 基于VirtualAPK Android重构之插件化
4.3.1 Plug-in Hello World
4.3.2 插件化框架的选择
4.3.3 插件化原理
4.3.4 引入插件化之痛
4.4 爱奇艺插件化原理分析之 Neptune框架
4.4.1 插件化基础知识点
4.4.2 类加载
4.4.3 插件化中资源使用限制
4.4.4 Apk打包流程
4.4.5 四大组件的插件化
4.4.6 插件Activity任务栈
4.4.7 处理插件中的广播
4.4.8 处理插件中的Service
4.5 360开源全面插件化框架RePlugin 实战
4.5.1 RePlugin 介绍
4.5.2 宿主接入步骤
4.5.3 插件接入步骤
4.5.4 使用插架
4.6 腾讯插件化框架 Shadow项目解析
4.6.1 框架简单介绍
4.6.2 框架结构分析
4.6.3 sample 示例代码 AndroidManifest.xml 分析
4.6.4 Activity 实现
4.6.5 替换插件 Activity 的父类
4.6.6 Service 实现
4.6.7 BroadcastReceiver 实现
4.6.8 ContentProvider 实现
4.6.9 框架自身动态化
插件化技术可以说是Android高级工程师所必须具备的技能之一,从2012年插件化概念的提出(Android版本),到2016年插件化的百花争艳,直至现在拆件化已成为Android开发必不可少的重点,可以说,插件化技术引领着Android技术的进步。
我相信一个高级程序员一定是勤奋的,可以快速地掌握大量 的新技术、新框架,不仅懂得原理,还能把新的技术落地到公司的产品中去。这是衡量程序员 工作能力的一个重要标准,那么怎样才能将技术运用自如呢?唯有实践!
最后上面分享的资源均免费分享:
高级Android插件化强化实战(附源码)点击此处查看免费领取方式!
还有耗时一年多整理的一系列Android学习资源:Android源码解析、Android第三方库源码笔记、Android进阶架构师七大专题学习、历年BAT面试题解析包、Android大佬学习笔记
等等,这些内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容