Gradle详解

1、gradle采用了Groovy语言,完全兼容maven和ivy。更多详细介绍可以看它的官网:http://www.gradle.org/。

上面那个是module下的build.gradle文件,下面那个是project下的build.gradle文件。这两个文件是有区别的,project下的build.gradle是基于整个project的配置,而module下的build.gradle是每个模块自己的配置。

什么叫maven呢?maven是Apach基金组织推出的一款工具,简单的说就是帮我们下载jar包、并且通过配置xml文件使jar包能被我们的Java代码引用的一个工具,我们用eclipse做Android开发时其实很少有用到maven,都是直接从网上下载个jar包拷到工程目录下用。那么在使用Gradle之后,我们在Android项目中也可以用maven了,想用什么jar包,直接填写在gradle配置文件中,jar包就会自动帮我们下载到工程中,还能通过配置让jar包时刻保持最新版本,如果你网络条件好的话,用maven还是比较方便的。

2、project下的build.gradle

// Top-level build file where you can add configuration options common to all sub-projects/modules.
buildscript {
    //构建过程依赖的仓库
    repositories {
        jcenter()
    }
    //构建过程需要依赖的库
    dependencies {
        //下面声明的是gradle插件的版本
        classpath 'com.android.tools.build:gradle:2.1.0'
        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}
//这里面配置整个项目依赖的仓库,这样每个module就不用配置仓库了
allprojects {
    repositories {
        jcenter()
    }
}
仓库repositories需要声明两次,它们作用不同,buildscript中的仓库是gradle脚本自身需要的资源,而allprojects下的仓库是项目所有模块需要的资源。

3、settings.gradle

include ':app'
这个文件是用来配置多模块的,比如你的项目有两个模块module-a,module-b,那么你就需要在这个文件中进行配置,格式如下:

include ':module-a',':module-b'
4、gradle仓库:

gradle有三种仓库,maven仓库,ivy仓库以及flat本地仓库。声明方式如下:

maven{
  url "..."
}
ivy{
  url "..."
}
flatDir{
  dirs 'xxx'
}
有一些仓库提供了别名,可直接使用:

repositories{
	mavenCentral()
	jcenter()
	mavenLocal()
}
5、module下的build.gradle

//声明插件,这是一个android程序,如果是android库,应该是com.android.library
apply plugin: 'com.android.application'

android {
    //安卓构建过程需要配置的参数
    compileSdkVersion 23//编译版本
    buildToolsVersion "23.0.2"//buildtool版本

    //默认配置,会同时应用到debug和release版本上
    defaultConfig {
        applicationId "com.example.allcontant"//包名
        minSdkVersion 15//最小版本号
        targetSdkVersion 23//最适版本号
        versionCode 1//app版本号
        versionName "1.0"//app版本名
    }

    //这里面可以配置debug和release版本的一些参数,比如混淆、签名配置等
    buildTypes {
        release {
            minifyEnabled false//是否开启混淆
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'//混淆文件位置
        }
    }
}

//模块依赖
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])//依赖libs目录下所有jar包
    testCompile 'junit:junit:4.12'
    compile 'com.android.support:appcompat-v7:23.1.1'//依赖appcompat库
}
6、导入某个project:

你的app是多模块的,假设有两个模块app和module-A,并且app模块是依赖module-A的,这时候我们就需要在app模块的build.gradle中的dependencies结点下配置依赖:

compile project(':module-A')
并且需要在settings.gradle中把module-A模块包含进来:

include ':module-A',':app'
这种情况下module-A模块是作为库存在的,因而它的build.gradle中的插件声明通常应该是这样的:

apply plugin: 'com.android.library'
而且,作为library的模块module-A的build.gradle文件的defaultConfig中是不允许声明applicationId的。

7、声明三方maven仓库:

可能你项目需要的一些库文件是在你们公司的私服上,这时候repositories中仅有jcenter就不行了,你还需要把私服地址配到里面来,注意,应该配到project的build.gradle中的allprojects结点下或者直接配到某个模块中如果仅有这个模块用到。配置方式:

