Android Studio常用Gradle操作

一、Gradle介绍 
Gradle是一个高级构建系统和构建工具,允许通过插件自定义构建逻辑。Gradle的实质是配置脚本,执行一种类型的配置脚本时就会创建一个关联的对象,它由三种脚本类型构成,分别是构建脚本(Build Script)、初始化脚本(Init Script)及设置脚本(Settings Script),其对应的三种代理对象分别是Project对象、Gradle对象及Settings对象。

二、Gradle基础配置

  1. Android Studio对应工程目录 
    Android Studio工程目录
  2. settings.gradle文件介绍 
    该文件是全局的项目配置文件,里面主要声明一些需要加入gradle的module。
  3. build.gradle文件介绍 
    该文件如果是面向工程的,一般用来存储构建脚本的版本来源及工程的仓库来源,如下图所示,指定的构建工具版本是gradle1.2.3,该工具及全局工程的仓库来源都是jcenter;
buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.2.3'
    }
}

allprojects {
    repositories {
        jcenter()
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

而如果该文件面向的是对应的module,则一般指定的module类型,Android相关及依赖库,如下图所示为常用配置。

//module类型,常用的如:'com.android.application'、'com.android.library'、'java'、'maven'等。
apply plugin: 'com.android.application'

//Android常用配置
android {
    //编译版本
    compileSdkVersion 22
    //构建工具版本
    buildToolsVersion "22.0.1"
    //默认配置
    defaultConfig {
        //应用包名
        applicationId 'com.xyy.example'
        //最小版本
        minSdkVersion 15
        //目标版本
        targetSdkVersion 22
        //应用版本号
        versionCode 1
        //应用版本名称
        versionName "1.0"
        //是否允许dex文件超过65535大小,默认打开
        multiDexEnabled true
    }
    //指定编译版本
    compileOptions{
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    //lint检查配置,默认关闭
    lintOptions {
        abortOnError false
    }
    //渠道指定
    productFlavors {

    }
    //签名配置
    signingConfigs {
        //调试版本
        debug {
            storeFile file('×.keystore')
            storePassword ×××
            keyAlias ××××
            keyPassword ×××
        }
        //发布版本
        release {
            //签名文件目录指定,相对于该module
            storeFile file('×.keystore')
            //签名密码
            storePassword ×××
            //Alias名称
            keyAlias ××××
            //Alias密码
            keyPassword ×××    
        }
    }
    //构建类型配置
    buildTypes {
        debug {
            buildConfigField("boolean", "LOG_DEBUG", "true")
            versionNameSuffix "debug"
            minifyEnabled false
            zipAlignEnabled false
            shrinkResources false
            signingConfig signingConfigs.debug
        }
        release {
            //添加buildConfig配置字段,可以设置日志打印开关字段,方便发布时自动关闭打印日志
            buildConfigField("boolean", "LOG_DEBUG", "false")
            //在生成的release版本APK后缀中添加"release"字段
            versionNameSuffix "release"
            //是否混淆(特别注意:如果混淆文件未配置使用false)
            minifyEnabled false
            //是否支持Zip Align
            zipAlignEnabled true
            //是否清理无用资源
            shrinkResources true
            //混淆文件指定
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            //签名指定
            signingConfig signingConfigs.release
        }
    }
    //相关源路径的设置
    sourceSets{
        main{
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
            jniLibs.srcDirs = ['libs']
        }
    }
}

//依赖配置
dependencies {
    //本地依赖文件树
    compile fileTree(dir: 'libs', include: ['*.jar'])
    //远程依赖
    compile '...'
    //远程编译时依赖库但不包含该库,防止重复包含引起包冲突
    provided '...'
    //本地依赖文件
    compile files('...')
    //本地编译时依赖文件,不包含该文件
    provided files('...')
    //本地依赖工程
    compile project('...')
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103
  • 104
  • 105
  • 106
  • 107
  • 108
  • 109
  • 110
  • 111
  • 112
  • 113
  • 114
  • 115

4 gradle.properties文件介绍 
该文件一般用来存储工程范围内的全局属性,而如果是与开发者个人相关且不便纳入版本控制的属性,则放到 $HOME/.gradle 下的 gradle.properties 文件,比如签署app的密钥等。

三、多渠道打包配置

1.在AndroidManifest.xml中设置PlaceHolder(占位符) 
在application下添加

<meta-data
    android:name="渠道名称"
    //渠道名称,可以使用android:value="${变量名}",假如变量名为XYY_FLAVORS,下面使用该变量进行说明
    android:value="渠道ID"
    />
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

2.在对应module中的build.gradle文件中设置productFlavors(渠道信息) 
首先在defaultConfig下设置默认渠道

manifestPlaceholders = [XYY_FLAVORS: "渠道ID"]
  • 1
  • 1

然后在android下指定需要打包的渠道信息

productFlavors {
    渠道ID1 {}
    渠道ID2 {}
    渠道ID3 {}
    渠道ID4 {}
    ...
}
productFlavors.all {
    flavor -> flavor.manifestPlaceholders = [XYY_FLAVORS: name]
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

最后在buidTypes的release下指定发布时的渠道包名称

applicationVariants.all {
    variant -> variant.outputs.each {
        output -> def outputFile = output.outputFile
           if(outputFile != null && outputFile.name.endsWith(".apk")){
                def fileName = "xyy_v${defaultConfig.versionName}_${variant.productFlavors[0].name}.apk"
                output.outputFile = new File(outputFile.parent, fileName)
            }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3.使用assemble命令进行打包 
使用./gradlew assemble+productFlavor+buildType进行打包,如: 
./gradlew assembleBaiduRelease指定Baidu的release版本; 
./gradlew assembleBaidu指定Baidu的release和debug版本; 
./gradlew assembleRelease指定所有渠道的release版本; 
./gradlew assemble指定所有渠道的release和debug版本。

四、Maven仓库管理配置 
1、本地配置,针对所有该用户下所有工程 
在$HOME/.gradle下添加init.gradle文件,这是Gradle初始化脚本,也是面向用户的全局配置,配置如下:

allprojects{
repositories {
    def REPOSITORY_URL = '本地仓库路径'
    //主要逻辑是判定如果是maven2及jcenter仓库,都先执行本地仓库
    all { ArtifactRepository repo ->
        if(repo instanceof MavenArtifactRepository){
            def url = repo.url.toString()
            if (url.startsWith('https://repo1.maven.org/maven2') || url.startsWith('https://jcenter.bintray.com/')) {
                project.logger.lifecycle "Repository ${repo.url} replaced by $REPOSITORY_URL."
                remove repo
                }
            }
        }
        maven {
            url REPOSITORY_URL
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

2、在对应工程的build.gradle配置

allprojects {
    repositories {
        maven{
            credentials{
                username    '用户名'
                password    '密码'
            }
            url '本地仓库路径'
        }
        //jcenter()
        //mavenLocal()
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3、上传代码到本地仓库配置 
在需要上传的module下的build.gradle中添加如下配置

apply   plugin:'maven'
uploadArchives{
    repositories{
        mavenDeployer{
            //指定groupId,在仓库下展示为路径com/xyy/example
            pom.groupId = "com.xyy.example"
            //指定版本号
            pom.version = "1.0.0"
            repository(url: "本地仓库路径"){
                authentication(userName: 用户名, password: 密码) 
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

五、自动化测试配置 
在需要进行测试的module下的build.gradle文件中添加

apply from: '../config/quality.gradle'
  • 1
  • 1

在工程下新建config文件夹,将如下路径https://github.com/xiaoyaoyou1212/vb-android-app-quality/tree/master/config下的文件下载后放置到该文件夹下,再在该工程下使用gradle findbugs、gradle checkstyle、gradle lint及gradle pmd进行代码检查,检查的结果会在build下的reports文件夹下。

六、参考链接

  1. Gradle插件用户指南(译)
  2. 拥抱Gradle:下一代自动化工具
  3. Gradle脚本基础全攻略

猜你喜欢

转载自blog.csdn.net/qq_24531461/article/details/73198110