VirtualAPK

滴滴 Android 插件化框架
授权协议 Apache
开发语言 Java
所属分类 手机/移动开发、 Android UI 组件
软件类型 开源软件
地区 国产
投 递 者 申屠弘图
操作系统 Android
开源组织 滴滴出行
适用人群 未知
 软件概览

VirtualAPK 是滴滴出行自研的一款优秀的插件化框架,通过将业务模块插件化,可随时更新插件来发布新功能,具备版本随时发布的能力。

VirtualAPK的特性

功能完备

  • 支持几乎所有的Android特性;

  • 四大组件方面

四大组件均不需要在宿主manifest中预注册,每个组件都有完整的生命周期。

  • Activity:支持显示和隐式调用,支持Activity的theme和LaunchMode,支持透明主题;

  • Service:支持显示和隐式调用,支持Service的start、stop、bind和unbind,并支持跨进程bind插件中的Service;

  • Receiver:支持静态注册和动态注册的Receiver;

  • ContentProvider:支持provider的所有操作,包括CRUD和call方法等,支持跨进程访问插件中的Provider。

  • 自定义View:支持自定义View,支持自定义属性和style,支持动画;

  • PendingIntent:支持PendingIntent以及和其相关的Alarm、Notification和AppWidget;

  • 支持插件Application以及插件manifest中的meta-data;

  • 支持插件中的so。


优秀的兼容性

  • 兼容市面上几乎所有的Android手机,这一点已经在滴滴出行客户端中得到验证;

  • 资源方面适配小米、Vivo、Nubia等,对未知机型采用自适应适配方案;

  • 极少的Binder Hook,目前仅仅hook了两个Binder:AMS和IContentProvider,hook过程做了充分的兼容性适配;

  • 插件运行逻辑和宿主隔离,确保框架的任何问题都不会影响宿主的正常运行。


入侵性极低

  • 插件开发等同于原生开发,四大组件无需继承特定的基类;

  • 精简的插件包,插件可以依赖宿主中的代码和资源,也可以不依赖;

  • 插件的构建过程简单,通过Gradle插件来完成插件的构建,整个过程对开发者透明。


VirtualAPK的工作过程

VirtualAPK 对插件没有额外的约束,原生的apk即可作为插件。插件工程编译生成apk后,即可通过宿主App加载,每个插件apk被加载后,都会在宿主中创建一个单独的LoadedPlugin对象。如下图所示,通过这些LoadedPlugin对象,VirtualAPK就可以管理插件并赋予插件新的意义,使其可以像手机中安装过的App一样运行。

