常见问题

常见问题

更新时间:2018-04-17 15:35:24

什么是模块?

针对 Android 客户端,EMAS 支持基于 OSGi 规范把一个 App 划分成多个业务独立的 Bundle,并对每个 Bundle 的生命周期和依赖加以管理。Android 客户端中每一个 Bundle,我们称之为一个模块。对应到iOS 客户端中,每一个 framework,我们称之为一个模块。

在 EMAS 控制台中,用户首次使用会先注册一个客户端应用。然后如拆分了多个子 Bundle 且通过平台托管这些 Bundle 的依赖和更新过程,则需要在 native 研发,当前客户端应用的配置中添加或者关联模块(即 Bundle);

模块有各自独立的工程地址,可以独立编译、测试、发布;客户端应用的工程地址,是一个把各个 Bundle 合并为一个可以运行的 apk 的工程。

什么是awb?

awb 对应的是 Atlas 里的 Bundle,在 EMAS 提供的打包插件里他的结构和标准的 aar 是一样的。 每个Bundle 都有独立的4大组件, 在构建过程中,每个 Bundle 都会构建出一个 bundleApk, 然后 copy 到 Apk 的 lib/armeabi/libxxx.so 。

  1. Atlas 是伴随着手机淘宝的不断发展而衍生出来的一个运行于 Android 系统上的一个容器化框架,我们也叫动态组件化( Dynamic Bundle )框架。它主要提供了解耦化、组件化、动态性的支持。覆盖了工程师的工程编码期、Apk 运行期以及后续运维期的各种问题。
  2. Atlas中的Bundle:类似 OSGI 规范里面bundle(组件)的概念,每个 bundle 有自己的 classloader,与其他 bundle 相隔离,同时 Atlas 框架下 bundle 有自身的资源段(PackageID,打包时 AAPT 指定);另外与原有 OSGI 所定义的 service 格式不同之处是 Atlas 里面 Bundle 透出所有定义在 Manifest 里面的 component,随着 serviceactivity 的触发执行bundle的安装,运行。

什么是EMAS中的依赖?

在实际工作中,我们的工程都相对复杂,或多或少会有一些外部依赖,EMAS 基于 Gradle 标准对工程的依赖进行管理。

声明依赖

依赖存放在仓库中,一个依赖可以由以下属性指定:

group属性指定依赖的分组(在Maven中,就是groupId)。

name属性指定依赖的名称(在Maven中,就是artifactId)。

version属性指定外部依赖的版本(在Maven中,就是version)。

  1. 什么是仓库?仓库是一种存放依赖的容器,每一个项目都具备一个或多个仓库。EMAS 目前主要采用的是 Maven 仓库。

针对不同业务场景的使用,EMAS 将依赖分为源码依赖和坐标依赖两大类型:

源码依赖:

用户添加模块时可以选择该类型,当用户有该模块的代码库权限,需要对代码进行修改、维护等操作,那么新建模块时选择源码依赖。一般来说,源码依赖的模块,都是自己的业务 Bundle ,作为这个模块的业务负责人,后续可以进行编辑代码、发布模块更新到仓库等操作。

坐标依赖:

区别与源码依赖,当用户只拿到一个模块的坐标而并不真正拥有代码权限或者无需编辑模块代码时,选择坐标依赖。常用于外部依赖是一个三方的业务,并不是自己的业务代码的时候,例如我的客户端中依赖了一个“ fastjson ”的工具,我知道它的maven坐标而并不拥有代码权限,我使用它时就把它作为一个坐标依赖添加到我的工程中。

什么是 EMAS 中的依赖管理?

在理解了什么是依赖的前提下,我们再来看什么是 EMAS 中的依赖管理。

EMAS 支持用户将自己的依赖全部通过 EMAS 控制台进行托管,在控制台管理模块(即依赖)的生命周期,编码、构建、测试、发布等;

EMAS 中每个客户端版本发布后,会生成一个版本对应的依赖管理归档文件,依赖管理归档文件主要是“某客户端下所有通过平台管理的依赖模块的DepKey和模块的版本号”;

  1. 模块的DepKey = groupId:artifactId:gavType 模块的版本号= version

每个客户端版本对应一份依赖管理文件,在项目构建的过程中,就可以通过依赖管理来指定哪个版本的依赖作为当前项目的基础依赖。

场景一:例如某客户端应用有10个模块通过平台进行依赖管理,线上最新客户端版本为1.0.0,所有模块的版本也为1.0.0,此时用户新建一个项目,将a模块升级到1.0.1,他需要在自己的项目指定依赖为客户端1.0.0版本然后新增变更a,发布1.0.1版本,之后在他的项目中构建客户端的整包时,就会使用a模块的最新版本1.0.1于其他模块的基线版本1.0.0,进行构建。项目中变更的优先级高于基础依赖。

场景二:当前客户端刚发布了最新线上版本2.0.0,此时发现线上的1.0.0版本突然出现了大量的bug而2.0.0版本没有问题,研发怀疑a模块的历史版本出现了问题。此时可以在项目中将依赖管理切换到历史的1.0.0版本,然后针对a模块修复问题,再构建一个整包进行测试验证。如果验证通过,那么可以针对1.0.0版本进行定向的更新发布。

什么是集成区?

EMAS 中定义的集成区,可以理解为一个特殊的项目空间,也是一个容器,主要是针对已经拆分成多模块且通过平台管理的客户端应用,提供模块们的集成过程控制、编译构建、集成流程管理等功能;同时为发布单提供基线数据;