一、介紹
在看這篇文章之前,你可能已經(jīng)將自己的jar或者aar上傳到j(luò)center,甚至已經(jīng)使用過(guò)Novada bintray-release。
在這里我們不討論怎么上傳,只討論bintray-release存在的缺陷。
那就是不能指定的目錄或者文件。
如果我們的jar或者aar需要用proguard混淆,那么如何上傳混淆過(guò)的Jar ?
針對(duì)此問(wèn)題,我們需要修改bintray-release。
二、目標(biāo)
上傳指定目錄內(nèi)的文件(比如Proguard混淆生成的Jar或Aar)。
三、具體實(shí)現(xiàn)
上傳Jcenter,我們知道需要一個(gè)Source Jar,一個(gè) JavaDoc,一個(gè)Pom文件,可選項(xiàng)[Aar]
簡(jiǎn)單讀一下源碼,我們首先了解一下大概結(jié)構(gòu)。
3.1 我們要知道bintray-release為Android Studio的一個(gè)插件。
而每一個(gè)自定義的Plugin都需要實(shí)現(xiàn)Plugin<T>
接口,這個(gè)也是整個(gè)邏輯的入口。
由此可知ReleasePlugin
便是整個(gè)入口。
3.2 PublishExtension
是用戶接觸的DSL接口。
3.3 PropertyFinder
是PublishExtension
的具體實(shí)現(xiàn)
3.4 AndroidArtifacts
為Source包的實(shí)現(xiàn)。
以上幾個(gè)文件便是我們主要修改的地方。
首先在PublishExtension新增兩個(gè)參數(shù):
//start archivesPath aaron
// 路徑
String archivesPath = ''
//關(guān)鍵字
String archivesName = ''
//end
其次,在PropertyFinder內(nèi)新增兩個(gè)獲取具體Jar的函數(shù)。
//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()
函數(shù)如下:
//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內(nèi)新增archivesPath參數(shù),可將指定的jar包或者aar包放在此目錄下,會(huì)指定上傳此目錄內(nèi)的壓縮包。這樣我們便可以很容易上傳自己生成的jar,比如混淆過(guò)的。
4.1新增依賴
4.1.1 根目錄下的build.gradle中加入上傳開(kāi)源庫(kù)的依賴:
classpath 'com.aaron.gradle:bintray-release:1.3.1'
4.1.2 library的module中加入 apply
apply plugin: 'com.aaron.gradle.bintray-release'
4.2簡(jiǎn)單使用
利用 publish
閉包完成相應(yīng)設(shè)置:
publish {
userOrg = 'novoda'
groupId = 'com.novoda'
artifactId = 'bintray-release'
publishVersion = '0.3.4'
archivesPath = '../build/outputs' //指定將要上傳的壓縮包路徑,如果不寫(xiě)則默認(rèn)上傳系統(tǒng)生成的jar和aar
archivesName = 'bintray-release' //指定將要上傳的壓縮包所含的關(guān)鍵字,如果不寫(xiě),默認(rèn)過(guò)濾artifactId
desc = 'Oh hi, this is a nice description for a project, right?'
website = 'https://github.com/snailflying/bintray-release'
}
最后,利用 task bintrayUpload
完成上傳 (確保已提前在指定位置生成了相應(yīng)jar包!):
$ ./gradlew bintrayUpload -PbintrayUser=BINTRAY_USERNAME -PbintrayKey=BINTRAY_KEY -PdryRun=false
4.3常見(jiàn)錯(cuò)誤排除
4.3.1 如果你開(kāi)源庫(kù)中有中文注釋在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 忽略錯(cuò)誤信息:module的build.gradle
android {
lintOptions {
abortOnError false
}
}
源碼地址:GitHub