插件化对于广大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插件化实现方案相关推荐

  1. Android插件化最佳方案--Phantom 实践指南

    PhantomTest 满帮集团插件化框架Phantom使用演示 Phantom插件化演示(请star支持) 演示demo下载 注意:请将插件apk拷贝至sdcard下. Phantom介绍 Phan ...

  2. [Android 插件化(一)] DynamicLoadApk的用法

    1 简介 Android大型项目中为了减小apk的体积,可以采用插件化的方法,即一些不常用的功能独立成插件,当用户需要的使用的时候再从服务器上下载回来,动态加载.这样就避免了为了满足所有用户需求而把功 ...

  3. 【Android 插件化】多开原理 | 使用插件化技术的恶意应用 | 插件化的其它风险 | 应用开发推荐方案

    文章目录 一.多开原理 二.使用插件化技术的恶意应用 三.插件化的其它风险 四.应用开发推荐方案 一.多开原理 插件化的优点就是可以实现应用的多开 , 利用该多开虚拟化引擎 , 用户可以同时登录多个 ...

  4. Android 插件化,qihoo360插件方案。集成简单实用方便,兼容性高

    Android 插件化,qihoo360插件方案 目录 Android 插件化,qihoo360插件方案 宿主App插件化: 插件App插件配置: 宿主调用插件App: 新建一个项目,开始配置 宿主插 ...

  5. android 插件化 方案,Android应用开发之Android 插件化,qihoo360插件方案配置教程

    本文将带你了解Android应用开发Android 插件化,qihoo360插件方案配置教程,希望本文对大家学Android有所帮助. Android 插件化,qihoo360插件方案 目录 Andr ...

  6. 【Android 插件化】现有的针对插件化恶意应用的解决方案 | 插件化应用开发推荐方案

    文章目录 一.SafetyNet Attestation API 二.PluginKiller 三.针对插件化应用开发者 一.SafetyNet Attestation API SafetyNet A ...

  7. Android 插件化原理学习 —— Hook 机制之动态代理

    前言 为了实现 App 的快速迭代更新,基于 H5 Hybrid 的解决方案有很多,由于 webview 本身的性能问题,也随之出现了很多基于 JS 引擎实现的原生渲染的方案,例如 React Nat ...

  8. Android 插件化总结

    2019独角兽企业重金招聘Python工程师标准>>> 1.Android中插件开发篇总结和概述 2.Android组件化和插件化开发 3.携程Android App插件化和动态加载 ...

  9. 《Android插件化技术——原理篇》

    | 导语 插件化技术最早从2012年诞生至今,已经走过了5个年头.从最初只支持Activity的动态加载发展到可以完全模拟app运行时的沙箱系统,各种开源项目层出不穷,在此挑选了几个代表性的框架,总结 ...

  10. Android插件化原理解析——ContentProvider的插件化

    目前为止我们已经完成了Android四大组件中Activity,Service以及BroadcastReceiver的插件化,这几个组件各不相同,我们根据它们的特点定制了不同的插件化方案:那么对于Co ...

最新文章

  1. Linux安装python3.6
  2. 正则表达式(overall)
  3. SQL Server Window Function 窗体函数读书笔记二 - A Detailed Look at Window Functions
  4. win10输入法切换快捷键怎么设置
  5. mysql数据库优化课程---13、mysql基础操作
  6. bob-tong 字符串函数之Strtok()函数
  7. pytorch-LSTM的输入和输出尺寸
  8. 面试题22. 链表中倒数第k个节点
  9. 通过cURL获取web页面及http header信息
  10. Fiddler2教程(Web调试工具)
  11. PHP输出100以内的质数(包括普通写法和数组形式输出)
  12. 解决手机邮箱登录学生邮箱时服务器无法连接的问题
  13. Tp-link路由器怎么设置端口映射 内网端口映射
  14. JS 格式化时间字符串
  15. CDH安装过程中出现:主机 cdh04 上的内存被调拨过度。总内存分配额是 4.0 艾字节 个字节,但是 RAM 只有 62.8 吉字节 个字节(其中的 12.6 吉字节 个字节是保留给系统使用的)。
  16. 黑客帝国角色 之 先知的另类解读
  17. PyTorch深度学习(B站刘二大爷)第八讲作业——Kaggle网站泰坦尼克号Titanic
  18. easyUI的基本知识
  19. 简单总结协程Coroutine及Yield常见用法
  20. 计算机无法连接打印机主机,电脑主机连不上网络打印机

热门文章

  1. 华为Ensp常用命令
  2. excel解决线性规划求解问题
  3. python超市管理系统实训报告_java超市管理系统实训报告
  4. 利用Contacts Provider读取手机联系人信息
  5. php wind8.5,PHPWind Forums下载
  6. win11安装IIS步骤—图解
  7. win10北通手柄没反应_win10 游戏手柄,win10游戏手柄没反应
  8. linux安装系统识别不到硬盘,安装系统找不到硬盘解决方法【图文教程】
  9. java通讯录 批量生成 .vcf文件, .csv文件批量生成 .vcf,手机自动导入
  10. linux安装monaco字体