面试题答案
一键面试自定义构建任务
- 创建自定义任务类:
在Kotlin项目的
src/main/kotlin
目录下创建一个自定义任务类,例如CustomTask.kt
。假设我们要创建一个简单的任务,在构建前清理一些临时文件。
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.TaskAction
open class CleanTempFilesTask : DefaultTask() {
@TaskAction
fun clean() {
// 清理临时文件逻辑,例如删除指定目录下的文件
val tempDir = project.file("path/to/temp/dir")
if (tempDir.exists()) {
tempDir.deleteRecursively()
}
}
}
- 在
build.gradle.kts
中注册任务:
tasks.register("cleanTempFiles", CleanTempFilesTask::class) {
// 可以在这里配置任务的依赖等属性
dependsOn("preBuild") // 例如依赖preBuild任务
}
配置不同环境的差异化构建
- 使用
buildTypes
和productFlavors
:buildTypes
:用于区分不同构建类型,如debug
、release
。在build.gradle.kts
中配置:
android {
buildTypes {
getByName("debug") {
// 开发环境相关配置,例如不混淆代码
isMinifyEnabled = false
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
}
getByName("release") {
// 生产环境相关配置,开启混淆和资源压缩
isMinifyEnabled = true
proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
// 配置资源优化
androidResources {
isMinifyEnabled = true
isUseNewApkCreator = true
}
}
}
}
- **`productFlavors`**:可以用来区分不同环境,比如`dev`、`test`、`prod`。
android {
productFlavors {
create("dev") {
applicationIdSuffix = ".dev"
// 开发环境特定的配置,例如使用开发服务器地址
resValue("string", "server_url", "http://dev.example.com")
}
create("test") {
applicationIdSuffix = ".test"
// 测试环境特定的配置,例如使用测试服务器地址
resValue("string", "server_url", "http://test.example.com")
}
create("prod") {
applicationIdSuffix = ".prod"
// 生产环境特定的配置,例如使用正式服务器地址
resValue("string", "server_url", "http://prod.example.com")
}
}
}
- 动态配置依赖:根据不同环境配置不同的依赖。
dependencies {
val devImplementation by configurations
val testImplementation by configurations
val prodImplementation by configurations
devImplementation("com.example:dev-library:1.0.0")
testImplementation("com.example:test-library:1.0.0")
prodImplementation("com.example:prod-library:1.0.0")
}
利用Gradle的并行构建和缓存机制提升构建效率
- 并行构建:
在项目根目录的
gradle.properties
文件中设置:
org.gradle.parallel=true
这样Gradle会并行执行项目中的任务,加快构建速度。
2. 缓存机制:
- 开启Gradle构建缓存:在gradle.properties
文件中添加:
org.gradle.caching=true
- **配置缓存位置**:可以自定义缓存位置,在`gradle.properties`文件中添加:
org.gradle.buildCache.directory=path/to/custom/cache/dir
- **缓存策略**:Gradle默认会缓存任务输出,如果任务输入(如源代码、依赖等)没有变化,就会直接使用缓存结果。可以通过配置`@CacheableTask`注解等方式来控制任务的缓存行为。例如,如果自定义任务满足缓存条件,可以在任务类上添加该注解:
import org.gradle.api.DefaultTask
import org.gradle.api.tasks.CacheableTask
import org.gradle.api.tasks.TaskAction
@CacheableTask
open class MyCacheableTask : DefaultTask() {
@TaskAction
fun executeTask() {
// 任务逻辑
}
}