几个月前,我使用Android Studio开发了一个Android项目。我使用不同的产品风格创建了两个不同版本的应用程序:
在应用Gradle文件中创建/配置的风格。在这个项目没有工作几个月后,我现在开始研究新版本。将Android Studio更新到最新版本(3.0.1,之前为2.x)并打开项目后,我只能构建并运行 MyAppFree 版本,其中包含 MyApp 功能......
似乎某种程度上Gradle的任务和配置都搞砸了。我该如何解决这个问题并创建干净正确的任务?
Project Gradle
buildscript {
repositories {
jcenter()
maven {
url 'https://maven.google.com/'
name 'Google'
}
}
dependencies {
classpath 'com.android.tools.build:gradle:3.0.1'
}
}
allprojects {
repositories {
jcenter()
maven {
url 'https://maven.google.com/'
name 'Google'
}
}
}
App Gradle
apply plugin: 'com.android.application'
android {
compileSdkVersion 26
defaultConfig {
applicationId "com.example.MyApp"
minSdkVersion 14
targetSdkVersion 26
versionCode 42
versionName "2.0.1"
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
flavorDimensions "freemium", "free"
productFlavors {
MyApp {
dimension "freemium"
}
MyAppFree {
dimension "free"
applicationId 'com.example.MyApp.Free'
}
}
}
Android Studio中的 Gradle项目窗口列出了许多我未手动配置的Gradle任务。至少我不记得做过这个......
MyApp 风格以及 MyAppFree 风格的任务。有线的是,还有 MyAppMyAppFree 任务:
app
Tasks
build
assembleMyApp
assembleMyAppFree
assembleMyAppMyAppFree /* what is this MyAppMyAppFreeStuff? */
compileMyAppMyAppFreeDebugAndroidTestSources
compileMyAppMyAppFreeDebugSources
...
Run Configurations
Projekt:app [assembleMyAppFree]
/* Why is this set to MyAppFree instead of MyApp? How to change? */
...
由于我几个月没有参与该项目,我不记得我是如何设置两种口味和Gradle任务的。是自动创建任务还是手动完成?
答案 0 :(得分:2)
Gradle遵循名为约定优于配置的模式。您不需要自己配置每个任务,而是可以声明性地描述您想要的内容,Gradle(分别是插件)将设置任务。
此模式的另一个示例是Gradle maven-publish
plugin。您只需配置项目的发布和目标存储库即可。插件......
- 建立规则,为添加的每个MavenPublication自动创建GenerateMavenPom任务(请参阅“出版物”一节)。
- 建立一个规则,为添加的每个MavenPublication(参见“Publications”部分)的组合自动创建PublishToMavenRepository任务,并添加每个MavenArtifactRepository(请参阅“存储库”一节)。
- 建立一个规则,为每个添加的MavenPublication自动创建PublishToMavenLocal任务(参见“出版物”部分)。
所有Publish[...]
任务都将捆绑在publish
生命周期任务下。
您无需了解每个单一任务的重要性,因为插件可能会创建中间任务和捆绑任务,这些任务只会从内部插件逻辑中获得重要性。
此外,许多插件只是记录了他们的配置DSL的重要性(例如android
闭包中的所有内容),而不是每个任务(类型)。要简单地使用Gradle及其插件,它足以修改DSL并坚持生命周期任务(例如build
,publish
,...)。