Gradle for Android 第二篇( Build.gradle入门 )

转载 2017年02月13日 14:59:07

  • 理解Gradle文件

  • 编写简单的构建任务

  • 自制构建脚本

理解Gradle脚本

当然我们现在讨论的所有内容都是基于Android studio的,所以请先行下载相关工具。当我们创建一个新的工程,Android studio会默认为我们创建三个gradle文件,两个build.gradle,一个settings.gradle,build.gradle分别放在了根目录和moudle目录下,下面是gradle文件的构成图:

  1. MyApp  
  2.   ├── build.gradle  
  3.   ├── settings.gradle  
  4.   └── app  
  5.       └── build.gradle  
  6.         

setting.gradle解析

当你的app只有一个模块的时候,你的setting.gradle将会是这样子的:

  1. include ':app'  

setting.gradle文件将会在初始化时期执行,关于初始化时期,可以查看上一篇博客,并且定义了哪一个模块将会被构建。举个例子,上述setting.gradle包含了app模块,setting.gradle是针对多模块操作的,所以单独的模块工程完全可以删除掉该文件。在这之后,Gradle会为我们创建一个Setting对象,并为其包含必要的方法,你不必知道Settings类的详细细节,但是你最好能够知道这个概念。

根目录的build.gradle

该gradle文件是定义在这个工程下的所有模块的公共属性,它默认包含二个方法:

  1. buildscript {  
  2.      repositories {  
  3.          jcenter()   
  4.      }  
  5.       dependencies {  
  6.           classpath 'com.android.tools.build:gradle:1.2.3'  
  7.       }  
  8. }  
  9. allprojects {  
  10.      repositories {  
  11.           jcenter()   
  12.      }  
  13. }  

buildscript方法是定义了全局的相关属性,repositories定义了jcenter作为仓库。一个仓库代表着你的依赖包的来源,例如maven仓库。dependencies用来定义构建过程。这意味着你不应该在该方法体内定义子模块的依赖包,你仅仅需要定义默认的Android插件就可以了,因为该插件可以让你执行相关Android的tasks。

allprojects方法可以用来定义各个模块的默认属性,你可以不仅仅局限于默认的配置,未来你可以自己创造tasks在allprojects方法体内,这些tasks将会在所有模块中可见。

模块内的build.gradle

模块内的gradle文件只对该模块起作用,而且其可以重写任何的参数来自于根目录下的gradle文件。该模块文件应该是这样:

  1. apply plugin: 'com.android.application'  
  2.   android {  
  3.       compileSdkVersion 22  
  4.       buildToolsVersion "22.0.1"  
  5.       defaultConfig {  
  6.           applicationId "com.gradleforandroid.gettingstarted"  
  7.           minSdkVersion 14  
  8.           targetSdkVersion 22  
  9.           versionCode 1  
  10.           versionName "1.0"  
  11.       }  
  12.       buildTypes {  
  13.           release {  
  14.               minifyEnabled false  
  15.               proguardFiles getDefaultProguardFile  
  16.                ('proguard-android.txt'), 'proguard-rules.pro'  
  17.           }  
  18.        }   
  19.    }  
  20.    dependencies {  
  21.       compile fileTree(dir: 'libs', include: ['*.jar'])  
  22.       compile 'com.android.support:appcompat-v7:22.2.0'  
  23.     }  
  24.       

插件

该文件的第一行是Android应用插件,该插件我们在上一篇博客已经介绍过,其是google的Android开发团队编写的插件,能够提供所有关于Android应用和依赖库的构建,打包和测试

Android

该方法包含了所有的Android属性,而唯一必须得属性为compileSdkVersion和buildToolsVersion:

  • compileSdkVersion:编译该app时候,你想使用到的api版本。

  • buildToolsVersion:构建工具的版本号。

构建工具包含了很多实用的命令行命令,例如aapt,zipalign,dx等,这些命令能够被用来产生多种多样的应用程序。你可以通过sdk manager来下载这些构建工具。

defaultConfig方法包含了该app的核心属性,该属性会重写在AndroidManifest.xml中的对应属性。

  1. defaultConfig {  
  2.        applicationId "com.gradleforandroid.gettingstarted"  
  3.        minSdkVersion 14  
  4.        targetSdkVersion 22  
  5.        versionCode 1  
  6.        versionName "1.0"  
  7. }  

第一个属性是applicationId,该属性复写了AndroidManifest文件中的包名package
name,但是关于applicationId和package
name有一些不同。在gradle被用来作为Android构建工具之前,package
name在AndroidManifest.xml有两个作用:其作为一个app的唯一标示,并且其被用在了R资源文件的包名。

