Android组件化落地方案现在有两种,第一种是以jar/aar包的方式进行编译依赖,另外一种是以工程方式进行依赖,这两种方案各有优缺点,今天分享的是第一种,通过jar/aar方式进行编译依赖。
首先,如果要进行编译依赖就一定要有一个比较好的管理平台来发布以及后续的维护,所以我们使用现在服务端所用的nexus服务。今天主要就是介绍如何在Android里面进行配置,实现打包并且上传到nexus服务中去,以及如何在项目中进行引用。
第一步,创建你的Android工程。然后找到你的Module的build.gradle,做如下修改,以便于你assembleRelease后是jar/aar。
// 注释掉这行,咱们需要生成的是个aar包,而不是applicaiton
//apply plugin: 'com.android.application'
// 增加此行配置,表示当前包生成的是jar/aar
apply plugin: 'com.android.library'
android {
compileSdkVersion 25
buildToolsVersion "25.0.2"
defaultConfig {
// 由于library模式是不能设置applicationId,所以注释掉
// applicationId "com.android.xxx.logger"
minSdkVersion 17
targetSdkVersion 25
versionCode 1
versionName "1.0.0"
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
exclude group: 'com.android.support', module: 'support-annotations'
})
compile 'com.android.support:appcompat-v7:25.3.1'
compile 'com.android.support.constraint:constraint-layout:1.0.2'
testCompile 'junit:junit:4.12'
}
第二步,在project的build.gradle同级目录中,创建一个publish.gradle
并且增加如下代码,此代码的作用是进行打包,并且上传到你的nexus目录地址中。
apply plugin: 'maven'
apply plugin: 'signing'
configurations {
deployerJars
}
repositories {
mavenCentral()
}
// 判断版本是Release or Snapshots
def isReleaseBuild() {
return !VERSION.contains("SNAPSHOT");
}
// 获取仓库url
def getRepositoryUrl() {
return isReleaseBuild() ? RELEASE_URL : SNAPSHOT_URL;
}
// type显示指定任务类型或任务, 这里指定要执行Javadoc这个task,这个task在gradle中已经定义
task androidJavadocs(type: Javadoc) {
// 设置源码所在的位置
source = android.sourceSets.main.java.sourceFiles
}
// 生成javadoc.jar
task androidJavadocsJar(type: Jar) {
// 指定文档名称
classifier = 'javadoc'
from androidJavadocs.destinationDir
}
// 生成sources.jar
task androidSourcesJar(type: Jar) {
classifier = 'sources'
from android.sourceSets.main.java.sourceFiles
}
// 产生相关配置文件的任务
artifacts {
archives androidSourcesJar
archives androidJavadocsJar
}
uploadArchives {
repositories {
mavenDeployer {
beforeDeployment {
MavenDeployment deployment -> signing.signPom(deployment)
}
pom.version = VERSION
pom.artifactId = ARTIFACT_ID
pom.groupId = GROUP_ID
repository(url: getRepositoryUrl()) {
authentication(userName: NAME, password: PASSWORD) // maven授权信息
}
}
}
}
// 进行数字签名
signing {
// 当 发布版本 & 存在"uploadArchives"任务时,才执行
required { isReleaseBuild() && gradle.taskGraph.hasTask("uploadArchives") }
sign configurations.archives
}
第三步,增加这个文件以后,syncy一下会发现报错,因为有些全局变量没有进行声明以及赋值,所以找到同级目录中的gradle.properties,增加如下代码。
# 用于上传到指定nexus服务配置
# 如果在版本号中有 -SNAPSHOT字段,这样在上传的时候会上传到 SNAPSHOT_URL 地址中,反之会上传到 RELEASE_URL 地址中
VERSION=1.0.0-SNAPSHOT
GROUP_ID=com.android.xxx.logger
ARTIFACT_ID=JFLogger
RELEASE_URL=http://maven.xxx.com/nexus/content/repositories/releases/
SNAPSHOT_URL=http://maven.xxx.com/nexus/content/repositories/snapshots/
NAME=***
PASSWORD=**********
第四步,反回来找到Module的build.gradle,然后在最底下增加如下代码,此代码的作用是把gradle的配置引入到项目中,这样你就可以在gradle的命令中调用uploadArchives方法进行打包上传。
apply from: '../publish.gradle'
第五步,执行uploadArchives,可以命令行执行,也可以用IDE的工具来执行,具体画面如下。
至此,所有都已经配置好了,这样你就可以在你的nexus中找到对应的版本了。