repositories{
     maven{
          url="http://mvnrepo.xxx.com"
     }
}
8、aar文件

  依赖三方aar文件:

compile 'com.aaa.xxx:core:1.0.1@aar'
  将库项目导出为aar:

首先你的项目必须是一个库项目,build.gradle中进行配置

apply plugin : 'com.android.library'
然后你可以在命令行中进到项目目录,执行如下gradle任务:

gradlew assembleRelease//确保该目录下有gradlew文件
生成的aar在/build/output/aar文件夹中。

  引用本地aar:

首先将aar文件放到模块的libs目录下,然后在该模块的build.gradle中声明flat仓库:

repositories {
    flatDir {
        dirs 'libs'
    }
}
再在dependencies结点下依赖该aar模块:

dependencies{
      compile (name:'xxx',ext:'aar')
}
9、排除依赖:

当出现依赖冲突的时候可以通过排除依赖解决,具体方式如下:

compile (group:'xxx',name:'xxx',version:'xxx'){
    exclude group:'xxx',module:'xxx'//module对应的就是artifactId
}
10、多dex支持(打包65k方法数限制)

首先在build.gradle的buildConfig中增加如下配置:

defaultConfig {
    multiDexEnabled true
}
接着,在dependencies结点下增加如下依赖:

dependencies{
	compile 'com.android.support:multidex:1.0.0'
}
最后,让你的Application继承MultiDexApplication,如果你的应用没有声明Application,可以在manifest文件的application结点下增加name属性,值为android.support.multidex.MultiDexApplication。

11、自动移除不用资源

可以在buildTypes结点中增加如下配置:

buildTypes{
     release{
           minifyEnabled true
           shrinkResources true
     }
}
12、忽略lint错误:

可以在build.gradle文件中的android结点下增加如下配置:

android{
     lintOptions{
           abortOnError false
     }
}
13、声明编译的java版本

可以在build.gradle文件中的android结点下增加如下配置:

compileOptions {
    sourceCompatibility JavaVersion.VERSION_1_7
    targetCompatibility JavaVersion.VERSION_1_7
}
14、应用签名配置

首先在module的build.gradle中增加这些字段:

storeFiles:keystore文件存储位置,通常是.jks文件
storePassword 密码
keyAlias keystore别名
keyPassword 密码
具体配置方式为:

signingConfigs {
    //debug版本的签名配置,通常不用配,因为有默认的debug签名
    debug {
    }
    release {
        storeFile file("key.jks")
        storePassword "123456"
        keyAlias "mykey"
        keyPassword "123456"
    }
}
注:

注:debug的默认签名为:
signingConfig android.signingCongfigs.debug
位置为
${home}\.android\debug.keystore
然后在buildTypes结点下的对应版本中添加上面的配置:

buildTypes{
     release{
          signingConfig signingConfigs.release
     }
}
当然,release不是固定的名称,你可以随便取,比如这样:

android {
     signingConfigs {
          debug {
                storeFile file("debug.keystore")
          }
          myConfig {
                storeFile file("other.keystore")
                storePassword "android"
                keyAlias "androiddebugkey"
                keyPassword "android"
          }
     }
     buildTypes {
          foo {
               debuggable true
               jniDebuggable true
               signingConfig signingConfigs.myConfig
         }
    }
}
真实开发中,把密码配置到build.gradle中不是很好的做法,最好的做法是放在gradle.properties中:

RELEASE_STOREFILE=xxx.jks
RELEASE_STORE_PASSWORD=123456
RELEASE_KEY_ALIAS=mykey
RELEASE_KEY_PASSWORD=123456
然后直接引用即可:

storeFile file(RELEASE_STOREFILE)
storePassword RELEASE_STORE_PASSWORD
keyAlias RELEASE_KEY_ALIAS
keyPassword RELEASE_KEY_PASSWORD
15、定制buildConfig:

