通过AndroidStudio发布Android Library

2019-02-17  本文已影响74人  andforce

这篇文章很长

如果已经对jcenter,maven有了一些概念,可以直接看我的另外一篇精简文章:
快速发布Abdroid Library到JCenter[精简]

另:也可以直接看具体应用实例:
https://github.com/andforce/AsyncOkHttp


开始之前先明白几个概念

maven

Maven是基于项目对象模型(POM project object model),可以通过一小段描述信息(配置)来管理项目的构建,报告和文档的软件项目管理工具
换句话说,Maven是通过pom.xml文件的配置获取jar包的,从而省去了手动拷贝jar包到project的麻烦。

gradle

Gradle是一个基于Apache Ant和Apache Maven概念的项目自动化建构工具。它使用一种基于Groovy的特定领域语言来声明项目设置,而不是传统的XML
翻译一下,gradle是通过Groovy语法,获取library,对Android来说不用自己拷贝jar或者aar了。

从哪里获取?

上面说的maven和gradle都是通过配置,然后自动获取,那么问题来了:从哪里获取?答案:代码仓库
就Android开发来说,目前两个比较著名的仓库是 mavenCentraljcenter

mavenCentral和jcenter

mavenCentral被称为maven的权威中央仓库,但是上传library极其复杂繁琐,这也是被google换掉的原因之一;
其实从名字上看,mavenCentral有点让人困惑,会让人感觉这个仓库只支持maven的配置方式。
其实,无论是mavenCentral还是jcenter都支持maven和gradle的配置方式。
jcenter托管在 https://bintray.com ,也可以说是这个网站在维护管理jcenter仓库;

mavenCentral()被google默认替换成jcenter()

在Android Studio早期版本中,如果我们创建一个Project,给我们的默认repositorymavenCentral()

buildscript {
    repositories {
        mavenCentral() //现在已经被替换成了jcenter()
    }
}
.
.
.
allprojects {
    repositories {
        mavenCentral() //现在已经被替换成了jcenter()
    }
}

之后我们就可以用简单的配置,来使用library了:

implementation 'com.google.code.gson:gson:2.8.5'

正式开始


如果你读完上面的文字,我想你已经明白了,我们为什么选择上传到jcener了:Android Studio现在默认的配置的是jcenter,原因是mavenCentral上传过程太复杂。

注册bintray.com帐号

由于jcenter是托管在bintray.com上的,因此我们只要有bintray的帐号,就可以管理我们自己上传的library了。
注册这一步就不说了,没什么特别的,按照要求填写就行了。

1:添加一个新的Repository,当然如果你不想添加,bintray默认会有一个名字是maven的Repository(不想添加可跳过次步骤)

image.png

填写相关信息:

image.png

2:在Repository中添加一个Package

image.png image.png image.png

3:获取bintray.user和bintray.apikey,下面使用插件上传要用到

bintray.user 就是你注册时候填写的用户名,这没什么好说的。
下面主要说一下如何获取bintray.apikey:


image.png image.png image.png image.png

到此,我们bintray上的配置就完全结束了:

4:编写要上传的Library的代码

使用Android Studio创建一个工程,这个工程其实的作用是为了上传和测试你自己要上传的Library。


image.png

图中的asyncokhttp其实就是一个module(Android Library),这个库其实就是封装了一下okhttp3,让其能在主线程直接调用网络请求。
看一下asyncokhttp的依赖:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    // 省略了一些不重要的信息
    //这里依赖okhttp3
    implementation 'com.squareup.okhttp3:okhttp:3.12.0'
}

5:使用插件开始上传

在编写测试完毕你的代码之后,我们就可以使用插件开始上传你的库了
这里用到的插件一共有两个:

1:maven插件,主要用来帮助生成和打包maven所需要上传的文件
apply plugin: 'com.github.dcendents.android-maven'
2:bintray插件,主要用来打包和上传库到bintray网站
apply plugin: 'com.jfrog.bintray'

在Project的build.gradle(根目录)中添加:

buildscript {
    repositories {
        google()
        jcenter()
        
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.3.1'
        
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files

        // 下面两行是新添加的
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.8.4'
        classpath 'com.github.dcendents:android-maven-gradle-plugin:2.1'
    }
}

在Project的的local.properties中添加上面获取到的bintray.user 和bintray.apikey

image.png

在Moudle的目录下创建3个文件:

image.png

1:android-maven-install.grdle主要是使用apply plugin: 'com.github.dcendents.android-maven'插件,完成maven相关文件的生成与打包。
内容:

apply plugin: 'com.github.dcendents.android-maven'

install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                packaging libraryPackaging
                groupId publishedGroupId
                artifactId artifact

                // Add your description here
                name libraryName
                description libraryDesc
                url websiteUrl

                // Set your license
                licenses {
                    license {
                        name licenseName
                        url licenseUrl
                    }
                }
                developers {
                    developer {
                        id developerId
                        name developerName
                        email developerEmail
                    }
                }
                scm {
                    connection websiteUrl
                    developerConnection websiteUrl
                    url websiteUrl

                }
            }
        }
    }
}

2:android-tasks.gradle主要是生成javadoc.jar和sorce.jar:

