virtualapk:滴滴 android 插件化的实践之路 -欧洲杯足彩官网

引用
作者简介: 任玉刚,滴滴出行 android 技术专家,《android 开发艺术探索》作者,插件化框架 dynamic-load-apk 的发起者,csdn 移动开发博客专家,曾当选 csdn 2014、2015年度十大博客之星。热爱技术,热爱开源,凡事喜欢刨根问底,长期活跃在 csdn 和 github。目前就职于滴滴出行 app 架构组,从事热修复和插件化相关的开发工作。
博客地址:;
github:。
本文为 csdn 首发,欢迎技术投稿、约稿,给文章纠错,请发送邮件至mobile@csdn.net。


一、前言
在 android 插件化技术日新月异的今天,开发并落地一款插件化框架到底是简单还是困难,这个问题不同人会有不同的答案。但是我相信,完成一个插件化框架的 demo 并不是多难的事儿,然而要开发一款完善的插件化框架却并非易事,尤其在国内,各大 rom 厂商都对 android 系统做了一定程度的定制,这更进一步加剧了 android 本身的碎片化问题。

滴滴出行在插件化上的探索起步较晚,由于业务发展较快,迭代占据了大量的时间,这使得我们在2016年才开始研究这方面的技术。经过半年的开发、测试、适配和线上验证,今天,我们正式推出一款较为完善的插件化框架——virtualapk。之所以现在推出,是因为 virtualapk 在内部已经得到了很好的验证,我们在迭代过程中不断地做机型适配和细节特性的支持,目前已达到一个非常稳定的状况,足以支撑滴滴部分乃至全部业务的动态发版需求。目前滴滴出行最新版本(v5.0.4)上,小巴和接送机业务均为插件,大家可以去体验。

二、插件化的现状

到目前为止,业界已经有很多优秀的开源项目,比如早期的基于静态代理思想的 dynamicloadapk,随后的基于占坑思想的 dynamicapk、small,还有360手机助手的 droidplugin。它们都是优秀的开源项目,很大程度上促进了国内插件化技术的发展。

尽管有如此多的优秀框架存在,但是兼容性问题仍然是制约插件化发展的一大难题。一款插件化框架,也许可以在一款手机上完美运行,但是在数以千万的设备上却总是容易存在这样那样的兼容性问题。我相信上线过插件化的工程师应该深有体会。滴滴为什么还要自研一款新的插件化框架?因为我们需要一款功能完备、兼容性优秀、适用于滴滴业务的插件化框架,目前市面上的开源不能满足我们的需求,所以必须重新造轮子,于是 virtualapk 诞生了。

三、virtualapk 的诞生
virtualapk 是滴滴出行自研的一款优秀的插件化框架,主要有如下几个特性。
1. 功能完备
  • 支持几乎所有的 android 特性;
  • 四大组件方面:四大组件均不需要在宿主manifest中预注册,每个组件都有完整的生命周期。
  •         (1)activity:支持显示和隐式调用,支持 activity 的 theme 和 launchmode,支持透明主题;
            (2)service:支持显示和隐式调用,支持 service 的 start、stop、bind 和 unbind,并支持跨进程 bind 插件中的 service;
            (3)receiver:支持静态注册和动态注册的 receiver;
            (4)contentprovider:支持 provider的所有操作,包括 crud 和 call 方法等,支持跨进程访问插件中的 provider。
  • 自定义view:支持自定义 view,支持自定义属性和 style,支持动画;
  • pendingintent:支持 pendingintent 以及和其相关的 alarm、notification 和appwidget;
  • 支持插件 application 以及插件 manifest 中的 meta-data;
  • 支持插件中的so。
2. 优秀的兼容性
  • 兼容市面上几乎所有的 android 手机,这一点已经在滴滴出行客户端中得到验证;
  • 资源方面适配小米、vivo、nubia 等,对未知机型采用自适应适配方案;
  • 极少的 binder hook,目前仅仅 hook 了两个 binder:ams 和 icontentprovider,hook过程做了充分的兼容性适配;
  • 插件运行逻辑和宿主隔离,确保框架的任何问题都不会影响宿主的正常运行。
3. 入侵性极低
  • 插件开发等同于原生开发,四大组件无需继承特定的基类;
  • 精简的插件包,插件可以依赖宿主中的代码和资源,也可以不依赖;
  • 插件的构建过程简单,通过gradle插件来完成插件的构建,整个过程对开发者透明。
四、virtualapk 的工作过程
virtualapk 对插件没有额外的约束,原生的 apk 即可作为插件。插件工程编译生成 apk 后,即可通过宿主 app 加载,每个插件 apk 被加载后,都会在宿主中创建一个单独的 loadedplugin 对象。如下图所示,通过这些 loadedplugin 对象,virtualapk 就可以管理插件并赋予插件新的意义,使其可以像手机中安装过的app一样运行。


