android studio使用Gradle打包aar到JCenter仓库

环境

AndroidStudio 1.2.1.1正式版

本教程以我的一个测试仓库作为DEMO,名为JCenterDemo。本教程只涉及如何打包aar至JCenter仓库,如何使用git不在本教程涉及之内,所以本文只是单单在Github建立了一个同名仓库而已,不过可以推荐一个入门git教程GitBook

    本教程解决javadoc乱码问题,包含第三方依赖的javadoc打包失败问题以及install任务生成pom文件失败问题。

一.在GitHub中新建一个仓库,并记录下URL,如https://github.com/ls1110924/JCenterDemo

android studio使用Gradle打包aar到JCenter仓库

二.注册bintray账号

    在https://bintray.com/上注册一个账号。并记录下你的UserId和API Key,UserId即为你的登陆ID,API Key相当与一种授权,方便你可以不用填入密码就可以上传文件至仓库。

android studio使用Gradle打包aar到JCenter仓库

三.创建你的工程,如我创建的工程为下图

android studio使用Gradle打包aar到JCenter仓库

    一般来说上传至公共仓库的均为Library,所以本例也以一个Lib作为示例。并新建一个Module名为JCenterLib的Lib。

android studio使用Gradle打包aar到JCenter仓库

    此时工程目录结构为

android studio使用Gradle打包aar到JCenter仓库

四.完成你个人的库

    如本文新建了两个Handler的工具类,分别适用于Activity和Fragment。

    如这是该示例库中的适用于Fragment的Handler工具类

package com.cqu.jcenterlib;

import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;

import java.lang.ref.SoftReference;

/**
 * Created by A Shuai on 2015/5/2.
 * 适用于Fragment的Handler的抽象模板类
 */
public abstract class AbsFragmentHandler<T extends Fragment> extends Handler {

    private final SoftReference<T> mFragmentRef;

    public AbsFragmentHandler(T mFragment) {
        mFragmentRef = new SoftReference<T>(mFragment);
    }

    /**
     * 不许覆写,若对需对消息处理可对{@link #handleMessage(Fragment, Message, Bundle)}进行覆写
     *
     * @param msg Message消息对象
     */
    @Override
    public final void handleMessage(Message msg) {
        T mFragment = mFragmentRef.get();
        if (mFragment == null) {
            return;
        }
        handleMessage(mFragment, msg, msg.getData());
    }

    /**
     * 主要的消息处理逻辑
     *
     * @param mFragment 类型参数T所指定的Fragment对象
     * @param msg       Message消息对象
     * @param mBundle   可以为null
     */
    protected abstract void handleMessage(T mFragment, Message msg, Bundle mBundle);

}


五.在当前工程中的app的这个Module中引用该lib,

    在app这个Module的build.gradle文件中加入一项依赖,即可在app这个Module中使用JCenterLib中定义的工具类了。

complile project(':JCenterLib')

六.打开项目根目录中的build.gradle 添加 buildscript 的 reposiories

classpath 'com.github.dcendents:android-maven-plugin:1.2'
classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'


编辑前:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}


编辑后:

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'

        classpath 'com.github.dcendents:android-maven-plugin:1.2'
        classpath 'com.jfrog.bintray.gradle:gradle-bintray-plugin:1.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

七.在JCenterLib这个Module中新建一个文件,名为bintray.gradle

内容为:

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

group = PROJ_GROUP
version = PROJ_VERSION
project.archivesBaseName = PROJ_ARTIFACTID

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

task javadoc(type: Javadoc) {
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(android.getBootClasspath().join(File.pathSeparator))
}

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

artifacts {
    archives javadocJar
    archives sourcesJar

}

javadoc {
    options{
        encoding "UTF-8"
        charSet 'UTF-8'
        author true
        version true
        links "http://docs.oracle.com/javase/7/docs/api"
    }
}

install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom.artifactId = PROJ_ARTIFACTID
        pom {
            project {
                description PROJ_DESCRIPTION
                packaging 'aar'
                name PROJ_NAME
                url PROJ_WEBSITEURL
                licenses {
                    license {
                        name LICENSE_NAME
                        url LICENSE_URL
                    }
                }
                developers {
                    developer {
                        id DEVELOPER_ID
                        name DEVELOPER_NAME
                        email DEVELOPER_EMAIL
                    }
                }
                scm {
                    connection PROJ_VCSURL
                    developerConnection PROJ_VCSURL
                    url PROJ_WEBSITEURL
                }
            }
        }
    }
}

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

