一、介绍
在看这篇文章之前,你可能已经将自己的jar或者aar上传到jcenter,甚至已经使用过Novada bintray-release。
在这里我们不讨论怎么上传,只讨论bintray-release存在的缺陷。
那就是不能指定的目录或者文件。
如果我们的jar或者aar需要用proguard混淆,那么如何上传混淆过的Jar ?
针对此问题,我们需要修改bintray-release。
二、目标
上传指定目录内的文件(比如Proguard混淆生成的Jar或Aar)。
三、具体实现
上传Jcenter,我们知道需要一个Source Jar,一个 JavaDoc,一个Pom文件,可选项[Aar]
简单读一下源码,我们首先了解一下大概结构。
3.1 我们要知道bintray-release为Android Studio的一个插件。
而每一个自定义的Plugin都需要实现Plugin
接口,这个也是整个逻辑的入口。
由此可知ReleasePlugin
便是整个入口。
3.2 PublishExtension
是用户接触的DSL接口。
3.3 PropertyFinder
是PublishExtension
的具体实现
3.4 AndroidArtifacts
为Source包的实现。
以上几个文件便是我们主要修改的地方。
首先在PublishExtension新增两个参数:
//start archivesPath aaron
// 路径
String archivesPath = ''
//关键字
String archivesName = ''
//end
其次,在PropertyFinder内新增两个获取具体Jar的函数。
//start archivesPath aaron
FileCollection getArchives() {
getFiles(project, 'archivesPath', extension.archivesPath, extension.archivesName)
}
private FileCollection getFiles(Project project, String propertyName, String archivePath, String archiveName) {
def path = project.hasProperty(propertyName) ? project.getProperty(propertyName) : archivePath
if (path) {
if (archiveName != null) {
return project.fileTree(dir: path).filter {
(it.name.endsWith(FILE_EXTENSION_JAR) || it.name.endsWith(FILE_EXTENSION_AAR)) &&
isNameContains(it, archiveName)
}
} else if (extension.artifactId != null) {
return project.fileTree(dir: path).filter {
(it.name.endsWith(FILE_EXTENSION_JAR) || it.name.endsWith(FILE_EXTENSION_AAR)) &&
isNameContains(it, extension.artifactId)
}
} else {
return project.fileTree(dir: path).filter {
it.name.endsWith(FILE_EXTENSION_JAR) || it.name.endsWith(FILE_EXTENSION_AAR)
}
}
} else {
return null
}
}
private static boolean isNameContains(File file, String archiveName) {
return file.name.substring(0, file.name.length() - FILE_EXTENSION_JAR.length()).contains(archiveName)
}
//end
最后,在AndroidArtifacts,修改all()
函数如下:
//start archivesPath aaron
def all(String publicationName, Project project) {
PropertyFinder propertyFinder = new PropertyFinder(project, project.publish)
if (propertyFinder.getArchives() != null && propertyFinder.getArchives().size() > 0) {
def archive = propertyFinder.getArchives().asList()
archive.add(javadocJar(project))
return archive
} else {
[sourcesJar(project), javadocJar(project), mainJar(project)]
}
}
//end
具体代码可参考GitHub
四、使用方法
在publish内新增archivesPath参数,可将指定的jar包或者aar包放在此目录下,会指定上传此目录内的压缩包。这样我们便可以很容易上传自己生成的jar,比如混淆过的。
4.1新增依赖
4.1.1 根目录下的build.gradle中加入上传开源库的依赖:
classpath 'com.aaron.gradle:bintray-release:1.3.1'
4.1.2 library的module中加入 apply
apply plugin: 'com.aaron.gradle.bintray-release'
4.2简单使用
利用 publish
闭包完成相应设置:
publish {
userOrg = 'novoda'
groupId = 'com.novoda'
artifactId = 'bintray-release'
publishVersion = '0.3.4'
archivesPath = '../build/outputs' //指定将要上传的压缩包路径,如果不写则默认上传系统生成的jar和aar
archivesName = 'bintray-release' //指定将要上传的压缩包所含的关键字,如果不写,默认过滤artifactId
desc = 'Oh hi, this is a nice description for a project, right?'
website = 'https://github.com/snailflying/bintray-release'
}
最后,利用 task bintrayUpload
完成上传 (确保已提前在指定位置生成了相应jar包!):
$ ./gradlew bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false
4.3常见错误排除
4.3.1 如果你开源库中有中文注释在module的build.gradle加入格式
allprojects {
repositories {
jcenter()
}
//加上这些
tasks.withType(Javadoc) {
options{ encoding "UTF-8"
charSet 'UTF-8'
links "http://docs.oracle.com/javase/7/docs/api"
}
}
}
根目录下的build.gradle中增加
tasks.getByPath(":library模块:releaseAndroidJavadocs").enabled = false
4.3.2 忽略错误信息:module的build.gradle
android {
lintOptions {
abortOnError false
}
}
源码地址:GitHub