Android插件化怎样学?这里有一篇完整入门指南

作者 : 开心源码 本文共2789个字,预计阅读时间需要7分钟 发布时间: 2022-05-12 共187人阅读

最近在理解公司的项目,第一次接触Android插件化,理解其重要性,于是就开始了插件化的学习。本篇文章把插件化入门过程中的少量技术点整理下来,方便少量初入门的同学一起学习。

一、Android插件化详情

1.含义

所谓插件化,就是让我们的应用不必再像原来一样把所有的内容都放在一个apk中,可以把少量功能和逻辑单独抽出来放在插件apk中,而后主apk做到[按需调用],这样的好处是一来可以减少主apk的体积,让应用更轻便,二来可以做到热插拔,更加动态化。

2.背景

3.优点

二、Android插件化基础

1.插件化的特点

  1. 应用在运行的时候通过加载少量本地不存在的可执行文件实现少量特定的功能;

  2. 这些可执行文件是可以替换的;

  3. 更换静态资源(比方换启动图、换主题、或者者用服务器参数开关控制广告的隐藏现实等)不属于动态加载;

  4. Android中动态加载的核心思想是动态调用外部的 dex文件,极端的情况下,Android APK自身带有的Dex文件只是一个程序的入口(或者者说空壳),所有的功能都通过从服务器下载最新的Dex文件完成;

2.需要处理的问题

代码加载

类的加载可以使用Java的ClassLoader机制,但是对于Android来说,并不是说类加载进来即可以用了,很多组件都是有“生命”的;因而对于这些有血有肉的类,必需给它们注入活力,也就是所谓的组件生命周期管理;

资源加载

资源加载方案大家使用的原理都差不多,都是用AssetManager的隐藏方法addAssetPath。

3.插件化必备基础

①ClassLoader类加载器

要想实现加载外部dex文件(即插件)来实现热部署,那么必然要把其中的class文件加载到内存中。

其中涉及到两种ClassLoader:DexClassLoader和PathClassLoader。而DexClassLoader可以加载外部的jar,dex等文件,正是我们需要的。

关于ClassLoader详解,见ClassLoader完全解析。

②Java反射

由于插件apk与宿主apk不在一个apk内,那么少量类的访问必然要通过反射进行获取。所以理解反射对插件化的学习是必需的。

关于Java反射,见Java反射详解。

③插件资源访问

res里的每一个资源都会在R.java里生成一个对应的Integer类型的id,APP启动时会先把R.java注册到当前的上下文环境,我们在代码里以R文件的方式使用资源时正是通过使用这些id访问res资源,然而插件的R.java并没有注册到当前的上下文环境,所以插件的res资源也就无法通过id使用了。

查看源码,通过“addAssetPath”方法重新生成一个新的Resource对象来保存插件中的资源,避免冲突。

关于插件资源访问,见使用插件中的R资源。

④代理商模式

插件化实现的过程主要靠欺上瞒下,坑蒙拐骗来实现。想想尽管加载进来了Activity等组件,但也仅仅是最为一个对象而存在,并没有在AndroidManifest中注册,没有生命周期的回调,并不能实现我们想要的效果。因而无论是dynamic_load_apk通过代理商activity来操控插件activity的方式,还是DroidPlugin通过hook activity启动过程来启动插件activity的方式,都是对代理商模式的应用。

关于代理商模式,见静态代理商与动态代理商。

至此,通过ClassLoader加载,而后通过代理商模式让Activity等组件具备生命周期实现真正的功能,并且处理了资源访问问题。可能插件化已经可以简单的实现少量初步的功能,然而插件化绝不止于此。更多的内容仍需要进一步探究,不过以上知识是基础中的基础,必备之必备。

三、Android插件化开源项目

详情一下其中比较重要的两个,实现思想不同,也是入门插件化可以学习的两个。

Dynamic-load-apk

Dynamic-Load-Apk简称DL,这个开源框架作者是任玉刚,他的实现方式是,在宿主中埋一个代理商Activity,更改ClassLoader后找到加载插件中的Activity,使用宿主中的Activity作为代理商,回调给插件中Activity所以对应的生命周期。这个思路与AndroidDynamicLoader有点像,都是做一个代理商,只不过Dynamic-load-apk加载的插件中的Activity。
项目地址: singwhatiwanna/dynamic-load-apk

DroidPlugin

DroidPlugin是张勇实现的一套插件化方案,它的原理是Hook用户端一侧的系统Api。
项目地址: DroidPluginTeam/DroidPlugin

既然着重详情了两个项目,必然要学起来,怎样学习呢?

好在已经有前人把自己的学习经验分享出来,那么我们只要要结合源码进行学习就可。

四、Dynamic-load-apk详解

Android插件化学习之路(一)之动态加载综述
Android插件化学习之路(二)之ClassLoader完全解析
Android插件化学习之路(三)之调用外部.dex文件中的代码
Android插件化学习之路(四)之使用插件中的R资源
Android插件化学习之路(五)之代理商Activity
Android插件化学习之路(六)之动态创立Activity
Android插件化学习之路(七)之DL插件开发该注意的坑
Android插件化学习之路(八)之DynamicLoadApk 源码解析(上) Android插件化学习之路(九)之DynamicLoadApk 源码解析(下)

五、DroidPlugin详解

Hook机制之动态代理商
Hook机制之Binder Hook
Hook机制之AMS&PMS
Activity生命周期管理
插件加载机制
广播的管理
Service的插件化
ContentProvider的插件化

六、总结

以上内容仅是Android插件化的入门知识,目前认知尚浅。

插件化、热升级等技术在2016开始迅速发展,这即是业务发展的需求,也是我们需要紧跟前沿学习的技术。

自己是从事了七年开发的Android工程师,不少人私下问我,2019年Android进阶该怎样学,方法有没有?

没错,年初我花了一个多月的时间整理出来的学习资料,希望能帮助那些想进阶提升Android开发,却又不知道怎样进阶学习的朋友。【包括高级UI、性能优化、架构师课程、NDK、Kotlin、混合式开发(ReactNative+Weex)、Flutter等架构技术资料】,希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。

资料获取方式:加入Android架构交流QQ群聊:513088520 ,进群即领取资料!!!

点击链接加入群聊【Android移动架构总群】:加入群聊

资料大全

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » Android插件化怎样学?这里有一篇完整入门指南

发表回复