Chapter2:Android下Gradle的基本自定义构建
Chapter2:Gradle基本自定义构建
2.1 Gradle文件结构
settings.gradle:该文件在初始化阶段被执行,定义了哪些模块应该包含在构件内。对于只包含一个Android应用的新项目,文件内容为 include ‘:app’。单模块项目并不需要该文件,多模块项目必须定义该文件。
顶层build.gradle:
//实际构建代码块 buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:3.4.2' } } allprojects { repositories { jcenter() } }
- repositories代码块:将jcenter配置成一个仓库。
- dependencies代码块:配置构建过程中的依赖包(不能讲应用或依赖项目所需的依赖包包含在顶层构建文件中)。默认之定义了一个依赖包:Gradle的Android插件(每个Android模块都需要有Android插件)。
- allprojects代码块:声明需要被用于所有模块的属性。(甚至可以创建任务,该任务会被运用到所有模块;使用了allprojects会使模块耦合到项目,导致没有主项目构建稳健情况下,无法独立建构模块,会影响分类内部依赖库的操作。)
模块层build.gradle:
//代码节选 apply plugin: 'com.android.application' android { compileSdkVersion 28 buildToolsVersion '28.0.3' defaultConfig { applicationId "com.virtual.learn191024" minSdkVersion 24 targetSdkVersion 28 versionCode 1 versionName "1.0" } } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'androidx.appcompat:appcompat:1.1.0' }
模块层build.gradle文件的属性只能应用在该模块,可以覆盖顶层build.gradle文件定义的属性。
apply plugin:使用Android应用插件。(使用该插件后便可以使用android代码块中的特有配置。)
android代码块:包含Android特有配置,必须配置的属性有:
- compileSdkVersion :编译应用的 Android API 版本。
- buildToolsVersion :构建工具和编译器使用的版本号。
defaultConfig代码块:配置应用的核心属性。可以覆盖AndroidManifest.xml文件中对应的条目。
- applicationId:Google Play 唯一标识。
- minSdkVersion:运行应用最小API级别。
- targetSdkVersion:通知系统已在特定Android版本通过测试,不必启动向前兼容的行为。
- versionCode:版本号
- versionName:友好的版本名称
dependencies代码块:依赖代码块。
2.2 任务入门
命令 $ gradle tasks:打印出所有可用的任务。
命令 $ gradle tasks --all:打印出所有可用的任务,并显示它们之间的依赖。
补充参数:-m或**–dry-run** 试运行。
Gradle的Android插件使用了Java基础插件;Java基础插件使用了基础插件。基础插件添加了任务的标准生命周期和一些共同约定的属性。基础插件定义了assemnle和clean任务;Java插件定义了check和buildtasks。在基础插件中,任务不被实现和执行操作,而是被用来定义插件之间的约定。
- assemble:集合项目的输出。
- clean:清理项目的输出。
- check:运行所有的检查,通常是单元测试和集成测试。
- build:同时运行assemble和check。
Android任务:Android插件扩展了基本任务,并实现了它们的行为。
- assemble:为每个构建版本创建一个APK。
- clean:删除所有的构建内容,比如APK文件。
- check:运行Lint检查,Lint发现问题后终止构建。
- build:同时运行assemble和check。
assemble任务依赖于assembleDebug和assembleRelease(也可能包含更多构件类型),assemble将处罚所有依赖的构件类型进行构建操作。
Android插件一些新的任务:
- connectedCheck:在连接设备或模拟器上运行测试。
- deviceCheck:一个占位任务,为其他插件在远端设备上运行测试。
- installDebug和installRelease:在连接的设备或模拟器上安装特定版本。
- 所有的installtasks都会有相关的uninstall任务。
构建任务依赖于check而非connectedCheck或deviceCheck。
运行check任务会生成一份Lint报告,Lint报告会包含所有的警告和错误,以及一份详细的说明和一个相关文档的连接。存储在**app/build/reports/**文件夹下。
2.3 自定义构建
补充一些通过构建配置的属性:
- testApplicationId:针对instrument测试APK的applicationId。
- testInstrumentationRunner:JUnit测试运行器的名称,被用来运行测试。
- signingConfig
- proguardFile/proguardFiles
BuildConfig和资源:
Gradle可以通过 buildConfigField 扩展 BuildConfig生成类,通过 resValue 扩展资源文件。可以在Debug和Release使用不同的值。
//代码节选 debug{ buildConfigField("boolean","mBollean","true") resValue("string","mString","test1") } release { buildConfigField("boolean","mBollean","false") resValue("string","mString","test2") }
项目范围的设置:
若所有模块都是Android app项目时,可以将一些通用配置加到顶层build.gradle的allprojects代码块中:
allprojects{ apply plugin: 'com.android.application' android{ compileSdkVersion 28 buildToolsVersion '28.0.3' } }
Gradle允许在 Projet 对象上添加额外属性。通过ext代码块实现:
//顶层build.gradle 最下面添加(注意有个等号) ext { compileSdkVersion = 28 buildToolsVersion = '28.0.3' }
在模块层构建文件可以使用rootProject来获取属性:
//代码节选 (注意没有等号) apply plugin: 'com.android.application' android { compileSdkVersion rootProject.ext.compileSdkVersion buildToolsVersion rootProject.ext.buildToolsVersion ···
项目属性:(三种常用定义方法)
1.ext 代码块:
ext { info = "abc" }
2.gradle.properties 文件:
info = abc
3.-P命令行参数:
首先创建一个任务:
//任务的名字叫printProperties。 //project.hasProperty("info")会返回boolean值,代表是否有info属性。 //如果有就打印出info属性的值。 task printProperties { if(project.hasProperty("info")){ println(info) } }
执行命令:(gradle + 任务名+参数)
//-P为设置参数,后面紧随参数名,通过'='号赋参数值。 $ gradle printProperties -Pinfo="Hello"
结果:
默认任务:
在顶层build.gradle中添加:
defaultTasks("clean","assembleDebug")
使用命令查看:
//Windows $ gradle task | findstr "Default tasks"
//Mac or Linux $ gradlew task | grep "Default tasks"
2.4 加快Gradle 编译速度
Windos系统下增大Gradle的JVM内存分配。在 C:\Users\用户名\.gradle\ 目录下新建gradle.properties文件。文件内容:
org.gradle.daemon=true org.gradle.jvmargs=-Xmx4096m -XX:MaxPermSize=1024m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8 org.gradle.parallel=true org.gradle.configureondemand=true
2.5 参考资料
- Gradle For Android