project 和task

每一次构建,至少得有一个 project 完成,每一个 project 至少有一个 task ,每一个build.gradle 文件代表一个 project , task 定义在build.gradle中,当初始化构建的时候, gradle 会基于 build 文件,集合所有的 project 和 tasks ,一个 taks 包含一系列动作,然后他们将会按照顺序执行,一个动作就是一段代码块,很像 java 中的方法,

构建声明周期

一旦一个 task 被执行,那么它就不会被再次执行了,不包含依赖的 tasks 总是优先执行,一次构建将会经历以下三个阶段

  1. 初始化阶段 project 实例在这里创建,如果有多个模块,即有多个build.gradle文件,多个 project 实例被创建,
  2. 配置阶段 该阶段,build.gradle脚本被执行,为每个 project 创建和配置所有的tasks
  3. 执行阶段 这一阶段, gradle 会决定哪一个 task 被执行,哪一个 task 会被执行完全依赖开始构建时传入的参数和当前所在文件夹的位置

基本的构建命令

  • assemble 针对每个版本创建一个apk
  • build 是 check 和 assemble 的集合体
  • clean 删除所有的构建任务,包含 apk 文件
  • check 执行 Lint 检查并且能够在 Lint 检测到错误后停止执行脚本

gradlew assemble

Android Stuido task

Android Studio 面板右侧 Gradle Project 栏目,就能看到,双击就可以了

使用aar

  1. 在目录中建立一个文件 例如在根目录下面,和 app 同一级目录,建立一个 aars 文件夹
  2. project 中的build.gradle 中添加下面代码,就可以
allprojects {
    repositories {
        ...
        flatDir {
            dirs '../aar'
        }
    }
}

3.然后就可以在具体的 module 的build.gradle中的 dependencies 中使用了

dependencies{
  compile(name: 'libraryname', ext: 'aar')
}    

这个会告诉 Gradle 在 aars 文件夹下,添加一个叫做 libraryname 的文件,且其后缀是 aar 的作为依赖。

项目根目录下面的build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.