task javadoc(type: Javadoc) {
    options.encoding = "utf-8"
    source = android.sourceSets.main.java.srcDirs
    classpath += files(android.bootClasspath)

    options {
        //links "http://docs.oracle.com/javase/7/docs/api/"
        linksOffline "https://developer.android.com/reference","${android.sdkDirectory}/docs/reference"
        encoding = "UTF-8"
    }
    exclude '**/BuildConfig.java'
    exclude '**/R.java'

    android.libraryVariants.all { variant ->
        variant.javaCompileProvider.configure{
            javadoc.classpath += files(it.classpath.files)
        }
    }

}

task sourcesJar(type: Jar) {
    from android.sourceSets.main.java.srcDirs
    classifier = 'sources'
}

task javadocJar(type: Jar, dependsOn: javadoc) {
    classifier = 'javadoc'
    from javadoc.destinationDir
}

artifacts {
    archives javadocJar
    archives sourcesJar
}

3:bintray.gradle主要是用apply plugin: 'com.jfrog.bintray'完成文件的打包上传到bintray.com
内容:

apply plugin: 'com.jfrog.bintray'

configurations {
    optional
    compile.extendsFrom optional
}

def siteUrl = project.websiteUrl
def gitUrl = project.vcsUrl
def libName = project.name

group = project.publishedGroupId
version = project.versionName

Properties properties = new Properties()
properties.load(project.rootProject.file('local.properties').newDataInputStream())

bintray {
    user = properties.getProperty("bintray.user")
    key = properties.getProperty("bintray.apikey")
    configurations = ['archives']

    pkg {
        repo = project.bintrayRepo  //发布到Bintray的maven库
        name = libName  //发布到Bintray上的项目名字
        desc = project.libraryDesc
        override = true
        publish = true
        publicDownloadNumbers = true
        websiteUrl = siteUrl
        issueTrackerUrl = project.issueTrackerUrl
        vcsUrl = gitUrl
        licenses = [project.licenseName]
        publish = true
        //attributes = ['gradle-plugin': 'com.use.less:com.use.less.gradle:gradle-useless-plugin']
        version {
            desc = project.libraryVersionDesc
            released = new Date()
            gpg {
                sign = true //Determines whether to GPG sign the files. The default is false
                passphrase = properties.getProperty("bintray.gpg.password")
                //Optional. The passphrase for GPG signing'
            }
        }
    }
}

6:配置Library的相关信息

在module的build.gradle的最后添加:

ext {
    libraryPackaging = 'aar'                                            //上传aar形式的打包文件

    // jcenter
    bintrayRepo = "network"                                             // 你上传的位于bintray中的Repository名称,如果没有创建会有一个叫maven的
    name = 'asyncokhttp'                                                // 必须和library module的名字相同
    libraryDesc = 'A OkHttp Library'
    publishedGroupId = 'org.zarroboogs.http.asyncokhttp'                // 填写groupId, 一般是包名,比如:com.android.support
    versionName = '1.0.1'                                               // 版本号,比如:22.2.1
    websiteUrl = 'https://github.com/andforce/AsyncOkHttp'              // 可以填写github上的库地址.
    issueTrackerUrl = 'https://github.com/andforce/AsyncOkHttp/issues'  // 可以填写github库的issue地址.
    vcsUrl = 'https://github.com/andforce/AsyncOkHttp.git'              // 可以填写github上库的地址.
    licenseName = "Apache-2.0"
    libraryVersionDesc = 'version descriotion'

    // maven
    artifact = 'asyncokhttp'                                            // 必须和library module的名字相同
    libraryName = 'asyncokhttp'
    developerId = 'anforce'
    developerName = 'andforce'
    developerEmail = '86118@163.com'
    licenseName = 'The Apache Software License, Version 2.0'
    licenseUrl = 'http://www.apache.org/licenses/LICENSE-2.0.txt'

}
apply from: 'android-maven-install.gradle'
apply from: 'android-tasks.gradle'
apply from: 'bintray.gradle'
7:运行命令上传发布的你的Library

在Project的根目录:

#编译
./gradlew install

#上传
./gradlw bintrayUpload

8:手动提交到jcenter

在运行上面的命令之后,我们就可以在bintray的Repo中看到刚刚上传的Library 了。

image.png

但是这个时候,还没有正式发布到jcenter,我需要用手主动提交一下:


image.png

点击Add to JCenter之后,会有一个审核时间,大约24小时后,就可以在JCenter上看到了。

简化


从上面教程我们可以看到,每次都需要创建和引用3个文件,还是挺麻烦的。

apply from: 'android-maven-install.gradle'
apply from: 'android-tasks.gradle'
apply from: 'bintray.gradle'

为了引用方便,可以把上面三个gradle内容放到一个文件中,这样引用一行,效果和上面引用3个文件是一样的

//apply from: 'android-maven-install.gradle
//apply from: 'android-tasks.gradle'
///apply from: 'bintray.gradle'
apply from: 'jcenter.gradle'

这样每次创建一个文件就好了。

其实还能进一步简化:
为了不需要每次都创建这个文件,还可以把这个配置文件放到网络上:
https://github.com/andforce/release-android-lib-to-jcenter
https://raw.githubusercontent.com/andforce/release-android-lib-to-jcenter/master/jcenter.gradle
所以最终,我们的引用方式变成了这样

apply from: 'https://raw.githubusercontent.com/andforce/release-android-lib-to-jcenter/master/jcenter.gradle'

最后,之前编译和上传的命令,也可以合并成一个了:

#编译
#./gradlew install
#上传
#./gradlw bintrayUpload

# 上面的合并成一条
./gradlew jcenter

应用实例

https://github.com/andforce/AsyncOkHttp

上一篇下一篇

猜你喜欢

热点阅读