前言
Gradle配置出了问题,心里总有疙瘩,于是翻译了下Configure Your Build
Gradle 构建配置
Android构建系统 编译资源文件和源代码,并将其打包到APK中,你就可以进行测试,部署,签名和分发. Android Studio使用Gradle(一种高级构建工具包)来自动化和管理构建过程,同时允许定义灵活的自定义构建配置.
Gradle和Android插件独立于Android Studio运行。这意味着你可以从Android Studio,计算机上的命令行或未安装Android Studio的计算机(例如持续集成服务器)构建Android应用程序。 无论是从命令行构建项目,还是在远程计算机上使用Android Studio,构建的输出都是相同的。
注意:由于Gradle和Android插件独立于Android Studio运行,因此您需要单独更新构建工具。
构建过程
构建过程涉及许多工具和过程,将项目转换为Android应用程序包(APK)。构建过程非常灵活,因此了解一些正在发生的事情是有用的。
Android APK 的构建过程:
-
编译器将您的源代码转换为DEX(Dalvik Executable)文件。
-
APK Packager将DEX文件和已编译的资源合并为一个APK。但是,在应用程序可以安装并部署到Android设备上之前,APK必须已签名。
-
APK Packager使用调试或发布密钥库对您的APK进行签名.
如果你正在构建你的应用程序的调试版本,也就是一个只打算进行测试和分析的应用程序,打包程序会使用调试密钥库对应用程序进行签名。 Android Studio使用调试密钥库自动配置新项目。
- 在生成您的最终APK之前,打包程序使用zipalign工具优化您的应用程序,以便在设备上运行时使用更少的内存。
自定义构建配置
Gradle和Android插件可以帮助您配置构建的以下方面:
Build Types
构建类型定义了Gradle在构建和打包应用程序时使用的某些属性,并且通常针对开发生命周期的不同阶段进行配置。例如,调试生成类型启用调试选项,并使用调试密钥对APK进行签名,而发布版本类型可能会收缩,模糊处理并使用发布密钥签署APK。必须至少定义一个构建类型才能构建您的应用程序 - 默认情况下,Android Studio创建调试和发布构建类型。在module-level build.gradle 文件中 android {} 内设置。
android {
...
defaultConfig {...}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
applicationIdSuffix ".debug"
}
/**
* The 'initWith' property allows you to copy configurations from other build types,
* so you don't have to configure one from the beginning. You can then configure
* just the settings you want to change. The following line initializes
* 'jnidebug' using the debug build type, and changes only the
* applicationIdSuffix and versionNameSuffix settings.
*/
jnidebug {
// This copies the debuggable attribute and debug signing configurations.
initWith debug
applicationIdSuffix ".jnidebug"
jniDebuggable true
}
}
}
Product Flavors
Product Flavors代表您可以向用户发布的应用程序的不同版本,例如应用程序的免费和付费版本。您可以自定义产品风格以使用不同的代码和资源,同时共享和重用您的应用程序的所有版本常见的部分。产品风格是可选的,必须手动创建它们.
android {
...
defaultConfig {...}
buildTypes {...}
productFlavors {
demo {
applicationId "com.example.myapp.demo"
versionName "1.0-demo"
}
full {
applicationId "com.example.myapp.full"
versionName "1.0-full"
}
}
}
APK Splits
构建系统使您能够自动构建包含特定屏幕密度或应用程序二进制接口(ABI)所需的代码和资源的APK
android {
splits {
// Configures screen density split settings
density {
// Enables density APK splits
enable true
// Specifies a list of screen densities Gradle should not create APK splits for
exclude "ldpi", "xxhdpi", "xxxhdpi"
// Specifies a list of compatible screen size settings for the manifest
compatibleScreens 'small', 'normal', 'large', 'xlarge'
}
}
}
构建配置文件
创建自定义构建配置需要对一个或多个构建配置文件或build.gradle文件进行更改。这些纯文本文件使用域特定语言(DSL)来描述和操作使用Groovy的构建逻辑,Groovy是Java虚拟机(JVM)的动态语言。你不需要知道Groovy开始配置你的构建,因为Gradle的Android插件介绍了你需要的大多数DSL元素.
Android module默认项目结构:
settings.gradle文件位于根项目目录中,告诉Gradle在构建应用程序时应包括哪些模块。对于大多数项目,文件只包括以下内容:
include ‘:app’
The Top-level Build File
位于根项目目录中的顶级build.gradle文件定义了适用于项目中所有模块的构建配置。默认情况下,顶级构建文件使用buildscript {}块来定义项目中所有模块共有的Gradle库和依赖关系。以下代码示例介绍了在创建新项目后,可以在顶级build.gradle中找到的默认设置和DSL元素。
buildscript {
/**
配置Gradle使用的存储库搜索或下载依赖项。 Gradle预配置对远程的支持
例如JCenter,Maven Central和Ivy。您也可以使用本地存储库或定义自己的远程 存储库。
下面的代码定义JCenter作为存储库,Gradle应该使用它来寻找它的依赖。
*/
repositories {
jcenter()
}
/**
下面的代码为2.0.0Gradle作为类路径依赖。
*/
dependencies {
classpath 'com.android.tools.build:gradle:2.0.0'
}
}
/**
allprojects{}块是配置存储库和项目中所有模块使用的依赖项,·例如第三方插件
或类库。所有模块不需要的依赖关系项目应该在 module-level build.gradle文件 中配置。新的项目,Android Studio将JCenter配置为默认存储库,但它
不配置任何依赖关系。
*/
allprojects {
repositories {
jcenter()
}
}
The Module-level Build File
位于每个project/module/目录中的 Module-level build.gradle文件允许您为其所在的特定模块配置构建设置。配置包括自定义打包选项,例如 build types 和 product flavors, 会覆盖 main/ app manifest 或top-level build.gradle 文件的配置。
apply plugin: 'com.android.application'
android {
/**
compileSdkVersion specifies the Android API level Gradle should use tocompile your app.
This means your app can use the API features included in this API level and lower.
buildToolsVersion specifies the version of the SDK build tools, command-line
utilities, and compiler that Gradle should use to build your app. You need to download the build tools using the SDK Manager.
*/
compileSdkVersion 23
buildToolsVersion "23.0.3"
/**
* The defaultConfig {} block encapsulates default settings and entries for all
* build variants, and can override some attributes in main/AndroidManifest.xml
* dynamically from the build system. You can configure product flavors to override
* these values for different versions of your app.
*/
defaultConfig {
/**
* applicationId uniquely identifies the package for publishing.
* However, your source code should still reference the package name
* defined by the package attribute in the main/AndroidManifest.xml file.
*/
applicationId 'com.example.myapp'
// Defines the minimum API level required to run the app.
minSdkVersion 14
// Specifies the API level used to test the app.
targetSdkVersion 23
// Defines the version number of your app.
versionCode 1
// Defines a user-friendly version name for your app.
versionName "1.0"
}
/**
* The buildTypes {} block is where you can configure multiple build types.
* By default, the build system defines two build types: debug and release. The
* debug build type is not explicitly shown in the default build configuration,
* but it includes debugging tools and is signed with the debug key. The release
* build type applies Proguard settings and is not signed by default.
*/
buildTypes {
/**
* By default, Android Studio configures the release build type to enable code
* shrinking, using minifyEnabled, and specifies the Proguard settings file.
*/
release {
minifyEnabled true // Enables code shrinking for the release build type.
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
/**
* The productFlavors {} block is where you can configure multiple product
* flavors. This allows you to create different versions of your app that can
* override defaultConfig {} with their own settings. Product flavors are
* optional, and the build system does not create them by default. This example
* creates a free and paid product flavor. Each product flavor then specifies
* its own application ID, so that they can exist on the Google Play Store, or
* an Android device, simultaneously.
*/
productFlavors {
free {
applicationId 'com.example.myapp.free'
}
paid {
applicationId 'com.example.myapp.paid'
}
}
/**
* The splits {} block is where you can configure different APK builds that
* each contain only code and resources for a supported screen density or
* ABI. You'll also need to configure your build so that each APK has a
* different versionCode.
*/
splits {
// Screen density split settings
density {
// Enable or disable the density split mechanism
enable false
// Exclude these densities from splits
exclude "ldpi", "tvdpi", "xxxhdpi", "400dpi", "560dpi"
}
}
}
/**
* The dependencies {} block in the module-level build configuration file
* only specifies dependencies required to build the module itself.
*/
dependencies {
compile project(":lib")
compile 'com.android.support:appcompat-v7:22.0.1'
compile fileTree(dir: 'libs', include: ['*.jar'])
}
网友评论