1. virtualapk 的运行形态
我们计划赋予 virtualapk 两种工作形态,耦合形态和独立形态。目前 virtualapk 对耦合形态已经有了很好的支持,接下来将计划支持独立形态。
  • 耦合形态:插件对宿主可以有代码或者资源的依赖,也可以没有依赖。这种模式下,插件中的类不能和宿主重复,资源 id 也不能和宿主冲突。这是 virtualapk 的默认形态,也是适用于大多数业务的形态。
  • 独立形态:插件对宿主没有代码或者资源的依赖。这种模式下,插件和宿主没有任何关系,所以插件中的类和资源均可以和宿主重复。这种形态的主要作用是用于运行一些第三方 apk。
2. 如何使用
第一步: 初始化插件引擎

第二步:加载插件

我们对上述加载过程进行了一些封装,通过如下方式即可异步地去加载一个插件。

当插件入口被调用后,插件的后续逻辑均不需要宿主干预,均走原生的 android 流程。比如,在插件内部,如下代码将正确执行:


五、探究原理
1. 基本原理
  • 合并宿主和插件的classloader:需要注意的是,插件中的类不可以和宿主重复;
  • 合并插件和宿主的资源:重设插件资源的packageid,将插件资源和宿主资源合并;
  • 去除插件包对宿主的引用:构建时通过 gradle 插件去除插件对宿主的代码以及资源的引用。
2. 四大组件的实现原理

  • activity:采用宿主 manifest 中占坑的方式来绕过系统校验,然后再加载真正的 activity;
  • service:动态代理 ams,拦截 service 相关的请求,将其中转给一个虚拟空间(matrix)去处理,matrix 会接管系统的所有操作;
  • receiver:将插件中静态注册的 receiver 重新注册一遍;
  • contentprovider:动态代理 icontentprovider,拦截 provider 相关的请求,将其中转给一个虚拟空间(matrix)去处理,matrix 会接管系统的所有操作。
以下是 virtualapk 的整体结构图。

六、填坑之路
在实践中我们遇到了很多很多的问题,比如机型适配、api 版本适配、binder hook 的稳定性保证等问题,这里拿一个典型的资源适配问题来说明。

其实这是一个很无奈的问题,由于国内各大 rom 厂商喜欢深度定制 android 系统,所以就出现了这种适配问题。

正常情况下我们通过如下代码去创建插件的 resources 对象:

然后在 vivo 手机上,竟然出现了如下的类型转换错误,看起来是 vivo 自己派生了 resources 的子类。

于是反编译了下 vivo 的 framework 代码,果不其然,在如下代码中进行了类型转换,所以在加载插件资源的时候就报错了。

为了解决这个问题,我们分析了 vivoresources 的代码实现,然后在创建插件资源的时候,采用了如下的代码。

除了 vivo 以外,有类似问题的还有 miui、nubia 以及其他不知名的机型。而且在 vivo 手机上,除了类型转换错误的问题,还有其他很坑的问题。

事实上我们还处理了很多其他的坑,这里无法一一说明,所以说如何保证插件化的稳定性是一件很有技术挑战的事情。

七、一些暂时不支持的特性
由于种种原因,virtualapk 目前未能支持所有的 android 的特性,已知的有如下几点:
  • 不支持 activity 的部分属性,比如 process、configchanges 等;
  • 暂不支持 overridependingtransition(int enteranim, int exitanim) 这种形式的转场动画;
  • 插件中弹通知,不能使用插件中的资源,比如图片。
八、开源计划
我们的目标是打造一款功能完备的插件化框架,使得各个业务线都能以插件的形式集成,从而实现 android app 的热更新能力。

目前 virtualapk 还有一些特性需要进一步完善,待完善后,将会进行开源计划。我们期望 virtualapk 开源后,可以让其他 app 能够无缝集成,无需考虑细节实现和兼容性问题即可轻松拥有热更新能力。

了解最新移动开发相关信息和技术,请关注 mobilehub 公众微信号(id: mobilehub)。

  • 大小: 95.6 kb
  • 大小: 7.1 kb
  • 大小: 6.5 kb
  • 大小: 18.7 kb
  • 大小: 24.4 kb
  • 大小: 22 kb
  • 大小: 79.8 kb
  • 大小: 4.5 kb
  • 大小: 61.4 kb
  • 大小: 14.8 kb
  • 大小: 18.1 kb