bintray {
    user = properties.getProperty("bintray.user")
    key = properties.getProperty("bintray.apikey")


    configurations = ['published','archives']
    publish = true

    pkg {
        repo = "maven"
        name = PROJ_NAME
        desc = PROJ_DESCRIPTION
        websiteUrl = PROJ_WEBSITEURL
        issueTrackerUrl = PROJ_ISSUETRACKERURL
        vcsUrl = PROJ_VCSURL
        licenses = ["Apache-2.0"]
        publicDownloadNumbers = true
    }
}

    *注:此文件中规定了生成javadoc的编码格式为utf-8,所以大家在使用各种IDE时为了避免各种乱码问题,应在设置中将工作空间的编码设置为统一采用utf-8编码.

八.同样在JCenterLib这个Module下新建一个名为gradle.properties的文件

内容为:

PROJ_GROUP=com.github.ls1110924.library
PROJ_VERSION=1.0.0
PROJ_NAME=JCenterLib
PROJ_WEBSITEURL=https://github.com/ls1110924/JCenterDemo
PROJ_ISSUETRACKERURL=https://github.com/ls1110924/JCenterDemo/issues
PROJ_VCSURL=https://github.com/ls1110924/JCenterDemo.git
PROJ_DESCRIPTION=A Test Lib
PROJ_ARTIFACTID=JCenterLib

LICENSE_NAME='The Apache Software License, Version 2.0'
LICENSE_URL='http://www.apache.org/licenses/LICENSE-2.0.txt'

DEVELOPER_ID=ls1110924
DEVELOPER_NAME=A Shuai
[email protected]


    我先依次解释一下每个条目的意义

    PROJ_GROUP 为你上传的构件的Group,如compile 'com.android.support:appcompat-v7:22.2.0'中的com.android.support

    PROJ_VERSION 为你此次上传构件的版本号,如compile 'com.android.support:appcompat-v7:22.2.0'中的22.2.0,以后更新构件重新上传的时候只需要修改这里就好。

    PROJ_NAME 为上传到你bintray的maven仓库的仓库名,即他会在你的maven仓库中新建一个子仓库,并使用这个值作为仓库名。

    PROJ_WEBSITEURL 为你的工程网站的url,一般为你的Github项目地址,如https://github.com/ls1110924/LightUtils

    PROJ_ISSUETRACKERURL 为你的工程issue的url,一般为https://github.com/ls1110924/LightUtils/issues

    PROJ_VCSURL 为你的项目版本控制系统的url,一般为https://github.com/ls1110924/LightUtils.git,切不可忘记最后面的.git

    PROJ_DESCRIPTION 为你的项目描述,大家随意填写

    PROJ_ARTIFACTID 为你的构件ID,如如compile 'com.android.support:appcompat-v7:22.2.0'中的appcompat-v7

    LICENSE_NAME和LICENSE_URL保持不变即可

    DEVELOPER_ID为开发者ID,大家随意填写

    DEVELOPER_NAME为开发者姓名,随意填写

    DEVELOPER_EMAIL为开发者邮箱,最后填写正确的邮箱,什么邮箱都可以

    *注意:这里最好把构件ID的命名和你要打包上传的Module同名,如若不喜欢Module名作为构件ID,下面教大家动态修改Module名,这里必须同名是因为一会的上传任务是默认使用Module名作为构件ID的,这里声明的构件名就没有了效果。

    这时咱们上传的构件依赖就为  complile 'com.github.ls1110924.library:JCenterLib:1.0.0'

    *这里因为gradle.properties文件是咱们个人的一些私人信息配置,一般不会同步到Github的远程仓库上,这里需要在JCenterLib这个Moduel的.gitignore文件配置忽略上传gradle.properties这个文件

/gradle.properties

九.有心的旁友可能已经注意到第七步中的user和key还没有配置

    其实这两个值就是我们第二步中申请bintray的UserID和分配的APIKey

    打开项目根目录下的local.properties文件,这个文件项目默认提供了忽略,所以可以把一些非常私人的数据放在这里

bintray.user=ls1110924
bintray.apikey=xxxxxxxxxxxxxxxxxxxxx

十.Module改名

    如果一些人不喜欢使用Module名作为PROJ_ARTIFACTID构件ID的用户可以看这一步,无所谓的朋友可以跳过这一步

    打开项目根目录的settings.gradle文件,加一句

