美文网首页
通过AndroidStudio发布Android Library

通过AndroidStudio发布Android Library

作者: andforce | 来源:发表于2019-02-17 11:27 被阅读74次

    这篇文章很长

    如果已经对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

    相关文章

      网友评论

          本文标题:通过AndroidStudio发布Android Library

          本文链接:https://www.haomeiwen.com/subject/segweqtx.html