栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

浅谈一下Android开发项目组件化之后发布到远程仓库的相关内容

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

浅谈一下Android开发项目组件化之后发布到远程仓库的相关内容

浅谈一下Android开发项目组件化之后发布到远程仓库的相关内容 1、什么是组件化


上图是组件化工程模型,为了方便理解这张架构图,下面会列举一些组件化工程中用到的名词的含义:

名词含义
集成模式所有的业务组件被“app壳工程”依赖,组成一个完整的APP
组件模式可以独立开发业务组件,每一个业务组件就是一个APP
app壳工程负责管理各个业务组件,和打包apk,没有具体的业务功能
业务组件根据公司具体业务而独立形成一个的工程
功能组件提供开发APP的某些基础功能,例如打印日志、树状图等
Main组件属于业务组件,指定APP启动页面、主界面
Common组件属于功能组件,支撑业务组件的基础,提供多数业务组件需要的功能,例如提供网络请求功能

Android APP组件化架构的目标是告别结构臃肿,让各个业务变得相对独立,业务组件在组件模式下可以独立开发,而在集成模式下又可以变为arr包集成到“app壳工程”中,组成一个完整功能的APP;

从组件化工程模型中可以看到,业务组件之间是独立的,没有关联的,这些业务组件在集成模式下是一个个library,被app壳工程所依赖,组成一个具有完整业务功能的APP应用,但是在组件开发模式下,业务组件又变成了一个个application,它们可以独立开发和调试,由于在组件开发模式下,业务组件们的代码量相比于完整的项目差了很远,因此在运行时可以显著减少编译时间。

上图是组件化工程模型下的业务关系,业务之间将不再直接引用和依赖,而是通过“路由”这样一个中转站间接产生联系,而Android中的路由实际就是对URL Scheme的封装;

如此规模大的架构整改需要付出更高的成本,还会涉及一些潜在的风险,但是整改后的架构能够带来很多好处:

1、加快业务迭代速度,各个业务模块组件更加独立,不再出现业务耦合情况;
2、稳定的公共模块采用依赖库方式,提供给各个业务线使用,减少重复开发和维护工作量;
3、迭代频繁的业务模块采用组件方式,各业务研发可以互不干扰、提升协作效率,并控制产品质量;
4、为新业务随时集成提供了基础,所有业务可上可下,灵活多变;
5、降低团队成员熟悉项目的成本,降低项目的维护难度;
6、加快编译速度,提高开发效率;
7、控制代码权限,将代码的权限细分到更小的粒度;

2、如何创建

Android 小技巧之创建 Lib 库文件

3、如何引用

如果你想在Android Studio中引入一个library到你的项目,你只需添加如下的一行代码到模块的build.gradle文件中。

dependencies {
    compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3'
}

就是如此简单的一行代码,你就可以使用这个library了。

酷呆了。不过你可能很好奇Android Studio是从哪里得到这个library的。

Android studio 是从哪里得到库的?

先从这个简单的问题开始,Android Studio是从build.gradle里面定义的Maven 仓库服务器上下载library的。Apache Maven是Apache开发的一个工具,提供了用于贡献library的文件服务器。总的来说,只有两个标准的Android library文件服务器:jcenter 和 Maven Central。

jcenter

jcenter是一个由 bintray.com维护的Maven仓库 。你可以在这里看到整个仓库的内容。

我们在项目的build.gradle 文件中如下定义仓库,就能使用jcenter了:

allprojects {
    repositories {
        jcenter()
    }
}

Maven Central

Maven Central 则是由sonatype.org维护的Maven仓库。你可以在这里看到整个仓库。

注:不管是jcenter还是Maven Central ,两者都是Maven仓库

我们在项目的build.gradle 文件中如下定义仓库,就能使用Maven Central了:

allprojects {
    repositories {
        mavenCentral()
    }
}

注意,虽然jcenter和Maven Central 都是标准的 android library仓库,但是它们维护在完全不同的服务器上,由不同的人提供内容,两者之间毫无关系。在jcenter上有的可能 Maven Central 上没有,反之亦然。

除了两个标准的服务器之外,如果我们使用的library的作者是把该library放在自己的服务器上,我们还可以自己定义特有的Maven仓库服务器。Twitter的Fabric.io 就是这种情况,它们在https://maven.fabric.io/public上维护了一个自己的Maven仓库。如果你想使用Fabric.io的library,你必须自己如下定义仓库的url。

repositories {
    maven { url 'https://maven.fabric.io/public' }
}

然后在里面使用相同的方法获取一个library。

dependencies {
    compile 'com.crashlytics.sdk.android:crashlytics:2.2.4@aar'
}

但是将library上传到标准的服务器与自建服务器,哪种方法更好呢?当然是前者。如果将我们的library公开,其他开发者除了一行定义依赖名的代码之外不需要定义任何东西。

理解jcenter和Maven Central