def submoduleProject = project(':JCenterLib')
submoduleProject.name = 'jcenter'

    JCenterLib为我们原始的Module名,现在动态改为jcenter,修改后的setting.gradle文件内容为

include ':app', ':JCenterLib'

def submoduleProject = project(':JCenterLib')
submoduleProject.name = 'jcenter'

    这是这个Module虽然目录还为JCenterLib,但是它实际的名字已经变成了jcenter,所以这时候app这个Module继续引用JCenterLib就会报错,所以应修改为app这个Module下的build.gradle文件中的依赖,从

complile project(':JCenterLib')


修改为

compile project(':jcenter')

    同时修改JCenterLib这个Module中gradle.properties中的

PROJ_ARTIFACTID=jcenter

    此时gradle.properties文件内容为:

PROJ_GROUP=com.github.ls1110924.library
PROJ_VERSION=1.0.0
PROJ_NAME=JCenterLib
PROJ_WEBSITEURL=https://github.com/ls1110924/JCenterDemo
PROJ_ISSUETRACKERURL=https://github.com/ls1110924/JCenterDemo/issues
PROJ_VCSURL=https://github.com/ls1110924/JCenterDemo.git
PROJ_DESCRIPTION=A Test Lib
PROJ_ARTIFACTID=jcenter

LICENSE_NAME='The Apache Software License, Version 2.0'
LICENSE_URL='http://www.apache.org/licenses/LICENSE-2.0.txt'

DEVELOPER_ID=ls1110924
DEVELOPER_NAME=A Shuai
[email protected]

    那么此时使用此构建的依赖就变为 complile 'com.github.ls1110924.library:jcenter:1.0.0'

十一.在JCenterLib这个Module中的build.gradle文件末尾加一句

apply from: 'bintray.gradle'


此时该文件内容为

apply plugin: 'com.android.library'

android {
    compileSdkVersion 21
    buildToolsVersion "22.0.1"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 21
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:22.2.0'
}

apply from: 'bintray.gradle'


    这时基本完成了所有的编写工作,接下来开始打包各种jar文件并上传即可

    *此时应进行一次Sync同步操作,因为修改了build.gradle文件,还可以为预防没有生成响应的打包任务。

十二.执行生成sources.jar任务

    展开JCenterDemo - :jcenter - Tasks - other

android studio使用Gradle打包aar到JCenter仓库

    执行其中的sourcesJar任务,一般这个任务不会出错,都会在JCenterLib/build/libs下生成源代码的jar包,名字为 ModuleName-版本号-sources.jar,如jcenter-1.0.0-sources.jar。

android studio使用Gradle打包aar到JCenter仓库

十三,生成javadoc文件

    同样运行other中的javadoc任务,如果你的项目中使用了第三方依赖或libs文件中第三方jar包,这个任务有可能会出错,出错异常为程序包不存在或者找不到符号等。

android studio使用Gradle打包aar到JCenter仓库

    但是不用担心,其实这个任务已经算是执行完毕了,他在JCenterLib/build下生成了一个docs的文件夹,并把生成好的html文件放在其中

android studio使用Gradle打包aar到JCenter仓库

十四.执行打包生成javadoc.jar文件

    执行同样位于other下的javadocJar任务,如果没有出错,会在JCenterLib/build/libs下生成对应的javadoc.jar文件,但是如果出错,则需要我们手动打包javadoc.jar文件

    (1)复制我上传的附件中的META-INF文件夹到JCenterLib/build/docs/javadoc/文件内,如图

android studio使用Gradle打包aar到JCenter仓库

    (2)就在当前目录下,选中所有文件并右键,选择 添加到"javadoc.zip' 这个选项或类似选项生成一个zip压缩包。

        打开此压缩包看到的效果应如图:

android studio使用Gradle打包aar到JCenter仓库

        (3)复制此zip包到JCenterLib/build/libs目录下,并改名为 ModuleName-版本号-javadoc,并将文件后缀名从zip修改为jar

android studio使用Gradle打包aar到JCenter仓库

十五.生成pom文件

     执行同为other下的install任务,如果任务成功会在JCenterLib/build/下生成poms文件夹以及其中的pom-default.xml文件

        (1)如果任务失败,则需我们手动配置此文件,同样复制我上传的附件中的poms文件夹至JCenterLib/build/下

android studio使用Gradle打包aar到JCenter仓库

        (2)使用任意一款编辑器修改poms文件夹下的pom-default.xml文件