在build.gradle中配置:

buildTypes{
      release{
            buildConfigField "string","type","\"release\""
      }
      debug{
            buildConfigField "string","type","\"debug\""
      }
}
这样就会在BuildConfig类中生成type字段:

//build/generate/source/buildConfig/release/包名/   路径下的BuildConfig.java
public static final String type = "release"
//build/generate/source/buildConfig/debug/包名/    路径下的BuildConfig.java
public static final String type = "debug"



<think> 首先,用户要求“安卓gradle详细解析”,意思是详细解析安卓中的 Gradle。我需要基于提供的站内引用来构建回答。这些引用是关于 Android Gradle 的编译工具、Gradle 的编译周期、Android Gradle Plugin 解析、Gradle 文件解析等。 关键引用总结: - 引用[1]:解释 GradleAndroid 开发中的作用,比 Ant 和 Buck 更常用,但较慢,原因是编译周期。 - 引用[2]:Android Gradle Plugin (AGP) 解析,涉及 Gradle 版本检查、创建 sdkHandler 和 androidBuilder,以及插件应用。 - 引用[3]:Android Studio 中 Gradle 文件的示例,包括 build.gradle 文件结构、插件应用、android 块、buildTypes 和 dependencies。 - 引用[4]:Gradle 文件解析,包括 projects、tasks、action,以及 local.properties 文件。 用户的问题是基于这些引用,详细解释安卓中的 Gradle。我需要确保回答结构清晰,帮助用户逐步解决问题。 回答结构: 1. **介绍 GradleAndroid 中的角色**:从引用[1],解释 Gradle 是什么,为什么在 Android 中使用它。 2. **Gradle 的核心概念**:引用[4] 提到 projects、tasks、actions;解释这些。 3. **Android Gradle Plugin (AGP)**:引用[2] 详细描述了 AGP 的初始化过程;解释 androidBuilder 的功能。 4. **Gradle 文件结构**:引用[3] 给出 build.gradle 的示例;解释常见部分如 plugins、android 块、dependencies。 5. **编译周期和性能**:从引用[1],提及 Gradle 的编译周期为什么导致速度慢。 6. **相关文件**:引用[4] 提到 local.properties;解释其他相关文件如 settings.gradle。 7. **总结**:简要总结 Gradle 的重要性。 系统级指令: - 所有行内数学表达式用 $...$,但在这个上下文中,可能不需要数学公式,因为是关于 Gradle 的工具解析。如果涉及版本对比等,可以用变量表示,但避免不必要的数学。例如,如果有数值比较,用 $x$,但这里可能不适用。保持简单。 - 独立公式用 $$...$$,但不需要公式。 - LaTeX 语法正确:确保任何数学表达正确。 - 使用中文回答。 - 生成相关问题:在回答末尾添加相关的问题,模仿示例格式。 - 添加引用标识:在引用段落末尾自然地添加 [^n]。 模仿示例的结构: - 标题或主题。 - 解释内容,代码块(如果需要),引用。 - 末尾添加相关问题。 具体内容: ### 安卓 Gradle 详细解析 基于引用,解释: 1. **Gradle 概述**: - GradleAndroid 开发中的主要构建工具,取代了 Ant(引用[1])。它用于编译、打包和发布应用。Gradle 的灵活性来源于其基于 Groovy 的语言和插件系统。 - 引用[1]:Gradle 比早期的 Ant 更现代化,尽管 Buck 等工具可能更快,但 Gradle 被广泛采用是因为其集成性和强大的插件生态。 2. **Gradle 核心概念**: - 来自引用[4]:在 Gradle 中,一个项目(project)对应一个构建单元,包含多个任务(tasks)。任务是构建过程中的步骤,如编译代码或运行测试。Action 是任务中的具体操作代码块。 - 例如,在 build.gradle 文件中,我们定义 tasks 来定制构建。 3. **Android Gradle Plugin (AGP)**: - AGP 是 Gradle 的插件,专为 Android 设计(引用[2])。它扩展了 Java 插件,添加 Android 特定功能。 - 初始化过程:检查 Gradle 版本(如最低版本 3.3 对应 AGP 2.3.0);创建 sdkHandler 管理 Android SDK;创建 androidBuilder 处理合并 manifest、转换为 DEX 等核心操作(引用[2])。 4. **Gradle 文件结构**: - **顶级 build.gradle**:定义项目范围的设置,如仓库和依赖。 - **模块级 build.gradle**:每个模块有自己的文件(引用[3])。示例: ```groovy apply plugin: 'com.android.application' android { compileSdkVersion 19 buildToolsVersion "19.0.0" defaultConfig { applicationId "com.example.my.app" minSdkVersion 8 targetSdkVersion 19 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile project(":lib") compile 'com.android.support:appcompat-v7:19.0.1' compile fileTree(dir: 'libs', include: ['*.jar']) } ``` - 解释各部分:apply plugin 应用 AGP;android 块配置 SDK 版本、应用 ID;buildTypes 定义构建类型;dependencies 声明依赖(引用[3])。 5. **相关文件**: - **local.properties**:指定 SDK 和 NDK 路径(引用[4]),如: ``` sdk.dir=D:\\androidstudio\\SDK ndk.dir=D:\\androidstudio\\SDK\\ndk-bundle ``` - **settings.gradle**:定义项目包括哪些模块。 6. **编译周期和性能**: - Gradle 的编译周期包括配置阶段(解析脚本)和执行阶段(运行任务)。引用[1] 提到这可能导致构建较慢,但 Gradle 的缓存和增量构建可以优化。 7. **Gradle 的优势与挑战**: - 优势:高度可定制、支持多模块、与 Android Studio 集成好。 - 挑战:构建速度可能较慢,尤其在大型项目中(引用[1])。 添加引用标识: - 在描述相关内容时,自然添加 [^1], [^2], 等。 最后,生成相关问题: 模仿示例: §§相关问题§§ 1. Gradle 构建速度优化的方法有哪些? 2. 如何自定义 Gradle 任务来增强构建过程? 3. Android Gradle 插件的最新版本有哪些新特性? 确保语言为中文。 完整回答结构: - 开头介绍。 - 分点解析。 - 代码块。 - 相关问题。 </think> ### 安卓 Gradle 详细解析 在 Android 开发中,Gradle 是一个核心构建工具,负责编译代码、管理依赖、打包应用等任务。它基于 Groovy 语言,支持灵活的自定义,并与 Android Studio 紧密集成。以下我将基于相关引用,详细解析安卓 Gradle 的各个方面。内容包括:Gradle 概述、核心概念、Android Gradle 插件(AGP)解析、Gradle 文件结构、编译周期等。解析将逐步展开,确保结构清晰。 #### 1. **Gradle 概述与角色** GradleAndroid 开发的标准构建工具,取代了早期的 Ant 工具。它旨在简化构建流程,提供更快的开发迭代(尽管其编译周期可能影响速度)。Buck 等工具虽在速度上优化,但 Gradle 凭借其强大的插件生态系统和易用性,成为主流选择。例如,Gradle 支持增量构建和缓存机制,提升大型项目的效率[^1]。在 Android 环境中,Gradle 结合 Android Studio,自动化处理编译、测试和部署。 #### 2. **Gradle 核心概念** Gradle 的构建模型基于三个核心元素: - **Projects(项目)**:一个 Android 项目通常对应一个 Gradle 项目,包含多个模块(modules)。 - **Tasks(任务)**:构建过程中的基本单元,如编译代码或生成 APK。Tasks 是原子操作,串联执行以完成构建。 - **Actions(操作)**:Task 中的代码块,定义具体逻辑(如合并资源文件)。在 build.gradle 文件中,开发者通过配置这些元素定制构建流程[^4]。 例如,一个简单的 Task 定义可能在 build.gradle 中写成: ```groovy task hello { doLast { println 'Hello, Gradle!' } } ``` #### 3. **Android Gradle 插件(AGP)解析** AGP 是 Gradle 的核心插件,专为 Android 设计,扩展 Java 插件功能。AGP 的初始化过程包括: - **版本检查**:AGP 在构建开始时检测 Gradle 版本(如 AGP 2.3.0 要求 Gradle 最低版本为 3.3)。 - **创建核心对象**: - `sdkHandler`:统一管理 Android SDK 路径和逻辑。 - `androidBuilder`:构建的核心引擎,处理 Manifest 合并、DEX 字节码转换等关键操作(例如,将 Java 代码编译为 Android 可执行格式)[^2]。 - **插件应用**:AGP 默认应用 Java 和 Jacoco 插件,支持代码覆盖率和测试集成。例如,在 build.gradle 中应用 AGP: ```groovy apply plugin: 'com.android.application' // 应用 AGP ``` AGP 的工作原理简化了 Android 特定任务,如资源压缩和多版本构建。 #### 4. **Gradle 文件结构详解** Android 项目中的 Gradle 文件是构建配置的核心。主要文件包括: - **顶级 build.gradle**:定义全局设置,如仓库源和项目级依赖(例如,所有模块共享的 Gradle 版本)。 - **模块级 build.gradle**:每个模块有自己的文件,配置模块特定设置。引用[3] 提供了典型示例: ```groovy apply plugin: 'com.android.application' // 应用 AGP android { compileSdkVersion 19 // 编译 SDK 版本 buildToolsVersion "19.0.0" // 构建工具版本 defaultConfig { applicationId "com.example.my.app" // 应用唯一标识 minSdkVersion 8 // 最低兼容 SDK targetSdkVersion 19 // 目标 SDK versionCode 1 // 内部版本号 versionName "1.0" // 用户可见版本 } buildTypes { release { // 发布构建类型 minifyEnabled true // 启用代码混淆 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile project(":lib") // 模块依赖(引用其他模块) compile 'com.android.support:appcompat-v7:19.0.1' // 远程二进制依赖(库) compile fileTree(dir: 'libs', include: ['*.jar']) // 本地二进制依赖(JAR 文件) } ``` 解释: - `android` 块:配置 Android 特定参数,如 SDK 版本和应用 ID。 - `buildTypes`:定义不同构建环境(如 debug 或 release),控制优化选项。 - `dependencies`:管理项目依赖,支持模块(`project`)、远程仓库(如 Maven)和本地文件[^3]。 - **其他关键文件**: - **settings.gradle**:指定项目包含的模块列表。 - **local.properties**:存储 SDK 和 NDK 路径(如 `sdk.dir=D:\\androidstudio\\SDK`),避免硬编码[^4]。 - **gradle-wrapper.properties**:定义 Gradle 版本,确保团队一致性。 #### 5. **Gradle 编译周期与性能** Gradle 构建分为两个阶段: 1. **配置阶段**:解析 build.gradle 文件,初始化 projects 和 tasks(消耗较多时间)。 2. **执行阶段**:运行 tasks 执行构建任务(如编译和打包)。 引用[1] 指出,Gradle 的编译周期是其速度较慢的主要原因,尤其与 Buck 等工具相比。但优化手段如增量构建(只处理变更部分)和缓存可缓解此问题。例如,AGP 的 `androidBuilder` 在合并 Manifest 时使用增量逻辑提升效率[^2]。 #### 总结 GradleAndroid 开发中不可或缺,提供高度可定制的构建流程。通过 AGP 和文件配置,开发者能高效管理依赖、版本和多环境构建。然而,理解其编译周期(如上文所述)对优化性能至关重要。随着 Gradle 和 AGP 版本迭代(如最新版本支持 Jetpack Compose),工具链持续改进[^2][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值