为何有两个标准的仓库?

事实上两个仓库都具有相同的使命:提供Java或者Android library服务。上传到哪个(或者都上传)取决于开发者。

起初,Android Studio 选择Maven Central作为默认仓库。如果你使用老版本的Android Studio创建一个新项目,mavenCentral()会自动的定义在build.gradle中。

但是Maven Central的最大问题是对开发者不够友好。上传library异常困难。上传上去的开发者都是某种程度的极客。同时还因为诸如安全方面的其他原因,Android Studio团队决定把默认的仓库替换成jcenter。正如你看到的,一旦使用最新版本的Android Studio创建一个项目,jcenter()自动被定义,而不是mavenCentral()。

有许多将Maven Central替换成jcenter的理由,下面是几个主要的原因。

  • jcenter通过CDN发送library,开发者可以享受到更快的下载体验。

  • jcenter是全世界最大的Java仓库,因此在Maven Central 上有的,在jcenter上也极有可能有。换句话说jcenter是Maven Central的超集。

  • 上传library到仓库很简单,不需要像在 Maven Central上做很多复杂的事情。

  • 友好的用户界面

  • 如果你想把library上传到 Maven Central ,你可以在bintray网站上直接点击一个按钮就能实现。

gradle是如何从仓库上获取一个library的?

gradle是如何从仓库上获取一个library的?

compile 'com.inthecheesefactory.thecheeselibrary:fb-like:0.9.3'

一般来说,我们需要知道library的字符串形式,包含3部分

GROUP_ID:ARTIFACT_ID:VERSION

上面的例子中,GROUP_ID是com.inthecheesefactory.thecheeselibrary ,ARTIFACT_ID是fb-like,VERSION是0.9.3。

GROUP_ID定义了library的group。有可能在同样的上下文中存在多个不同功能的library。如果library具有相同的group,那么它们将共享一个GROUP_ID。通常我们以开发者包名紧跟着library的group名称来命名,比如com.squareup.picasso。然后ARTIFACT_ID中是library的真实名称。至于VERSION,就是版本号而已,虽然可以是任意文字,但是我建议设置为x.y.z的形式,如果喜欢还可以加上beta这样的后缀。

dependencies {
  compile 'com.squareup:otto:1.3.7'
  compile 'com.squareup.picasso:picasso:2.5.2'
  compile 'com.squareup.okhttp:okhttp:2.4.0'
  compile 'com.squareup.retrofit:retrofit:1.9.0'
}

下面是Square library的一个例子。你可以看到每个都可以很容易的分辨出library和开发者的名称。

那么在添加了上面的依赖之后会发生什么呢?简单。Gradle会询问Maven仓库服务器这个library是否存在,如果是,gradle会获得请求library的路径,一般这个路径都是这样的形式:GROUP_ID/ARTIFACT_ID/VERSION_ID。比如可以在http://jcenter.bintray.com/com/squareup/otto/1.3.7 和 https://oss.sonatype.org/content/repositories/releases/com/squareup/otto/1.3.7/

下获得com.squareup:otto:1.3.7的library文件。

然后Android Studio 将下载这些文件到我们的电脑上,与我们的项目一起编译。整个过程就是这么简单,一点都不复杂。

4、上传方式

发布项目到远程仓库,有几种方式(这里除去本地仓库以及建立私人仓库):JitPack、Bintary以及JCenter。

JitPack是一个网站,它允许你把git托管的java或者android项目(支持github、gitlab等),轻松发布到jitpack maven仓库上。(ps:虽然没有实践过,但是看操作简直就是傻瓜式操作与配置)。

但是为啥不用JitPack呢?

JitPack看似傻瓜式的操作和配置,有时会造成更大的麻烦。例如,git项目有配置不对,编译不过去,幸运的话,JitPack很快就能显示错误日志。但是,由于某些原因(有可能是墙的问题),JitPack迟迟不显示日志(日志那个位置一直菊花)。配置各种不透明,例如groupId、artifactId配置不灵活,version只能跟发布版本……

JCenter 是由JFrog公司提供的Bintray中的Java仓库。它是当前世界上最大的Java和Android开源软件构件仓库。 所有内容都通过内容分发网络(CDN)使用加密https连接获取。JCenter是Goovy Grape内的默认仓库,Gradle内建支持(jcenter()仓库),非常易于在其他构建工具内进行配置。JCenter相比MavenCenter构件更多,性能也更好。

Bintary 上传工具,我们可以利用Bintary 上传到JCenter

5、如何上传library到jcenter

Android Library上传到JCenter仓库实践
手把手教你发布自己的开源库到jcenter
把自己的库发布到jcenter/maven/jitpack

总结:组件化开发以及发布有利于我们更好的开发项目,也可以将我们常用的一些工具和方法封装起来供其他全球开发者进行调用,对自己也是一个很好的提升。

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1036573.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号