<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.github.ls1110924.library</groupId>
  <artifactId>jcenter</artifactId>
  <version>1.0.0</version>
  <packaging>aar</packaging>
  <name>JCenterLib</name>
  <description>A Test Lib</description>
  <url>https://github.com/ls1110924/JCenterDemo</url>
  <licenses>
    <license>
      <name>'The Apache Software License, Version 2.0'</name>
      <url>'http://www.apache.org/licenses/LICENSE-2.0.txt'</url>
    </license>
  </licenses>
  <developers>
    <developer>
      <id>ls1110924</id>
      <name>A Shuai</name>
      <email>[email protected]</email>
    </developer>
  </developers>
  <scm>
    <connection>https://github.com/ls1110924/JCenterDemo.git</connection>
    <developerConnection>https://github.com/ls1110924/JCenterDemo.git</developerConnection>
    <url>https://github.com/ls1110924/JCenterDemo</url>
  </scm>
  <dependencies>
    <dependency>
      <groupId>com.android.support</groupId>
      <artifactId>appcompat-v7</artifactId>
      <version>22.2.0</version>
      <scope>compile</scope>
    </dependency>
  </dependencies>
</project>

    groupId 对应 PROJ_GROUP

    artifactId 对应 PROJ_ARTIFACTID

    version 对应 PROJ_VERSION

    name 对应 PROJ_NAME

    description 对应 PROJ_DESCRIPTION

    url 对应 PROJ_WEBSITEURL

    developer-id 对应 DEVELOPER_ID

    developer-name 对应 DEVELOPER_NAME

    developer-email 对应 DEVELOPER_EMAIL

    connection 对应 PROJ_VCSURL

    developerConnection 对应 PROJ_VCSURL

    url 对应 PROJ_WEBSITEURL

    dependencies标签代表了你的这个库所使用的依赖,但仅限build.gradle中声明的依赖,libs文件夹中的jar包不算

    个人可根据个人情况自行增删,但dependency-scope标签应保持compile不变

十六.最后一步,运行bintrayUpload任务即可

android studio使用Gradle打包aar到JCenter仓库

十七.登陆bintray网站,进行最后一次检查。

     首先打开自己的maven仓库,找到刚刚上传的仓库并打开;然后切换到Files的Tab页。

android studio使用Gradle打包aar到JCenter仓库

        (1)此时应该看到一个以版本命名的文件夹和一个名为maven-metadata.xml的文件,并把maven-metadata.xml文件下载下来(点击maven-metadata.xml即可下载),maven-metadata.xml文件的内容应为:

<?xml version="1.0" encoding="UTF-8"?>
<metadata>
  <groupId>com.github.ls1110924.library</groupId>
  <artifactId>jcenter</artifactId>
  <version>1.0.0</version>
  <versioning>
    <latest>1.0.0</latest>
    <release>1.0.0</release>
    <versions>
      <version>1.0.0</version>
    </versions>
    <lastUpdated>20150612080145</lastUpdated>
  </versioning>
</metadata>

            此时检查groupId,artifactId和version三个标签是否同你设置的一致,重点检查artifactId这个标签,这个标签一般和ModuleName一致,如果你动态修改了ModuleName,则检查当前的值是否和你动态修改后的值一致,如果不一致,则清理工程,重新构建并执行任务和上传。

        (2)检查版本号文件夹下的内容。

android studio使用Gradle打包aar到JCenter仓库
            正常情况下,应该有四个文件,分别为javadoc.jar,sources.jar,aar和pom文件,如果不对则应是三个打包任务没有执行重新(aar打包任务不需干预),则需全部执行完毕再上传即可

            *注:如果重新上传,则应该把当前存在的所有文件删除再上传,否则会出现冲突。

十八.将当前仓库关联到jcenter仓库以便AndroidStudio能够方便的进行依赖。

android studio使用Gradle打包aar到JCenter仓库

    首先切换到General这个Tab页,然后点击右下方的 Add to JCenter按钮

android studio使用Gradle打包aar到JCenter仓库

    在1处随便填一些你的lib的介绍即可,然后点击send按钮即可

    如果管理员审核通过后会在3箭头所指之处进行通知

android studio使用Gradle打包aar到JCenter仓库

十九.最后我们就可以在我们的项目以外方便的引入这个库了

    引入的代码为

compile 'com.github.ls1110924.library:jcenter:1.0.0'

附件:下载地址

转载于:https://my.oschina.net/dccjll/blog/884735