Gradle Hacks

****一、****Hack one:

将android studio中Library生成的aar文件上传到本地建立的(maven)仓库中,方便今后的库文件的管理和调用

solution:

1、将一个module成为一个android第三方库文件:

1>、在app这个module下面的build.gradle文件中:

apply plugin: 'com.android.application'

修改为:

apply plugin: 'com.android.library'

2>、在

android {
   .....
    lintOptions{
        abortOnError false
    }
}

中这样添加(不加的话报错会提示)

3>在mac下的Terminal中,运行

sudo ./gradlew build

成功之后,在build/libs会有打包好的aar文件

2、将aar文件打包至指定的本地maven仓库中

1>、在build.gradle文件中添加:

apply plugin: 'maven'
.....
.....
ext {
    PUBLISH_GROUP_ID = 'com.fantianwen'
    PUBLISH_ARTIFACT_ID = 'keyboard'
    PUBLISH_VERSION = android.defaultConfig.versionName
}

uploadArchives {
    repositories.mavenDeployer {
        def deployPath = file(getProperty('aar.deployPath'))
        repository(url: "file:///${deployPath.absolutePath}")
        pom.project {
            groupId project.PUBLISH_GROUP_ID
            artifactId project.PUBLISH_ARTIFACT_ID
            version project.PUBLISH_VERSION
        }
    }
}

其中:
ext可以定义动态属性。
uploadArchives定义上传aar文件的一个任务。

2>、使用命令:

sudo ./gradlew uploadArchives

这样在本地仓库就有了。

二、Hack two

将打包的apk文件放置在工程某文件夹下,或者放着在多个地方,或者上传至远程仓库

Solution:

uploadArchives {
    repositories {
        flatDir {
            dirs 'file:///Users/RadAsm/gradle-study/0625'
        }
    }
}

将打包的文件放置在/Users/RadAsm/gradle-study/0625这个文件夹下面

三、Hack three

如何使用maven或者ivy的仓库

solution:

repositories {
    maven {
        url "http://repo.mycompany.com/maven2"
    }
}
repositories {
    ivy {
        url "http://repo.mycompany.com/repo"
    }
}

或者使用maven的本地仓库

repositories {
    maven {
        // URL can refer to a local directory
        url "../local-repo"
    }
}

四、Hack four

使用gradle打包android library并上传至jcenter全球maven库

solution

在project根目录下面的build.gradle的dependencies节点下:

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

library的build.gradle文件中:

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

version = "1.3"

def siteUrl = 'https://github.com/fantianwen/CommonDHJT'    // project homepage
def gitUrl = 'https://github.com/fantianwen/CommonDHJT.git' // project git

group = "com.chinaums.dhjt"

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        minSdkVersion 8
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    sourceSets {
        main {
            jniLibs.srcDirs = ["libs"]
        }

    }
    lintOptions{
        abortOnError false
    }

}

install {
    repositories.mavenInstaller {
        // This generates POM.xml with proper parameters
        pom {
            project {
                packaging 'aar'
                name 'dhjt-sdk-release'
                url siteUrl
                licenses {
                    license {
                        name 'The Apache Software License, Version 2.0'
                        url 'http://www.apache.org/licenses/LICENSE-2.0.txt'
                    }
                }
                developers {
                    developer {
                        id 'fantianwen'
                        name 'tianwen.fan'
                        email '[email protected]'
                    }
                }
                scm {
                    connection gitUrl
                    developerConnection gitUrl
                    url siteUrl
                }
            }
        }
    }
}

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
}

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

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 = "maven"
        name = "dhjt-sdk-release"                // project name in jcenter
        websiteUrl = siteUrl
        vcsUrl = gitUrl
        licenses = ["Apache-2.0"]
        publish = true
    }
}

同时你需要在工程根目录下面的local.properties中书写:

bintray.user = yourName
bintray.apikey = XXXXXXXX

然后依次执行gradle命令


bash gradlew javadocJar

bash gradlew sourcesJar

bash gradlew install

bash gradlew bintrayUpload

这样library就上传到了jcenter中,但是一个********新的********jcenter中的文件目录(library)需要进行提交审核。然后提交审核一下就OK了,一般从提交到审核完毕需要8小时左右。

****Note****:注意你的library的名称,就是在jcenter中的文件名称了,这个会区分文件目录,新的文件目录需要提交审核!

如何在build.gradle中进行library的引用

上传完毕之后,会在>>library根目录>>build>>poms下面生成pom-default文件,该文件中有诸如下面的说明:

  com.chinaums.dhjt
  dhjt-sdk-release
  1.3
  aar
  dhjt-sdk-release

然后,引用的时候,按照格式:

compile 'groupId:artifactId:version'

进行引用

注意点:

只有不同的library的名称才需要重新提交,已经审核通过的,但是不同版本(经过迭代,提高版本)只要upload上去,不再需要重新审核了。

五、Hack 5

多渠道打包

1、多个module同时需要使用一样的变量配置(共享gradle文件)

在rootProject的build.gradle中声明该文件即可

apply from: 'buildsystem/dependencies.gradle'

其中,denpendencies.gradle中如此定义变量

ext {
    ANDROID_BUILD_MIN_SDK_VERSION = '8'
    ANDROID_COMPILE_SDK_VERSION = '19'
    ANDROID_TARGET_SDK_VERSION = '15'
    ANDROID_BUILD_TOOLS_VERSION = '23.0.2'
    VERSION_NAME = 'v2.0.2'
    VERSION_CODE = '180'
}

然后,在各个模块的gradle文件中,使用

def globalConfiguration = rootProject.extensions.getByName('ext')

就行获取到全局变量

2、android{...}

defaultConfig

所有定义在defaultConfig中的变量,如果在AndroidManifest.xml中有定义,将会对AndroidManifest.xml文件中的变量进行覆写

productFlavors{...}

定义各种不用的“渠道”

比方说定义了如下的渠道:

pro{
}
air{
}

那么在Build>Select Build Variant中将会看见不同的打包的参数

这个打包的参数,在执行./gradlew assemble命令的时候会全部执行,从而在build下面生成不同版本的apk

variantFilter{...}

对上面的buildVariant进行过滤,如果设置

 variant.setIgnore(false)

则表示,在assemble中,会进行相应打包命令的忽略,会在Build Variant中看见相应的打包参数发生了变化

各种不用的打包命令中对进行的处理

applicationVariants.all{variant->...}

2、如果在不用的渠道打包过程中需要compile不同的文件

dependencies {
    
    for (def i = 0; i < android.productFlavors.size(); i++) {
        if (android.productFlavors[i].name == 'dhjt_debug') {
            dhjt_debugCompile files('libs/mpos-plugin-sdk-3.5.0-debug.jar')
        }
        if (android.productFlavors[i].name == 'dhjt_release') {
            dhjt_releaseCompile files('libs/mpos-plugin-sdk-3.5.0.jar')
        }
    }

}

你可能感兴趣的:(Gradle Hacks)