Android Gradle 打包aar到本地Maven庫

打包在本地的優勢

  • 不用搭建Maven庫環境(當然想麻煩點搭建一個內網環境也是可以的)
  • 無網絡時可用(如果還沒用鏡像這個時間絕對很痛苦)
  • 不需要審核(只是個人使用jcenter什么的太浪費時間)
  • 隨時修改源碼(第三方庫的bug不能及時修復,那就自己打包一個)
  • 減少編譯時間(不需要等待Library Module編譯了)

快速使用

先來個栗子 libs-android
首先吧config.gradle復制到Project下(文件去栗子里下載),接著修改Project和Module的build.gradle文件如下。

Project build.gradle 修改

buildscript {
    apply from : "config.gradle"
    ext.kotlin_version = '1.1.2-4'
    repositories {
        maven { url rootProject.ext.maven.aliyunMaven}
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"

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

allprojects {
    repositories {
        flatDir { dirs 'libs' }
        maven { url rootProject.ext.maven.sdkAndroidMaven }
        maven { url rootProject.ext.maven.sdkGoogleMaven }
        maven { url rootProject.ext.maven.sdkMaven }
        maven { url rootProject.ext.maven.localMaven}
        maven { url rootProject.ext.maven.localMavenSnapshots}
        maven { url rootProject.ext.maven.aliyunMaven}
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Module build.gradle 添加

apply plugin: 'maven'

//https://github.com/wittyneko/libs-android
def siteUrl = 'https://github.com/wittyneko/libs-android'
//https://github.com/wittyneko/libs-android.git
def gitUrl = 'https://github.com/wittyneko/libs-android.git'
// 配置、配置、配置
group = "cn.wittyneko"
archivesBaseName = 'auto-layout'
version = '1.0.0-SNAPSHOT'

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

task javadoc(type: Javadoc) {
    //title = ''
    //description = ''
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(configurations.provided.files,configurations.compile.files,android.getBootClasspath().join(File.pathSeparator))
    options {
        encoding 'utf-8'
        charSet 'utf-8'
        links 'http://docs.oracle.com/javase/7/docs/api/'
        linksOffline "https://developer.android.com/reference", "${android.sdkDirectory}/docs/reference"
    }
    exclude '**/BuildConfig.java'
    exclude '**/R.java'
    options.encoding = 'utf-8'
    failOnError false
}

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

artifacts {
    archives sourcesJar
    archives javadocJar
}

uploadArchives {
    repositories {
        mavenDeployer {
            String user = 'admin'
            String password = 'admin123'
            //先讀取gradle.properties,不存在則讀取local.properties
            Properties properties = rootProject.ext.android.properties
            user = rootProject.hasProperty('localUserName') ? rootProject.localUserName : (properties != null ? properties.getProperty('localUserName', user) : user)
            password = rootProject.hasProperty('localPassword') ? rootProject.localPassword : (properties != null ? properties.getProperty('localPassword', password) : password)
            println("user: $user, passowrd: $password")
            repository(url: rootProject.ext.maven.localMaven){
                authentication(userName: user, password: password)
            }
            snapshotRepository(url: rootProject.ext.maven.localMavenSnapshots){
                authentication(userName: user, password: password)
            }
        }
    }
}

執行./gradlew uploadArchives,等待打包完成查看$USER_HOME/.mymaven/snapshotRepository完成了
接下來詳細說明,不想學點Gradle用法的飄過。

環境變量

不配置也是可以的還有gradlew嘛飄過。

GRADLE_HOME = 
GRADLE_USER_HOME = 
PATH = GRADLE_HOME/bin

Gradle屬性配置文件

Gradle 的屬性文件gradle.properties,在不同位置作用范圍不一樣
1). 全局配置
全局的Gradle屬性文件默認在USER_HOME/.gradle/gradle.properties沒有的話可一新建一個,這個配置在任何一個gradle文件都能讀取到
2). Project配置
工程根目錄下的gradle.properties文件,Project可讀取,Module讀取需要加上rootProject.
3). Module配置
同上

打包文檔

1). 。。。

