1. 程式人生 > >在AndroidStudio中,使用Gradle打包aar到JCenter倉庫!完整版教程!填補各種坑

在AndroidStudio中,使用Gradle打包aar到JCenter倉庫!完整版教程!填補各種坑

環境

AndroidStudio 1.2.1.1正式版

本教程以我的一個測試倉庫作為DEMO,名為JCenterDemo。本教程只涉及如何打包aar至JCenter倉庫,如何使用git不在本教程涉及之內,所以本文只是單單在Github建立了一個同名倉庫而已,不過可以推薦一個入門git教程GitBook

    本教程解決javadoc亂碼問題,包含第三方依賴的javadoc打包失敗問題以及install任務生成pom檔案失敗問題。


二.註冊bintray賬號

    在https://bintray.com/上註冊一個賬號。並記錄下你的UserId和API Key,UserId即為你的登陸ID,API Key相當與一種授權,方便你可以不用填入密碼就可以上傳檔案至倉庫。


三.建立你的工程,如我建立的工程為下圖


    一般來說上傳至公共倉庫的均為Library,所以本例也以一個Lib作為示例。並新建一個Module名為JCenterLib的Lib。


    此時工程目錄結構為


四.完成你個人的庫

    如本文新建了兩個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


    執行其中的sourcesJar任務,一般這個任務不會出錯,都會在JCenterLib/build/libs下生成原始碼的jar包,名字為 ModuleName-版本號-sources.jar,如jcenter-1.0.0-sources.jar。


十三,生成javadoc檔案

    同樣執行other中的javadoc任務,如果你的專案中使用了第三方依賴或libs檔案中第三方jar包,這個任務有可能會出錯,出錯異常為程式包不存在或者找不到符號等。


    但是不用擔心,其實這個任務已經算是執行完畢了,他在JCenterLib/build下生成了一個docs的資料夾,並把生成好的html檔案放在其中


十四.執行打包生成javadoc.jar檔案

    執行同樣位於other下的javadocJar任務,如果沒有出錯,會在JCenterLib/build/libs下生成對應的javadoc.jar檔案,但是如果出錯,則需要我們手動打包javadoc.jar檔案

    (1)複製我上傳的附件中的META-INF資料夾到JCenterLib/build/docs/javadoc/檔案內,如圖


    (2)就在當前目錄下,選中所有檔案並右鍵,選擇 新增到"javadoc.zip' 這個選項或類似選項生成一個zip壓縮包。

        開啟此壓縮包看到的效果應如圖:


        (3)複製此zip包到JCenterLib/build/libs目錄下,並改名為 ModuleName-版本號-javadoc,並將檔案字尾名從zip修改為jar


十五.生成pom檔案

     執行同為other下的install任務,如果任務成功會在JCenterLib/build/下生成poms資料夾以及其中的pom-default.xml檔案

        (1)如果任務失敗,則需我們手動配置此檔案,同樣複製我上傳的附件中的poms資料夾至JCenterLib/build/下


        (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任務即可


十七.登陸bintray網站,進行最後一次檢查。

     首先開啟自己的maven倉庫,找到剛剛上傳的倉庫並開啟;然後切換到Files的Tab頁。


        (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)檢查版本號資料夾下的內容。


            正常情況下,應該有四個檔案,分別為javadoc.jar,sources.jar,aar和pom檔案,如果不對則應是三個打包任務沒有執行重新(aar打包任務不需干預),則需全部執行完畢再上傳即可

            *注:如果重新上傳,則應該把當前存在的所有檔案刪除再上傳,否則會出現衝突。

十八.將當前倉庫關聯到jcenter倉庫以便AndroidStudio能夠方便的進行依賴。


    首先切換到General這個Tab頁,然後點選右下方的 Add to JCenter按鈕


    在1處隨便填一些你的lib的介紹即可,然後點選send按鈕即可

    如果管理員稽核通過後會在3箭頭所指之處進行通知


十九.最後我們就可以在我們的專案以外方便的引入這個庫了

    引入的程式碼為

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

附件:下載地址