aar引用很简单,将aar复制到libs包下,在项目的build.gradle文件中增加以下代码即可(以aarName.aar为为例):
compile(name:'aarName',ext:'aar')
但是如果aar中包含了远程依赖,例如aar中依赖了第三方库:
implementation 'com.squareup.okhttp3:okhttp:3.10.0'
若采用上面的方法引用则在运行时会找不到okhttp3 库中的类。
针对这种问题可以采用maven仓库来解决,我们可以将aar生成到本地或远程maven仓库,再引用仓库中的aar。或上传maven仓库到服务端或着私服等都可.
脚本配置如下:
gradle.properties设置内容如下:
#版本号
versionCode=1.0
#上传artifactId名称
artifactIdName=AnyMarvel
#上传groupId名称
groupIdValue=com.anymarvel.test
#maven私服用户名
MAVEN_USERNAME=
#maven私服密码
MAVEN_PASSWORD=
# 是否使用本地maven仓库
useLocal=true
若使用本地maven仓库,需要在根目录maven引用中加入maven仓库地址引用:如
repositories {
maven { url "$rootDir/repo" }
google()
jcenter()
}
在module工程build.gradle脚本最下方加入如下脚本配置
apply plugin: 'maven-publish'
publishing {
publications {
aarSDk(MavenPublication) {
artifact "build/outputs/aar/Anymarvel-debug.aar"
groupId groupIdValue
artifactId artifactIdName
version versionCode
pom.withXml {
def dependenciesNode = asNode().appendNode('dependencies')
configurations.implementation.allDependencies.withType(ModuleDependency) { ModuleDependency dp ->
if (dp.version != "unspecified") { // 过滤项目内library引用
def dependencyNode = dependenciesNode.appendNode('dependency')
dependencyNode.appendNode('groupId', dp.group)
dependencyNode.appendNode('artifactId', dp.name)
dependencyNode.appendNode('version', dp.version)
// for exclusions
if (dp.excludeRules.size() > 0) {
def exclusions = dependencyNode.appendNode('exclusions')
dp.excludeRules.each { ExcludeRule ex ->
def exclusion = exclusions.appendNode('exclusion')
exclusion.appendNode('groupId', ex.group)
exclusion.appendNode('artifactId', ex.module)
}
}
}
}
}
}
}
repositories {
maven {
if (!Boolean.parseBoolean(useLocal) && project.hasProperty('MAVEN_USERNAME') && project.hasProperty('MAVEN_PASSWORD')) {
url "这里填入maven 私服地址"
credentials {
username MAVEN_USERNAME
password MAVEN_PASSWORD
}
} else {
url "$rootDir/repo"
}
}
}
}
task publishToMaven(dependsOn: ['assemble', 'publish']) {
doLast {
if (!Boolean.parseBoolean(useLocal)) {
println "finish publish to maven"
} else {
println "finish publish to maven directory:--> $rootDir/repo"
}
}
}
publishToMaven.setGroup('SDKPush')
点击同步gradle后在module模块下的task目录会出现如下group
双击publishToMaven 的task任务即可根据配置上传.
本地目录上传会在根目录生成repo仓库,如图所示:
其中的AnyMarvel-1.0.pom即已包含了依赖第三方内容:如下所示;
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<groupId>com.anymarvel.test</groupId>
<artifactId>AnyMarvel</artifactId>
<version>1.0</version>
<packaging>aar</packaging>
<dependencies>
<dependency>
<groupId>com.android.support</groupId>
<artifactId>recyclerview-v7</artifactId>
<version>26.1.0</version>
</dependency>
<dependency>
<groupId>com.android.support</groupId>
<artifactId>appcompat-v7</artifactId>
<version>26.1.0</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>3.10.0</version>
</dependency>
</dependencies>
</project>
在使用过程中直接使用:
implementation('com.anymarvel.test:AnyMarvel:1.0')
会同步maven中指定的依赖库及版本,若工程中和aar中依赖版本由冲突会由报错,使用如下方法进行规避:
报错内容如下:
使用如下如下方法规避即可:
implementation('com.anymarvel.test:AnyMarvel:1.0') {
exclude group: 'com.android.support'
exclude group: 'com.squareup.okhttp3'
}
有问题请留言
网友评论