Android插件化实现方案
插件化对于广大Android开发者而言,应该是一个不陌生的名词。许多APP都有用到插件化技术,例如逢年过节,许多APP都会动态换上许多营造节日氛围的ui特效,但是却不需要用户去重新下载APP;再者下载一款游戏平台APP,若一次性下载一个包含所有游戏的平台APP,那肯定需要很长时间,而用户往往只玩其中一两款,这时候就需要“按需下载”,在用户想玩的时候在下载相应游戏的插件,这样体验就好多了。
目前来说实现Android实现插件化的方案大致分为两个方向:
1、动态替换方案:提供对Android底层的各种类进行Hook,来实现加载插件中的四大组件,以DroidPlugin框架为代表;
2、静态代理方案:通过ProxyActivity统一加载插件中的所有Activity,以that框架为代表。
本文以方案二静态代理来实现Activity的插件化。
本文项目结构如下:
本文项目分为三大模块,主APP模块,插件APP模块,以及充当两者桥梁,起到解耦作用的pluginlib Library部分。
接下来我们分别讲解这三个部分。
一、主APP模块
我们知道项目build完后会生成apk文件,作为主APP模块,我们需要加载外部的插件apk,正常的加载流程应该如下:
1、从服务器下载插件dex到手机SDCard,为此需要申请SDCard读写权限;
2、读取插件apk中的dex文件,生成对应的DexClassLoader;
3、使用DexClassLoader的loadClass方法读取插件dex中的任何一个类。
为了模拟从服务器下载插件的方法,我们首先build插件APP,生成相应的apk文件,然后将apk文件重命名放到主APP模块的assets文件中,APP启动后会把asset目录中的插件复制到内存中,如下图所示:
相关代码如下:
二、Library模块
首先需要一个插件APK的实体类,代码如下:
其中DexClassLoader用于加载插件中的类,Resources和AssetManager用于加载插件中的资源,PackageInfo用于获取插件中的包信息。
同时需要一个PluginManager类来管理实体对象,代码如下:
另外,我们需要意识到,插件中的Activity不同于我们正常启动的Activity有AMS管理调用其生命周期,对于插件Activity,我们需要管理它的生命周期,为此我们写了一个ProxyActivity来充当这个管理的角色,如下:
为了更好地管理和调用插件Activity,我们需要制定一套规范,让插件Activity遵循我们这套规则,为此写了如下接口:
同时写了一个BasePluginActivity来让插件Activity继承:
如上代码所示,若Activity属于主APK,即mFrom=FROM_INTERNAL,则走常规的启动流程,若属于插件APK,则走插件管理的启动流程。
三、插件APP模块
插件APP这边比较简单,继承于BasePluginActivity,代码如下:
整体效果如下,点击加载APK文件成功后,点击跳转,跳转到插件Activity。
四、总结
插件化是Android开发中比较重要的一块,涉及的东西很多,如Android四大组件的插件化,动态代理,四大组件的启动过程,反射机制等,本文的介绍只是冰山一角,后续需要研究学习的地方还很多,有兴趣的朋友可以一起探讨。
PS:许多同行对插件化有个误区,认为插件化能极大减少APK的体积,把需要“按需下载”的APK在需要时才下载到主APK中,其实不然。确实插件化一定程度上能减少APK的体积,但是假设一个插件APK大小为10M,让用户从服务器下载一个10M的插件新版本,需要耗费很长时间。合理的做法应该把插件1.0版本放在主APP中,APP发版后需要更新插件,通过增量更新的方式来加载。
最后,附上项目Github地址,有问题可交流:https://github.com/xudongstorm/PlugProject
原文转载自:https://blog.csdn.net/m0_37451060/article/details/99614847?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.control
Android插件化实现方案相关推荐
- Android插件化最佳方案--Phantom 实践指南
PhantomTest 满帮集团插件化框架Phantom使用演示 Phantom插件化演示(请star支持) 演示demo下载 注意:请将插件apk拷贝至sdcard下. Phantom介绍 Phan ...
- [Android 插件化(一)] DynamicLoadApk的用法
1 简介 Android大型项目中为了减小apk的体积,可以采用插件化的方法,即一些不常用的功能独立成插件,当用户需要的使用的时候再从服务器上下载回来,动态加载.这样就避免了为了满足所有用户需求而把功 ...
- 【Android 插件化】多开原理 | 使用插件化技术的恶意应用 | 插件化的其它风险 | 应用开发推荐方案
文章目录 一.多开原理 二.使用插件化技术的恶意应用 三.插件化的其它风险 四.应用开发推荐方案 一.多开原理 插件化的优点就是可以实现应用的多开 , 利用该多开虚拟化引擎 , 用户可以同时登录多个 ...
- Android 插件化,qihoo360插件方案。集成简单实用方便,兼容性高
Android 插件化,qihoo360插件方案 目录 Android 插件化,qihoo360插件方案 宿主App插件化: 插件App插件配置: 宿主调用插件App: 新建一个项目,开始配置 宿主插 ...
- android 插件化 方案,Android应用开发之Android 插件化,qihoo360插件方案配置教程
本文将带你了解Android应用开发Android 插件化,qihoo360插件方案配置教程,希望本文对大家学Android有所帮助. Android 插件化,qihoo360插件方案 目录 Andr ...
- 【Android 插件化】现有的针对插件化恶意应用的解决方案 | 插件化应用开发推荐方案
文章目录 一.SafetyNet Attestation API 二.PluginKiller 三.针对插件化应用开发者 一.SafetyNet Attestation API SafetyNet A ...
- Android 插件化原理学习 —— Hook 机制之动态代理
前言 为了实现 App 的快速迭代更新,基于 H5 Hybrid 的解决方案有很多,由于 webview 本身的性能问题,也随之出现了很多基于 JS 引擎实现的原生渲染的方案,例如 React Nat ...
- Android 插件化总结
2019独角兽企业重金招聘Python工程师标准>>> 1.Android中插件开发篇总结和概述 2.Android组件化和插件化开发 3.携程Android App插件化和动态加载 ...
- 《Android插件化技术——原理篇》
| 导语 插件化技术最早从2012年诞生至今,已经走过了5个年头.从最初只支持Activity的动态加载发展到可以完全模拟app运行时的沙箱系统,各种开源项目层出不穷,在此挑选了几个代表性的框架,总结 ...
- Android插件化原理解析——ContentProvider的插件化
目前为止我们已经完成了Android四大组件中Activity,Service以及BroadcastReceiver的插件化,这几个组件各不相同,我们根据它们的特点定制了不同的插件化方案:那么对于Co ...
最新文章
- Linux安装python3.6
- 正则表达式(overall)
- SQL Server Window Function 窗体函数读书笔记二 - A Detailed Look at Window Functions
- win10输入法切换快捷键怎么设置
- mysql数据库优化课程---13、mysql基础操作
- bob-tong 字符串函数之Strtok()函数
- pytorch-LSTM的输入和输出尺寸
- 面试题22. 链表中倒数第k个节点
- 通过cURL获取web页面及http header信息
- Fiddler2教程(Web调试工具)
- PHP输出100以内的质数(包括普通写法和数组形式输出)
- 解决手机邮箱登录学生邮箱时服务器无法连接的问题
- Tp-link路由器怎么设置端口映射 内网端口映射
- JS 格式化时间字符串
- CDH安装过程中出现:主机 cdh04 上的内存被调拨过度。总内存分配额是 4.0 艾字节 个字节,但是 RAM 只有 62.8 吉字节 个字节(其中的 12.6 吉字节 个字节是保留给系统使用的)。
- 黑客帝国角色 之 先知的另类解读
- PyTorch深度学习(B站刘二大爷)第八讲作业——Kaggle网站泰坦尼克号Titanic
- easyUI的基本知识
- 简单总结协程Coroutine及Yield常见用法
- 计算机无法连接打印机主机,电脑主机连不上网络打印机
热门文章
- 华为Ensp常用命令
- excel解决线性规划求解问题
- python超市管理系统实训报告_java超市管理系统实训报告
- 利用Contacts Provider读取手机联系人信息
- php wind8.5,PHPWind Forums下载
- win11安装IIS步骤—图解
- win10北通手柄没反应_win10 游戏手柄,win10游戏手柄没反应
- linux安装系统识别不到硬盘,安装系统找不到硬盘解决方法【图文教程】
- java通讯录 批量生成 .vcf文件, .csv文件批量生成 .vcf,手机自动导入
- linux安装monaco字体