1
0
评论 共 0 条 请登录后发表评论

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 数据仓库和数据挖掘的olap技术引言一、什么是数据仓库二、数据仓库的关键特征2.1、面向主题2.2、数据集成2.3、随时间而变化2.4、数据不易丢失三、数据仓库的构建和使用四、数据仓库与操作数据库系统五、多维数据模型 引言 数据仓库中的数据清理和数据集成,是数据挖掘的重要数据预处理步骤 数据仓库提供olap工具,可用于不同粒度的数据分析 很多数据挖掘功能都可以和olap操作集成,以提供不同概念层上的知识发现 分类 预测 关联 聚集 一、什么是数据仓库 数据仓库的定义很多,但却很难有一种严格的定义:

  • 数据仓库后端工具主要指的是用来装入和刷新数据的工具,包括: 数据提取:从多个外部的异构数据源收集数据 数据清理:检测数据中的错误并作可能的订正 数据变换:将数据由历史或主机的格式转换为数据仓库的格式 装载、排序、汇总、合并、计算视图,检查完整性。 并建立索引和分区 刷新 将数据源的更新传播到数据仓库中 数据仓库只需要两种数据访问: 数据的初始装载 数据访问 传统的异构数据库集成在多个异构数据库上建立包装程序和中介程序 度量可以根据其所用的聚集函数分为三类: 分布的:将函数用于n个聚集值得到的结果和将函数用于

  • 要说明他们的关系,不得不说说商务智能。从技术角度看,商务智能的过程是企业的决策人员以企业中的数据仓库为基础,经由联机分析处理工具、数据挖掘工具加上决策规划人员的专业知识,从数据中获得有用的信息和知识,帮助企业获取利润。      数据仓库是一个用以更好地支持企业或组织的决策分析处理的的数据集合,它有面向主题、集成、相对稳定、随时间不断变化四个特性,将数据仓库与传统的面向事务处理的数据库区分开来。数

  • 数据仓库和数据挖掘的olap 技术 构造数据仓库涉及数据清理和数据集成,可以看作数据挖掘的一个重要预处理步骤。此外,数据仓库提供联机分析处理(olap)工具,用于各种粒度的多维数据分析,有利于有效的数据挖掘。进一步讲,许多其它数据挖掘功能,如分类、预测、关联、聚集,都可以与 olap 操作集成,以加强多个抽象层上的交互知识挖掘。因此,数据仓库已经成为数据分析和联机数据分析处理日趋重要的平台,并将...

  • 简写为olap,随着数据库技术的发展和应用,数据库存储的数据量从20世纪80年代的兆(m)字节及千兆(g)字节过渡到现在的兆兆(t)字节和千兆兆(p)字节,同时,用户的查询需求也越来越复杂,涉及的已不仅是查询或操纵一张关系表中的一条或几条记录,而且要对多张表中千万条记录的数据进行数据分析和信息综合,关系数据库系统已不能全部满足这一要求。在国外,不少软件厂商采取了发展其前端产品来弥补关系数据库管理系

  • 数据仓库将来自于各种数据源的数据,根据不同的主题进行存储,并对原始数据进行抽取、转换和加载等一系列筛选和清理工作。olap则将数据通过多维视角和多种层次向用户进行多方式的呈现。数据挖掘则应用不同的算法,向用户揭示数据间的规律性,从而辅助商业决策。

  • 本文将对这些方面做一个总体性的介绍(尤其是olap),旨在让读者对数据仓库的认识提升到一个全局性的高度。创建数据仓库数据仓库的创建方法和数据库类似,也是通过编写ddl语句来实现。在过去,数据仓库系统大都建立在rdbms上,因为维度建模其实也可以看做是关系建模的一种。但如今随着开源分布式数据仓库工具如hadoop hive,spark sql的兴起,开发人员往往将建模和实现分离。使用专门的建模软件进

  • 联机分析处理(olap)是用来分析数据仓库中海量数据的技术。它的核心概念是“维”,它支持数据分析人员和决策人员从不同的角度、不同的级别地对数据仓库中的数据进行复杂查询和多维分析处理,并且能以直观形象的形式将查询和分析结果展现给分析和决策人员。olap使用的逻辑数据模型为多维数据模型。它主要用于分析大量历史数据,提供汇总和聚集机制,访问大部分是只读操作。这不同于oltp中频繁的更新修改数据。数据

  • 一:数据仓库 1.1概述 数据仓库(data warehouse)简称数仓(dw),是一种信息系统的资料储存理论,此理论强调的是利用某些特殊资料存储方式,让所包含的资料有利于分析处理,从而产生有价值的资讯并以此做出决策。 简单来讲,数据仓库就是一个各种数据的中心存储系统,在数仓的基础上可以进行数据挖掘,数据分析等操作。后续讲到的bi也必须建立在数仓的基础上。 1.2维度建模 维度建模是数据仓库建设中的一种数据建模方法,用于决策制定,侧重于业务如何表示和理解数据。基本的维度模型由维度和度量两类...

  • 什么是数据挖掘   数据挖掘(data mining),又称为数据库中的知识发现(knowledge discovery in database, kdd),就是从大量数据中获取有效的、新颖的、潜在有用的、最终可理解的模式的非平凡过程,简单的说,数据挖掘就是从大量数据中提取或“挖掘”知识。     数据挖掘相关的10个问题     no.1 data mining 和统计分析有什么

  • 分类算法 什么是分类 一些常见的概念: 训练集(training data):用于训练模型(的参数,如神经网络的各层权重和偏置,线性回归分析的系数); 验证集(validation data):用于调整超参数(hyper-parameters,如神经网络的宽度和深度、学习率等); 测试集(test data):用于评价模型本身的有效性(准确率等) 训练误差(training error):分类器...

  •                                                 第一章  数据仓库和数据挖掘概述 一、概念题 1、数据仓库的定义是什么?      答:数据仓库是面向主题的、集成的、稳定的、不同时间的数据集合,用于支持经营管理中央决策制定过程。 2、数据仓库的特点是什么?     答:数据仓库的特点是:   (1)数据仓库是面向主题的;   (2)数据...

  • dw:    data warehouse                     数据仓库    olap:  on-line analytical processing      联机分析处理    dm:    data mining                        数据挖掘    dss:   decision support systems           决策支持系统

  • 数据仓库与数据挖掘概述 1. 数据仓库与传统数据库 传统型数据库 定义:面向业务,对事物进行处理 类似关系型数据库,对数据进行增删改查 数据仓库 定义:面向主题,集成,稳定,随时间变化的数据集,支持管理决策过程 数据仓库的数据来源: db,数据文件,其他数据运用数据etl工具进行数据获取 etl,用来描述将数据从来源端经过抽取(extract)、转换(transform)...

  • from  http://oracle.chinaitlab.com/ oracle数据库11g面向dba和开发人员的重要新特性:数据仓库和olap     数据库驻留的按多维数据集组织的物化视图(无需任何特殊工具将 olap 多维数据集的强大功能同 sql 的简单性集成在一起)、通过分区变化跟踪功能轻松识别刷新、新增的分析工作区管理器、扩展到子查询和远程表的查询重写以及许多其他新特性使o

  • 在大数据领域里,经常会看到例如数据挖掘、olap、数据分析等等的专业词汇。如果仅仅从字面上,我们很难说清楚每个词汇的意义和区别。今天,我们就来通过一些大数据在高校应用的例子,来为大家说明白—数据挖掘、大数据、olap、数据统计的区别。

  • 1.什么是数据仓库? 数据仓库是决策支持系统(dss)和联机分析应用数据源的结构化数据环境。数据仓库研究和解决从数据库中获取信息的问题。 数据仓库的特征是面向主题,集成性,稳定性和时变性。用于支持管理决策。 数据仓库存在的意义在于对企业的所有数据进行汇总,为企业各个部门提供统一的,规范的数据出口。 面向主题:数据仓库中的数据按照一定的主题进行组织,每一个主题对应一个宏观的分析领域。数据仓库排除对于...

  • (1)数据仓库是基础:无论是数据挖掘还是olap分析,他们成功的关键之一是能够访问正确的、完整的和集成的数据。这也是对数据仓库的要求。数据仓库不仅是集成数据的一种方式和一个焦点,而且所有的数据仓库的欧洲杯足彩官网的解决方案都源自和依赖于数据源部件的质量和效果(这种部件在数据仓库中称为抽取、变换和装载)。数据仓库的特点(集成的、随时间变化、稳定的、面向主题的)为olap分析、数据挖掘的成功提供了坚实的数据基础。(2...

  • 文章目录1. 数据仓库基本概念1.1 数据仓库的定义及特征1.2 数据仓库体系结构1.3 数据模型1.4 粒度2. 数据仓库设计2.1 概念模型设计4.2 逻辑模型设计2.3 物理模型设计3. 数据仓库实现4. 联机分析处理4.1 olap相关概念4.2 olap操作5. 元数据模型5.1 元数据库5.2 元数据类型5.3 元数据作用5.4 元数据的使用 1. 数据仓库基本概念 1.1 数据仓库的定义及特征 数据仓库是一个面向主题的、集成的、时变的并且非易失的,用于支持管理者决策过程的数据集合 数据仓库的

global site tag (gtag.js) - google analytics
网站地图