Gradle in Android Studio (2) - 配置Gradle

#配置Gradle

来自AndroidDevelopers

转载请注明出处 : https://blog.csdn.net/hpu_zyh/article/details/48447255
博客主页 | 简书 | 知乎 | 微博 | github

##建立基本配置
Android Studio创建的project包含一个顶级构建文件(build.gradle), 并且每个module都包含一个构建文件(build.gradle)。他们是纯文本文件,使用Groovy的语法来配置构建,使用Android的Gradle插件生成。在大多数情况下,你只需要修改module下的build.gradle。例如,在BuildSystemExample项目中的modulebuild.gradle如下所示:

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
apply plugin: 'com.android.application'

android {
compileSdkVersion 19
buildToolsVersion "19.0.0"

defaultConfig {
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: 'com.android.application'表示将 Android plugin for Gradle应用到编译。这增加了Android的特定的构建任务,以顶级的构建任务,使得Android {...}提供给指定的Android特定的构建选项元素。

android {...}配置所有的Android特定的构建选项:

  • compileSdkVersion 用来编译的sdk的版本。
  • buildToolsVersion 使用什么版本的编译工具。使用SDK Manager安装多个版本的编译工具。

注:请始终使用其主要版本号 >= 您的编译目标和目标SDK的构建工具版本。

  • defaultConfig配置的清单文件(AndroidManifest.xml)的一些设置。defaultConfig的配置将覆盖AndroidManifest.xml中的设置。
    defaultConfig元素指定的配置适用于所有的版本(build variants),除非一个build variants的配置将覆盖一些值。
  • buildTypes元素控制如何构建和打包应用程序。默认情况下,构建系统定义了两种版本类型:debugreleasedebug类型包括debug标示,并且使用debug key密钥来进行签名。release类型默认情况下没有签名。在这个例子中,release版本使用ProGuard
  • dependenceies元素在android元素之外,Android的元素之后。此元素为依赖模块。后面章节介绍。

注意:当build.gradle文件有改动时,Android Studio需要同步构建配置。点击Android Studio黄色通知栏上的SyncNow

这里写图片描述

##声明依赖

在这个例子中的appmodule声明了三个依赖:

1
2
3
4
5
6
7
8
9
10
11
...
dependencies {
// Module dependency
compile project(":lib")

// Remote binary dependency
compile 'com.android.support:appcompat-v7:19.0.1'

// Local binary dependency
compile fileTree(dir: 'libs', include: ['*.jar'])
}

每个这些相关性进行说明。构建系统将所有编译依赖于编译类路径,并将它们包含在最终方案。

###模块依赖
app模块依赖lib模块, compile project(":lib") 声明了BuildSystemExample对lib模块的依赖关系。当您生成应用程序模块,构建系统装配,包括lib模块。
###远程库依赖
app程序和lib模块从Android支持库都使用ActionBarActivity类,所以这些模块依赖于它。
编译com.android.support:appcompat-v7:19.0.1通过指定的Maven声明对 Android Support Library的19.0.1版本的依赖。 如果你的SDK安装没有这个包,下载并使用SDK管理器进行安装。

AndroidStudio为默认使用Maven的中央仓库项目。 (该配置被包括在顶层构建文件)。
###本地库依赖

如果您有需要本地库依赖模块,JAR文件,这些依赖关系复制到<moduleName>/libs中。
compile fileTree(dir: 'libs', include: ['*.jar'])告诉构建系统依赖 app/libs的所有JAR文件,应该包含在编译类路径,并在最后的封装。

详细信息,请参见 Dependency Management Basics用户指南中。

##运行ProGuard

构建系统可以在构建过程中运行ProGuard混淆你的类。在BuildSystemExample,修改生成文件的应用程序模块运行的ProGuard的发布版本:

1
2
3
4
5
6
7
8
9
10
11
...
android {
...
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
...

getDefaultProguardFile('proguard-android.txt')获得从Android SDK安装的默认ProGuard的设置。 AndroidStudio 增加了模块特定的规则文件proguard-rules.pro的模块,在这里你可以添加自定义的ProGuard规则的根源。

##对包装标识应用程序ID

构建系统的applicationID属性是用来唯一标识应用程序包进行发布。应用程序ID设置在build.gradle文件的Andr​​oid的部分。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
apply plugin: 'com.android.application'

android {
compileSdkVersion 19
buildToolsVersion "19.1"

defaultConfig {
applicationId "com.example.my.app"
minSdkVersion 15
targetSdkVersion 19
versionCode 1
versionName "1.0"
}
...

注意:的applicationID仅指定在build.gradle文件,而不是在AndroidManifest.xml文件。

当使用 build variants,构建系统为每个product flavors 指定的build types生成不同的后缀ID。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
productFlavors {
pro {
applicationId = "com.example.my.pkg.pro"
}
free {
applicationId = "com.example.my.pkg.free"
}
}

buildTypes {
debug {
applicationIdSuffix ".debug"
}
}
....

包名必须在manifest文件中指定。这是用在你的源代码来引用您的R文件,并解决任何相关activity service的注册。

1
package="com.example.app">

注意:如果有多个清单(例如,product flavors为某个build type配置了不同的manifest),包名是可选的体现。如果在这些清单规定,包的名称必须与在清单在src/main/文件夹中指定的包名。

有关构建文件详细信息,请参阅构建系统概述。

##配置签名设置

debugrelease版本不同的应用程序是否能够在安全设备,以及如何将APK进行签名进行调试。构建系统签署的调试版本使用已知的凭据,以避免密码提示在构建时默认密钥和证书。构建系统没有签字的发行版,除非你明确地定义了签约配置此版本。如果您还没有release版本的key,你可以生成一个,参考Signing your Applications

##使用build variants
本节将介绍 构建系统帮助你从一个单一的项目中创建不同的版本。如果你有一个演示版本,有付费版本,你要在Google Paly针对不同的设备分发多个APK,这个很有用。

构建系统使用 product flavors来创建的不同的产品版本。您的应用程序的每一个产品版本可以有不同的功能或设备的要求。构建系统还使用build type构建和打包不同的设置到不同的版本。每个product flavor build type组合形成一个构建变量。编译系统会生成不同的APK版本。

###Build variants

这个例子项目包括两个默认生成(debug和release)和两个类型(demo和full)的。要了解有关构建变种高级应用的详细信息,请参阅构建系统概述。

####Product flavors

要创建您的应用程序不同的产品版本:

  1. build.gradle文件中定义product flavors
  2. 为每个flavors添加不同的设置。
  3. 添加香精的具体来源,您的项目。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
...
android {
...
defaultConfig { ... }
signingConfigs { ... }
buildTypes { ... }
productFlavors {
demo {
applicationId "com.buildsystemexample.app.demo"
versionName "1.0-demo"
}
full {
applicationId "com.buildsystemexample.app.full"
versionName "1.0-full"
}
}
}
...

注意:要在多APK支持分发您的应用程序到Google Play,分配相同的包名称为所有变体,并给每个变体的不同VERSIONCODE。要分发您的应用程序在谷歌播放单独的应用程序的不同变种,指定不同的包名给每个变量。

##针对每个flavor添加其他目录

现在,您创建源文件夹,并添加一个SecondActivity每个味道。要创建演示味源目录结构:

  1. 在项目面板中,展开BuildSystemExample,然后展开应用程序目录。
  2. 右键单击src目录下的应用程序,并选择 New > Directory.。
    创建demo作为新目录的名称,然后单击确定。
    类似地,创建以下目录:
  • app/src/demo/java
  • app/src/demo/res
  • app/src/demo/res/layout
  • app/src/demo/res/values
    由此产生的目录结构如下图1所示。
    这里写图片描述

####添加一个新的活动,各味

要SecondActivity添加到demoflavors:

  1. 创建一个新的Activity。

  2. 选择Blank Activity,然后单击Next

  3. 输入SecondActivity作为该Activity的名称。

  4. 输入com.buildsystemexample.app作为包名,然后单击Finish

  5. 右键单击app/src/demo的java目录,并选择New> Package

  6. 输入com.buildsystemexample.app作为包名,然后单击OK

  7. 拖动SecondActivityapp/src/demo/java下。

  8. 接受默认值,然后单击Refactor
    要增加对SecondActivity布局和一个字符串资源到demo flavors:

  9. 从 * app/src/main/res/layout拖动activity_second.xmlapp/src/demo/res/layout*。

  10. 接受出现的窗口中的默认值,然后单击OK

  11. 复制的strings.xml从应用程序/ src目录/主/ RES到应用程序/ src目录/演示/资源。

  12. 取代的strings.xml具有以下的新副本的内容:

    1
    2
    3
    4
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <string name="hello_world">Demo version only.</string>
    </resources>

    现在,通过复制demo的源码来创建full flavors:

  13. 在项目面板中,右键点击下应用程序/ src目录demo目录,然后选择复制。

  14. 在src /目录下用鼠标右键单击下的应用程序/然后选择粘贴。

  15. 在出现的窗口中,输入“满”作为新的名称,然后单击确定。

  16. 具有下列下的src /全速/ RES /值替换strings.xml中的内容:

    1
    2
    3
    4
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
    <string name="hello_world">This is the full version!</string>
    </resources>

    注:从这一点上,可以独立开发SecondActivity内部各的味道。例如,你可以在韵味十足的增加更多的功能到这个活动。

检查设置的product flavors生效,打开Android studio的Build Variants面板,如下图
这里写图片描述

图2.构建变体面板。

####从MainActivity启动一个flavor-specificActivity

由于香味比活度(SecondActivity)有两种口味相同的包名称和活动名称,你可以从主活动,这是通用于所有的口味启动它。要修改的主要活动:

  1. 编辑activity_main.xml并添加一个按钮:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <LinearLayout ...>
    ...
    <Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/button2"
    android:onClick="onButton2Clicked"/>
    </LinearLayout>
  2. 下面的代码添加到MainActivityonButton2Clicked方法:
    1
    2
    3
    4
    public void onButton2Clicked(View view) {
    Intent intent = new Intent(this, SecondActivity.class);
    startActivity(intent);
    }
  3. 编辑应用程序的Manifest文件引用SecondActivity
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <manifest ...>
    <application ...>
    ...
    <activity
    android:name="com.buildsystemexample.app.SecondActivity"
    android:label="@string/title_activity_second" >
    </activity>
    </application>
    </manifest>

####构建类型

构建类型代表每个应用程序包生成编译包装的版本。默认情况下,提供了debugrelease版本的类型。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
...
android {
...
defaultConfig { ... }
signingConfigs { ... }
buildTypes { ... }
productFlavors {...}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
}
}
}
...

注:虽然只有release类型出现在默认build.gradle文件,但是每个版本都会生成releasedebug版本。

在这个例子中,该product flavors build types创建以下build variants

  • demoDebug
  • demoRelease
  • fullDebug
  • fullRelease

要构建这个例子中,点击Android Studio中Build菜单选项,或调用命令行的 assemble任务。

注:** Build > Make Project** 选项编译自上次编译修改过整个项目的所有源文件。Build > Rebuild Project选项重新编译项目中的所有源文件。

每个build variant产生单独的文件夹。