task javadoc(type: Javadoc) {
    //title = ''
    //description = ''
    source = android.sourceSets.main.java.srcDirs
    classpath += project.files(configurations.provided.files,configurations.compile.files,android.getBootClasspath().join(File.pathSeparator))
    options {
        encoding 'utf-8'
        charSet 'utf-8'
        links 'http://docs.oracle.com/javase/7/docs/api/'
        linksOffline "https://developer.android.com/reference", "${android.sdkDirectory}/docs/reference"
    }
    exclude '**/BuildConfig.java'
    exclude '**/R.java'
    options.encoding = 'utf-8'
    failOnError false
}

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

artifacts {
    archives javadocJar
}

2). 。。。

android.libraryVariants.all { variant ->
    println variant.javaCompile.classpath.files
    if(variant.name == 'release') { //我們只需 release 的 javadoc
        task("generate${variant.name.capitalize()}Javadoc", type: Javadoc) {
            // title = ''
            // description = ''
            source = variant.javaCompile.source
            classpath = files(variant.javaCompile.classpath.files, project.android.getBootClasspath())
            options {
                encoding "utf-8"
                links "http://docs.oracle.com/javase/7/docs/api/"
                linksOffline "http://d.android.com/reference", "${android.sdkDirectory}/docs/reference"
            }
            exclude '**/BuildConfig.java'
            exclude '**/R.java'

            failOnError false
        }
        task("javadoc${variant.name.capitalize()}Jar", type: Jar, dependsOn: "generate${variant.name.capitalize()}Javadoc") {
            classifier = 'javadoc'
            from tasks.getByName("generate${variant.name.capitalize()}Javadoc").destinationDir
        }
        artifacts {
            archives tasks.getByName("javadoc${variant.name.capitalize()}Jar")
        }
    }
}

打包源碼

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

artifacts {
    archives sourcesJar
}

上傳到本地Maven庫

apply plugin: 'maven'

group = "cn.wittyneko"
archivesBaseName = 'auto-layout'
version = '1.0.0-SNAPSHOT'

uploadArchives {
    repositories {
        mavenDeployer {
            String user = 'admin'
            String password = 'adminpsd'
            //先讀取gradle.properties,不存在則讀取local.properties
            Properties properties = rootProject.ext.android.properties
            user = rootProject.hasProperty('localUserName') ? rootProject.localUserName : (properties != null ? properties.getProperty('localUserName', user) : user)
            password = rootProject.hasProperty('localPassword') ? rootProject.localPassword : (properties != null ? properties.getProperty('localPassword', password) : password)
            println("user: $user, passowrd: $password")
            repository(url: rootProject.ext.maven.localMaven){
                authentication(userName: user, password: password)
            }
            snapshotRepository(url: rootProject.ext.maven.localMavenSnapshots){
                authentication(userName: user, password: password)
            }
        }
    }
}

參考文獻

Android Studio使用Gradle上傳AAR至Maven
Android 項目打包到 JCenter 的坑

本作品采用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。轉載請保留作者及原文鏈接

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,915評論 18 139
  • 前言 從2013年Google推出Android Studio(后面以AS簡稱)開始,到現在已經歷經3年,版本也發...
    dfqin閱讀 1,873評論 1 3
  • 參考資料:http://gold.xitu.io/post/580c85768ac247005b5472f9htt...
    zhaoyubetter閱讀 11,039評論 0 6
  • 轉載(未找到原始鏈接) Gradle是一種構建工具,它拋棄了基于XML的構建腳本,取而代之的是采用一種基于Gro...
    GYLEE閱讀 4,108評論 0 2
  • Gradle是什么? Gradle 是以Groovy為基礎,面向java應用,基于DSL語法的自動化構建工具。是g...
    Jinwong閱讀 8,176評論 1 65