VirtualAPK

  • 1.前言&概念 插件化和热修复,都使用了一个技术点-动态加载技术,在android开发早期,很少用到动态加载技术,因为那时业务需求和应用开发的复杂度整体来说还不算太高,但随着互联网的极速发展,会出现以下几种情况。 1)业务复杂,模块耦合 2)应用间的接入 3)65535的限制 4)App越来越大,影响客户下载安装率的提升 5)应用占用内存越来越大 面临这么多问题,这时插件化应运而生,本文主要对于插

  • 3.1 基本原理 合并宿主和插件的ClassLoader 需要注意的是,插件中的类不可以和宿主重复 合并插件和宿主的资源 重设插件资源的packageId,将插件资源和宿主资源合并 去除插件包对宿主的引用 构建时通过Gradle插件去除插件对宿主的代码以及资源的引用 3.2 四大组件的实现原理 Activity 采用宿主manifest中占坑的方式来绕过系统校验,然后再加载真正的activity;

  • 1、VirtualAPK的接入 1.1、宿主工程引入VirtualApk 在项目Project的build.gradle中添加依赖 dependencies { classpath 'com.didi.virtualapk:gradle:0.9.8.6' } 在宿主app的build.gradle中引入VirtualApk的host插件 apply plugin: 'com.didi.v

  • 广播的动态注册 [](()二、宿主App的实现 ====================================================================== 中心思想: 对插件APK进行解析,获取插件APK的信息 在框架初始化时,对一系列系统组件和接口进行替换,从而对Activity、Service、ContentProvider的启动和生命周期进行修改和监控,达到

  • 一、VirtualAPK 介绍 VirtualAPK 是我们推出的一款Android平台上的插件化方案,通过VirtualAPK,可以让APP无需重新发版即可上线新功能。 之所以做这件事,是因为传统的开发流程中,APP进行版本迭代的时候,有着严格的时间周期的要求,必须在规定的时间点完成功能开发,也必须在规定的时间点完成渠道投放,这就让APP的版本迭代有了一定的限制,无法做到APP的随时更新,于是我

  • VirtualApk是滴滴开源的一套插件化方案,其支持四大组件,支持插件宿主之间的交互,兼容性强,在滴滴出行APP中有应用。下面是官方文档中与其他主流插件化框架的对比(查看原文): 特性 DynamicLoadApk DynamicAPK Small DroidPlugin VirtualAPK 支持四大组件 只支持Activity 只支持Activity 只支持Activity 全支持 全支持

  • 前篇文章《Android组件化和插件化开发》主要介绍了Android组件化和插件化的架构特点、两者的对比分析以及推荐了学习组件化的相关文章,本编主要介绍下目前插件化开源库的使用情况,以及着重介绍下VirtualAPK库,供大家参考。 插件化的技术背景 插件化主要就是利用动态加载技术 通过服务器配置一些参数,Android APP获取这些参数再做出相应的逻辑,这是常有的事,比如现在大部分APP都有一

 相关资料
  • 一面(2024/3/5)52min 自我介绍 聊实习,实习的主要工作是什么? 聊项目,手机上有这个项目吗?展示一下 说一下MVP模式 说一下MVVM模式的set()和get()是怎么实现的,数据的绑定是通过什么实现的?当时没有get到要问啥,现在想想应该是要问DataBinding和ViewBinding 说一下抽象类和接口的区别?抽象类和接口可以有方法体吗?Java可以多实现或者多继承吗? 如何

  • 滴滴秋储C++/go一面凉经 1、自我介绍 2、问项目(TCP、UDP,为什么采用TCP?) 3、项目架构(webserver)两种高并发模式(问的很细) 4、线程池(具体如何工作的,底层接收到socket如何操作的)?线程池的实现? 5、网络编程一些知识,总之就问的很细了。。。 6、压测?如果超过了访问量怎么办?如何改进? 7、智能指针?几类,各类详细说说?举个场景指针引用成环的问题? 8、多态

  • 作者:hiyuki Mpx是一款致力于提高小程序开发体验的增强型小程序框架,通过Mpx,我们能够以最先进的web开发体验(Vue + Webpack)来开发生产性能深度优化的小程序,Mpx具有以下一些优秀特性: 数据响应特性(watch/computed) 增强的模板语法(动态组件/样式绑定/类名绑定/内联事件函数/双向绑定等) 深度性能优化(原生自定义组件/基于依赖收集和数据变化的setData

  • 滴滴一面 C++/Go

  • 凭我仅剩不多的印象写一下~ 一面 #数据人的面试交流地# 1.常规自我介绍 2.sql题:两个表 (1)求最后一次登陆时间 (2)求该年最大连续登陆天数 3.业务相关 (1)异常数据如何分析 (2)在没有拼车业务的国家开展拼车业务,目前有各城市快车业务的数据和公共数据(例如可以查到的城市人口等),如何确定最合适的两个城市来开展拼车业务? (3)你认为开展拼车业务对这个国家的乘客、司机以及我们平台有

  • 手撕:快速排序 场景题: 实习:讲业务,实习收获 项目:黑马学成在线 请求URL: 组成部分 Get Post MySQL: 5000万数据量,给出一些字段让建表->找慢SQL->索引相关->执行过程 Redis: 应用场景、项目中存的课程信息,缓存一致性解决 这块就是一直给各种场景,然后一步步来考虑,不是很麻烦 Linux: 查看Java项目是否运行 ps -aux | grep 查看 占用端口

  • 以为昨天面得同花顺算恶心的了,没想到今天的才是沉重打击。。。 1.部门是c++和golang,愿意转语言吗(我是java 2.多线程是什么概念? 3.如果不用多线程,会怎么样? 4.为什么多线程一定快,单线程一点慢,到底是什么区别? 5.那么你的项目那些地方在用多线程 6.Tcp的报文格式?具体 7.处理客户端请求是什么协议 8.http协议的报文格式 9.什么叫超文本? 10.http的报文是明

  • 1.你能说一下JAVA有哪些集合吗? 2.HashMap和TreeMap有什么区别? 3.解决哈希冲突的方法 4.那TreeMap底层是什么数据结构? 红黑树+HashMap 5.常见的树有哪些? 6.二叉搜索树、平衡树、红黑树区别是什么? 二叉搜索树(Binary Search Tree, BST)、平衡树(Balanced Tree)和红黑树(Red-Black Tree)都是一种数据结构,用