Gradle for Android——Build.gradle入门

http://stormzhang.com/devtools/2014/12/18/android-studio-tutorial4/

理解基本的Gradle
Gradle是一套自动构建工具包,它可以通过插件集成到很多不同的环境中。在Android Studio中,Gradle的集成是通过恰当命名的Android Gradle插件来实现的。使用Gradle可以做下面很多事情:

  • 减少新项目所需的配置。Gradle 有一套默认配置,它会自动应用于您在 Android Studio 中创建的每个项目。 如果您开发的项目不能遵守这些默认配置规则,Gradle 也很容易自定义。
  • 声明项目依赖关系。依赖关系可以是模块、 JAR 文件或者库,并且它们既可以位于本地文件系统也可以位于远程服务器上。
  • 测试你的项目。Gradle 自动生成一个测试目录,并从您项目的测试源文件生成一个测试 APK,还可以在构建过程中运行测试。
  • 生成签名APK。Gradle 自动生成一个测试目录,并从您项目的测试源文件生成一个测试 APK,还可以在构建过程中运行测试。
  • 从单个模块生成多个APK。Gradle可以使用不同的包和配置从单个模块生成多个APK。这个特性对安卓开发人员来说特别方便,有以下几个原因:
1) 支持各种设备
Android 平台开发中很大一部分是用来尽可能支持更多不同的 Android 设备和不同版本的 Android 操作系统。 谷歌市场甚至有多 APK 支持,因此您可以为您的 app 创建多个版本,在每个版本针对不同的设备配置,在市场中提供单独的清单列表。
这就是为什么引进 Gradle 的原因。 您可以使用 Android 的新构建系统从同一个模块生成多个 APK 的不同版本。 只需要给这些不同版本提供相同的包名,您就可以将它们上传到相同的谷歌市场清单列表。

2) 提供一个 app 的不同版本
有时,您会想要在谷歌市场中列出您的 app 的多个版本,例如,您想要提供您的 app 的免费和"Pro"版本。 同样,您可以使用 Gradle 从同一个模块中生成多个 APK,并给每个 APK 一个不同的包名。 之后你就可以分别上传每个 APK 到谷歌市场中。

当我们创建一个新的工程,Android Studio会默认为我们创建三个gradle文件,两个build.gradle,一个settings.gradle。

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

include ':app'

新创建的项目只有app一个子项目(Module)。如果在project里添加了子项目(Module),按理需在setting.gradle里添加相应子项目名称,如:

include ':app', ':androidlibrary'

提示:当你添加一个Module后,最新版的Android Studio会自动在settings.gradle里配置好。

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

2.project对应的build.gradle解析
该gradle文件是定义在这个工程下的所有模块的公共属性,它默认有三个“节点”,buildscript、allprojects和task clean:

buildscript {
     repositories {
         jcenter() 
     }
      dependencies {
          classpath 'com.android.tools.build:gradle:1.2.3'
      }
}
allprojects {
     repositories {
          jcenter() 
     }
}

buildscript定义了全局的相关属性,其第一个子“节点”是声明仓库源,默认是jcenter,之前版本则是mavenCentral,也可以两个center共存。jcenter可以理解成是一个新的中央远程仓库,兼容maven中心仓库,而且性能更优。第二个子“节点”是声明Android gradle plugin的版本,Android Studio 1.5版默认是gradle 1.3。

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

task clean声明了一个任务,任务名叫clean(也可以改为其它),任务类型是Delete(也可以是Copy),就是每当修改settings.gradle文件后点击同步,就会删除rootProject.buildDir下的文件(实际上我看到的效果是清除了External Libraries里的包,然后又添加了一次)。

扫描二维码关注公众号,回复: 3547182 查看本文章

3.module对应的build.gradle解析
模块对应的gradle文件只对该模块起作用,有apply、android和dependencies三部分。该模块文件应该是这样:

apply plugin: 'com.android.application'
   android {
       compileSdkVersion 22
       buildToolsVersion "22.0.1"
       defaultConfig {
           applicationId "com.gradleforandroid.gettingstarted"
           minSdkVersion 14
           targetSdkVersion 22
           versionCode 1
           versionName "1.0"
       }
       buildTypes {
           release {
               minifyEnabled false
               proguardFiles getDefaultProguardFile
                ('proguard-android.txt'), 'proguard-rules.pro'
           }
        } 
    }
    dependencies {
       compile fileTree(dir: 'libs', include: ['*.jar'])
       compile 'com.android.support:appcompat-v7:22.2.0'
     }

插件
该文件的第一行是Android应用插件,其是google的Andorid开发团队编写的插件,能够提供所有关于Android应用和依赖库的构建,打包和测试。

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

  • compileSdkVersion:编译该app时候,你想使用到的sdk版本
  • buildToolsVersion:构建工具的版本号

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

defaultConfig {
       applicationId "com.gradleforandroid.gettingstarted"
       minSdkVersion 14
       targetSdkVersion 22
       versionCode 1
       versionName "1.0"
}

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

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

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

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

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

buildTypes方法定义了如何构建不同版本的app。buildTypes默认是release(也可以添加debug),minifyEnabled表示是否需要混淆,proguardFiles 表示混淆配置文件的名称。productFlavors表示多渠道包(以后深入学习后再写)。

依赖包
依赖模块作为gradle默认的属性之一(这也是为什么其放在Android的外面),默认情况下,我们依赖了所有在libs文件下的jar文件,同时包含了AppCompat这个aar文件。

在向项目(module)添加依赖关系时,Gradle提供了几个选项:

  • 选项1:拖拽文件到项目的libs/目录
    相关build.gradle文件将自动更新
  • 选项2:手动修改build.gradle文件
    打开build.gradle文件并在依赖环节添加新的构建规划。例如,如果您想要添加谷歌服务,您的项目依赖项节将会看起来是这样:
dependencies {

       compile fileTree(dir: 'libs', include: ['*.jar'])

     compile 'com.google.android.gms:play-services:6.5.+'

   }
  • 选项3:使用Android Studio的用户界面
    在 Project 面板中,右击你要添加依赖的模块,然后选择 Open Module Settings。选择 Dependencies 选项卡,紧接着选择左下角的 + 按钮。 你可以选择以下列表中的选项:

 - library Dependency
 - File Dependency
 - Module Dependency

然后,你可以输入要添加到您的项目中的依赖的详细信息。例如,如果你选择 Library Dependency,Android Studio 显示一个库列表供您选择。

一旦您添加了你的依赖,请检查您的模块级 build.gradle 文件。 它应该会自动更新以包含新的依赖关系。

猜你喜欢

转载自blog.csdn.net/zjpp2580369/article/details/82713817