前言
android项目中,gradle相关文件如下:
项目build.gradle:配置项目的整体属性,比如指定使用的代码仓库、依赖的Gradle插件版本等等。模块build.gradle:配置当前Module的编译参数。gradle-wrapper.properites:配置Gradle Wrapper。gradle.properties:配置Gradle的编译参数。具体配置见Gradle官方文档settings.gradle:配置Gradle的多项目管理。local.properties:一般用来存放该Android项目的私有属性配置,比如Android项目的SDK路径。
下面介绍下开发中经常用到的项目build.gradle和模块build.gradle。
1. 项目的build.gradle
新建一个Android项目,它的项目build.gradle的内容如下:
buildscript {
repositories {
google()
jcenter()
}
dependencies {
//配置依赖的Gradle插件版本
classpath 'com.android.tools.build:gradle:4.0.1' //1
}
}
allprojects {
repositories {
google()
jcenter()
}
}
task clean(type: Delete) {
delete rootProject.buildDir
}
Gradle插件属于第三方插件,因此这里在buildscrip块中配置谷歌的Maven库和JCenter库,这样Gradle系统才能找到对应的Gradle插件
如果使用google()报not found: 'google()'错误,可以用如下代码替代:
maven { url 'https://maven.google.com' }
2. 模块的build.gradle
新建一个项目,它的模块build.gradle如下:
apply plugin: 'com.android.application'
android {
compileSdkVersion 30
buildToolsVersion "30.0.3"
defaultConfig {
applicationId "com.example.myapplication"
minSdkVersion 21
targetSdkVersion 30
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
implementation fileTree(dir: "libs", include: ["*.jar"])
implementation 'androidx.appcompat:appcompat:1.2.0'
implementation 'androidx.constraintlayout:constraintlayout:2.0.4'
testImplementation 'junit:junit:4.13.2'
androidTestImplementation 'androidx.test.ext:junit:1.1.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.3.0'
}
2.1. Gradle的Android插件类型
apply引入的插件id为com.android.application,说明当前模块是一个应用程序模块,Gradle的Android插件有多个类型分别为:
- 应用程序插件**,插件id为com.android.application,会生成一个APK。
- 库插件,插件id为com.android.library,会生成一个AAR,提供给其他应用程序模块用。
- 测试插件,插件id为com.android.test,用于测试其他的模块。
- feature插件,插件id为com.android.feature,创建Android Instant App时需要用到的插件。
- Instant App插件,插件id为com.android.instantapp,是Android Instant App的入口。
2.2. Android块
Android块用于描述该Module构建过程中所用到的所有参数。
compileSdkVersion:配置编译该模块的SDK版本buildToolsVersion:Android构建工具的版本
2.2.1. defaultConfig块
Android块中的defaultConfig块用于默认配置,常用的配置如下所示。
| 属性 | 描述 |
|---|---|
| applicationId | 指定App的包名 |
| minSdkVersion | App最低支持的sdk版本 |
| targetSdkVersion | 基于哪个sdk版本开发 |
| versionCode | app内部的版本号,用于控制app升级 |
| versionName | app版本名称,也即是发布的版本号 |
| testApplicationId | 配置测试app的包名 |
| testInstrumentationRunner | 配置单元测试用的Runner,默认为android.test.InstrumentationTestRunner |
| proguardFile | ProguardFile混淆所使用的配置文件 |
| proguardFiles | 同时配置多个ProguardFile文件 |
| signingConfig | 配置默认的签名信息 |
2.2.2. buildTypes块
buildTypes块用于配置构建不同类型的APK。 当我们新建一个项目时,在Android块已经默认配置了 buildTypes块:
...
android{
...
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
...
}
在AS的Terminal中执行gradlew.bat build命令,会在该模块的build/outputs/apk目录中生成release和debug的APK,虽然只配置了release ,但release和debug是默认配置,即使我们不配置也会生成。也可以修改默认的release和debug,甚至可以自定义构建类型,比如:
...
android{
...
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
}
privitedebug{
applicationIdSuffix ""
}
}
...
}
这时会在build/outputs/apk目录中生成release、debug、privitedebug的APK。
buildTypes块还可以配置很多属性,常用的配置如下所示。
| 属性 | 描述 |
|---|---|
| applicationIdSuffix | 配置applicationId的后缀 |
| debuggable | 表示是否支持断点调试 |
| jniDebuggable | 表示是否可以调试NDK代码 |
| buildConfigField | 配置不同的开发环境,比如测试环境和正式环境 |
| shrinkResources | 是否自动清理未使用的资源,默认值为false |
| zipAlignEnabled | 是否开启开启zipalign优化,提高apk运行效率 |
| proguardFile | ProGuard混淆所使用的ProGuard配置文件 |
| proguardFiles | 同事配置多个ProGuard配置文件 |
| signingConfig | 配置默认的签名信息 |
| multiDexEnabled | 是否启用自动拆分多个Dex的功能 |
2.2.3. signingConfigs块
用于配置签名设置,一般用来配置release模式。
| 属性 | 描述 |
|---|---|
| storeFile | 签名证书文件 |
| storePassword | 签名证书文件的密码 |
| storeType | 签名证书的类型 |
| keyAlias | 签名证书中密钥别名 |
| keyPassword | 签名证书中密钥的密码 |
signingConfigs {
release {
storeFile file('../signfiles/keystore.jks')
storePassword 'android'
keyAlias 'androidreleasekey'
keyPassword 'android'
}
}
2.2.4. 其他配置块
android块中除了前面讲的defaultConfig块、buildTypes块、signingConfigs块还有其他的配置块,这里列举一些:
| 块 | 描述 |
|---|---|
| sourceSets | 配置目录指向 |
| productFlavors | 多个渠道配置 |
| lintOptions | Lint配置 |
| dexOptions | DEX工具配置 |
| adbOptions | adb配置 |
| packagingOptions | 打包时的相关配置 |
更多的配置块请参考官方文档。
2.3. dependencies块
dependencies 块用于配置该module构建过程中所依赖的所有库。Gradle插件3.4版本新增了 api 和 implementation 来代替 compile 配置依赖,其中 api 和此前的 compile是一样的。dependencies和api主要以下的区别:
implementation:可以让module在编译时隐藏自己使用的依赖,但是在运行时这个依赖对所有模块是可见的。而api与compile一样,无法隐藏自己使用的依赖。如果使用api,一个module发生变化,这条依赖链上所有的module都需要重新编译,而使用implemention,只有直接依赖这个module需要重新编译。