Gradle能够很轻松的构建不同版本的app,使用构建变种。举个例子,其能够很轻松的创建一个免费版本和付费版本的app。这两个版本需要分隔的标示码,所以他们能够以不同的app出现在各大应用商店,当然他们也能够同时安装在一个手机中。资源代码和R文件必须拥有相同的包名,否则你的资源代码将需要改变,这就是为什么Android开发团队要将package name的两大功能拆分开。在AndroidManifest文件中定义的package name依然被用来作为包名和R文件的包名。而applicationid将被用在设备和各大应用商店中作为唯一的标示。

接下来将是minSdkVersion和targetSdkVersion。这两个和AndroidManifest中的<uses-sdk>很像。minSdkVersion定义为最小支持api。

versionCode将会作为版本号标示,而versionName毫无作用。

所有的属性都是重写了AndroidManifest文件中的属性,所以你没必要在AndroidManifest中定义这些属性了。

buildTypes方法定义了如何构建不同版本的app,我们将在下一篇博客中有所介绍。

依赖包

依赖模块作为gradle默认的属性之一(这也是为什么其放在了Android的外面),为你的app定义了所有的依赖包。默认情况下,我们依赖了所有在libs文件下的jar文件,同时包含了AppCompat这个aar文件。我们将会在下一篇博客中讨论依赖的问题。

让我们开始tasks吧

如果你想知道你多少tasks可以用,直接运行gradlew tasks,其会为你展示所有可用的tasks。当你创建了一个Android工程,那么将包含Android tasks,build tasks,build setup tasks,help tasks,install tasks,verification tasks等。

基本的tasks

android插件依赖于Java插件,而Java插件依赖于base插件。

base插件有基本的tasks生命周期和一些通用的属性。

base插件定义了例如assemble和clean任务,Java插件定义了check和build任务,这两个任务不在base插件中定义。

这些tasks的约定含义:

  • assemble: 集合所有的output

  • clean: 清除所有的output

  • check: 执行所有的checks检查,通常是unit测试和instrumentation测试

  • build: 执行所有的assemble和check

Java插件同时也添加了source sets的概念。

Android tasks

android插件继承了这些基本tasks,并且实现了他们自己的行为:

  • assemble 针对每个版本创建一个apk

  • clean 删除所有的构建任务,包含apk文件

  • check 执行Lint检查并且能够在Lint检测到错误后停止执行脚本

  • build 执行assemble和check

默认情况下assemble tasks定义了assembleDebug和assembleRelease,当然你还可以定义更多构建版本。除了这些tasks,android 插件也提供了一些新的tasks:

  • connectedCheck 在测试机上执行所有测试任务

  • deviceCheck 执行所有的测试在远程设备上

  • installDebug和installRelease 在设备上安装一个特殊的版本

  • 所有的install task对应有uninstall 任务

build task依赖于check任务,但是不依赖于connectedCheck或者deviceCheck,执行check任务的使用Lint会产生一些相关文件,这些报告可以在app/build/outputs中查看:

android studio的tasks

你根本不必要去执行gradle脚本在命令行中,Android studio有其对应的工具:

在这个界面,你要做的就是双击了。当然你也可以在Android studio中打开命令行,执行相关命令,具体操作就不介绍了。

自定义构建

当你在Android studio中自定义了gradle文件,需要更新project:

其实该按钮,执行了generateDebugSources tasks,该任务会生成所有必要的classes文件。