//Project 的build.gradle文件,也就是根目录的build.gradle文件
buildscript {
    repositories {//代表仓库的下载来源,这里的来源是 jcenter 和google
        jcenter()
        google()
    }
    dependencies {//项目以来的 Gradle 构建工具,但是更加具体的版本信息却是在gradle-wrapper.properties这个文件中
        classpath 'com.android.tools.build:gradle:3.0.0'

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

allprojects {//指所有参与构建项目的来源,也就是说我们工程里面所有模块的通用配置,,这里只规定了所有模块的都要用的 jar 包是从 jcenter 和 google 中获取
    // 在 allprojects 标签下配置的好处就是你不需要在每个模块下的build.gradle中单独配置了。
    repositories {
        jcenter()
        google()
    }
}

// buildscript 和 allprojects 的区别
/**
 * allprojects 用于多个项目构建,在 Android 中,使用多项目构建,其实就是使用多个 Moudle 构建,在settings.gradle中通过 inclue 的 Moudle ,
 * 从根目录开始,一直到 include 进来的所有 Moudle 都会执行 allprojects 内容
 *我们也可以通过 subprojects 来指定 moudle 和根目录的不同,也可以通过project(':moduldName'){}指定该 Module 自己的行为
 *
 * buildscript 主要是为了 Gradle 脚本自身的执行,获取脚本依赖插件,在 Android 中,我们构建脚本就是Gradle
 *
 * respositories也可以是根级别的,为当前项目提供所需要的依赖包,但是在 Android 中,这个跟 allprojects 中的 repositories 一致
 * 同样, dependencies 也可以是根级别的
 */

app下面的build.gradle

apply plugin: 'com.android.application'  //语法介绍, apply 是一个方法名, 接受一个 map 类型参数, key 是 plugin , value 是com.android.application
//apply plugin 表明插件类型,这里是com.android.application类型,库工程是com.android.libary,如果是 java 项目,则是java

//这里的 android 表明是 Android 插件相关的配置
android { //该方法包含了 Android 所有的属性,而唯一必须的属性就是 compileSdkVersion 和buildToolsVersion
    compileSdkVersion 26  //编译的sdk
    buildToolsVersion "26.0.2"//编译的 tools 版本

    dataBinding {//开启 dagtaBanding
        enabled = true
    }

    defaultConfig { //默认配置,里面的属性会重写AndroidManifest.xml中对应的属性
        //applicationId 重写了AndroidManifest.xml的包名 package name ,但是关于package name
        applicationId "top.hoyouly.framework"  //应用程序的包名, //在 eclipse 上是配置在AndroidManifest.xml文件中的,在 AS 中配置在build.gradle中了
        //注意,如果这个模块是一个 library 的时候,应该删掉这个 applicationId 不然会报错的,
        // Error:Library projects cannot set applicationId. applicationId is set to '****' in default config.
        minSdkVersion 14 //支持的最低版本号
        targetSdkVersion 26//支持的目标版本号
        //上面这两个属性和AndroidManifest.xml中的<uses-sdk>很像
        versionCode 1//版本号
        versionName "1.0" //版本名 这个显示到应用程序列表中应用详情里面
    }

    sourceSets {//目录指向位置
        main {
            manifest.srcFile 'src/main/AndroidManifest.xml'//指定AndroidManifest.xml路径
            java.srcDirs = ['src/main/java']//指定 source 目录

            // resources.srcDirs = ['src']//指定 source 目录 和下面相等

            resources{
                srcDir 'src/main/'  //指定 source 目录
                exclude '/test/**' //不包含 test 文件路径
            }

            aidl.srcDirs = ['src/main']//指定 source 目录
            renderscript.srcDirs = ['src']//指定 source 目录
            res.srcDirs = ['src/main/res']//指定资源目录
            assets.srcDirs = ['assets']//指定 assets 目录
            jniLibs.srcDirs = ['libs']//指定 lib 目录
        }
        debug.res.srcDirs=['src/main/res-debug']//指定 debug 版本的资源目录是res-debug
        release.manifest.srcFile 'src/main/release/AndroidManifest.xml'//指定 release 版本的AndroidManifest.xml路径是android/AndroidManifest.xml


    }

    signingConfigs {
        releaseConfig {//release 版本签名配置 .名字可以随便起的,
            storeFile file("../signfile/hoyouly.jks")//秘钥文件路径
            storePassword '7419568'// 秘钥文件密码
            keyAlias 'hoyouly_app'//秘钥别名
            keyPassword '1234567' // 秘钥别名密码
        }

        debugConfig {//debug 版本签名配置
            storeFile file("../signfile/hoyouly.jks")//秘钥文件路径
            storePassword '7419568'// 秘钥文件密码
            keyAlias 'hoyouly_app'//秘钥别名
            keyPassword '1234567' // 秘钥别名密码
        }
    }

    buildTypes {//编译类型,这里只有一种编译类型,但是可以添加例如 debug 等其他编译类型,
        release {
            buildConfigField "String", "BaseUrl","\"http://app.cn/api/pad/\"" //设置正式环境下的网络访问路径
            minifyEnabled false  //minifyEnabled  控制是否开启混淆
            //proguardFiles 指定混淆文件,就是proguard-rules.pro
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            zipAlignEnabled true //内存对齐
            shrinkResources false //移除无用的资源文件
            applicationIdSuffix "test"  //
            signingConfig signingConfigs.releaseConfig//设置 release 签名
        }

        debug.initWith(release)//复制 release 内容到debug

        debug {
            buildConfigField "String", "BaseUrl","\"http://app.cn/apitest/pad/\"" //设置正式环境下的网络访问路径
            minifyEnabled false  //minifyEnabled  控制是否开启混淆
            //proguardFiles 指定混淆文件,就是proguard-rules.pro
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
            signingConfig signingConfigs.debugConfig //设置 debug 签名信息
        }

        // 如果想要编译 releas 版本,在命令行输入 ./gradlew buildRelease     注意, release 首字母大写
    }
    lintOptions {
        abortOnError false //lint 时候终止上报,防止编译的时候莫名失败
    }
}

dependencies {//和build.gradle中的一样,
    //想要编译工程,可以compile project(':projectName'
    //编译 aar 包,可以compile(name: 'aarName', ext: 'aar')。

    compile fileTree(dir: 'libs', include: ['*.jar'])//表明编译 libs 文件下面的 jar 文件,所以如果有新的 jar 文件,都放到 libs 目录下面,如果 make 工程没反应,可以在 Gradle 哪里点击同步

    // cong maven库中获取库文件
    compile 'com.squareup.retrofit2:retrofit:2.1.0'//retrofit
    compile 'com.squareup.okhttp3:okhttp:3.5.0'

    compile 'com.google.code.gson:gson:2.6.2'//Gson 库
    //下面两个是 RxJava 和RxAndroid
    compile 'io.reactivex:rxjava:1.1.0'
    compile 'io.reactivex:rxandroid:1.1.0'
    compile 'com.squareup.retrofit2:converter-gson:2.1.0'//转换器,请求结果转换成Model
    compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'//配合 Rxjava 使用

    //添加打印 log 的拦截器
    compile 'com.squareup.okhttp3:logging-interceptor:3.5.0'
    compile 'com.squareup.picasso:picasso:2.71828'

    implementation 'com.android.support:appcompat-v7:26.0.0'
    implementation 'com.android.support:support-v4:26.0.0'
    implementation 'com.android.support:recyclerview-v7:26.0.0'

    compile 'com.android.support:design:26.0.0'

    // 排除第三方库中重复的库
    /*compile('org.eclipse.paho:org.eclipse.paho.android.service:1.0.2') {
        exclude(group: 'com.google.android', module: 'support-v4')
    }*/
//    compile project(':Easylink')//编译附加的项目  ()内的内容要与settings.gradle文件中写的模块名一直,也是以冒号开头,并且用单引号括起来

}

applicationId和 Package name 不同

在 gradle 被用来作为 Android 构建工具之前,package name 在AndroidManifest.xml有两个作用:其作为一个 app 的唯一标示,并且其被用在了 R 资源文件的包名。

implementation 和 compile 区别

待整理


搬运地址:

Build.gradle详细配置说明

Gradle入门学习—认识 buildeTypes 和dependencies

Android 使用 gradle 打包的各种配置

Android Studio 中build.gradle文件的详细解析

从 Eclipse 到AndroidStudio(四)Gradle基本配置

gradle入门

Gradle for Android 第一篇( 从 Gradle 和 AS 开始 )