BuildConfig和resources

  1. android {  
  2.     buildTypes {  
  3.         debug {  
  4.             buildConfigField "String""API_URL",  
  5.                "\"http://test.example.com/api\""  
  6.                buildConfigField "boolean""LOG_HTTP_CALLS""true"  
  7.      }  
  8.        release {  
  9.             buildConfigField "String""API_URL",  
  10.                 "\"http://example.com/api\""  
  11.                buildConfigField "boolean""LOG_HTTP_CALLS","false"  
  12.      }   
  13.  }  

类似这些定义的常量,当定义了这些属性后,你完全可以在代码中使用:BuildConfig.API_URL和BuildConfig.LOG_HTTP

最近,Android tools team也让其里面定义string变为可能:

  1. android {  
  2.        buildTypes {  
  3.            debug {  
  4.                resValue "string""app_name""Example DEBUG"  
  5.            }  
  6.            release {  
  7.                resValue "string""app_name""Example"  
  8.             }   
  9.        }  
  10. }  

你可以在代码中使用这些string。其中“”不是必须得。

全局设置

如果你有很多模块在一个工程下,你可以这么定义你的project文件。

  1. allprojects {  
  2.        apply plugin: 'com.android.application'  
  3.        android {  
  4.            compileSdkVersion 22  
  5.            buildToolsVersion "22.0.1"  
  6.        }  
  7.  }  
  8.    

这只会在你的所有模块都是Android app应用的时候有效。你需要添加Android 插件才能访问Android的tasks。更好的做法是你在全局的gradle文件中定义一些属性,然后再模块中运用它们。比如你可以在根目录下这么定义:

  1. ext {  
  2.       compileSdkVersion = 22  
  3.       buildToolsVersion = "22.0.1"  
  4.     

那么你在子模块中就可以使用这些属性了:

  1. android {  
  2.        compileSdkVersion rootProject.ext.compileSdkVersion  
  3.        buildToolsVersion rootProject.ext.buildToolsVersion  
  4.  }  
  5.    

Project properties文件

上述方法是一种办法,当然还有很多办法:

  • ext方法

  • gradle.properties文件

  • -p参数

  1. ext {  
  2.      local = 'Hello from build.gradle'  
  3. }  
  4.    task printProperties << {  
  5.      println local        // Local extra property  
  6.      println propertiesFile        // Property from file  
  7.      if (project.hasProperty('cmd')) {  
  8.        println cmd        // Command line property  
  9.      }  
  10. }  

当然你可以在gradle.properties中定义:

  1. propertiesFile = Hello from gradle.properties  

你也可以输入命令行:

  1. $ gradlew printProperties -Pcmd='Hello from the command line'  
  2. :printProperties  
  3. Hello from build.gradle  
  4. Hello from gradle.properties  
  5. Hello from the command line  
  6.        

总结

在这篇博客中,我们细致的查看了Android studio生成的三个gradle文件,现在你应该能够自己去创建自己的gradle文件,我们还学习了最基本的构建任务,学习了Android 插件以及其tasks。

在接下来的几年里,Android开发生态将会爆炸性增长,很多有趣的依赖库将会让每个人去使用,在下一篇博客里面,我们将看看我们能有几种方式添加我们的依赖库,这样我们才能够避免造轮子。

来自: http://segmentfault.com/a/1190000004234712

相关文章推荐

Gradle Library项目的多渠道打包实现

项目中由于某种需求需要对Library项目也进行多渠道发布,如:App已经实现了多渠道打包,此时不同渠道包依赖的同一个Library中的某些资源(举个栗子)也需要根据渠道不同而改变,这个时候就需要对L...
  • codezjx
  • codezjx
  • 2015年10月30日 20:36
  • 1964

Gradle for Android 第二篇( Build.gradle入门 )

理解Gradle脚本 当然我们现在讨论的所有内容都是基于Android studio的,所以请先行下载相关工具。当我们创建一个新的工程,Android studio会默认为我们创建三个gradl...

Gradle for Android-高级Build和自定义

既然你已了解Gradle是如何工作、如何创建task和plugin、如何建立持续集成,你可以称自己为专家了。本章包含了一些我们之前没有提到过的提示和技巧,可以使得使用Gradle构建、开发和部署And...

Android Gradle Build Error:Some file crunching failed, see logs for details解决办法

错误日志:Error:java.lang.RuntimeException: Some file crunching failed, see logs for details     ...

gradle for android 自动找当前环境当前最高版本的 sdk 和 build tools

此文版权属于作者所有,任何人、媒体或者网站转载、借用都必须征得作者本人同意! 文件 androidVersion.gradle //--------------------------- // t...
  • lzy0168
  • lzy0168
  • 2016年04月23日 11:06
  • 918

安卓build variant ----Gradle for Android( 构建变体 )

文章出自Gradle for Android第四章( 构建变体 ) 当你在开发一个app,通常你会有几个版本。大多数情况是你需要一个开发版本,用来测试app和弄清它的质量,然后还需要一个生产版本...

Gradle for Android-创建build变体

开发app时,通常都有好几个版本。最常见的就是有一个用来手动测试app和保证质量的测试版本和一个生产版本。这些版本通常都有不同的设置。例如,测试版本的API的URL就不同于生成版本的。除此之外,还可能...

Android入门——Android Studio中的build.gradle文件解析

首先看工程中根路径下的build.gradle文件apply plugin: 'com.android.application' //表示是一个应用程序的模块,可独立运行 //apply plugin...
  • wo_ha
  • wo_ha
  • 2017年01月05日 16:59
  • 468

Gradle for Android 第七篇( Groovy入门 )

迄今为止,我们已经学些了众多gradle构建的概念以及如何运行tasks。在这一章,我们将对这些概念有一个更深的理解,然后开始构建我们自己的tasks。一旦我们掌握了如何编写自定义tasks,那么我们...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Gradle for Android 第二篇( Build.gradle入门 )
举报原因:
原因补充:

(最多只允许输入30个字)