Android-Gradle-当两种口味共享相同的依赖关系时,如何强制Gradle只构建特定的配置
我们开发了一个Android库,它有两种风格,分别称为“armv7”和“x86”,每种风格都依赖于特定于平台的本机(NDK)库,它们是单独捆绑的 我们还有一个测试Android应用程序,它使用前面提到的库项目作为依赖项,也构建为两种不同的风格。此应用程序还依赖于Android兼容性库(appcompat) 问题是,当我尝试只构建一种风格的应用程序时,它仍然构建两种风格的库(参见下面的示例),这使得Android studio中的编译非常长(我们的NDK阶段相当长),并阻止我们在Jenkins中的部署工作中分离这些风格的构建 为了演示这个问题,我创建了一个演示项目,您可以在这里看到: 基本上,您拥有的是android应用程序和android库的框架,它们都有两种风格:armv7和x86,并且应用程序也依赖于appcompat App build.graldeAndroid-Gradle-当两种口味共享相同的依赖关系时,如何强制Gradle只构建特定的配置,android,gradle,android-gradle-plugin,Android,Gradle,Android Gradle Plugin,我们开发了一个Android库,它有两种风格,分别称为“armv7”和“x86”,每种风格都依赖于特定于平台的本机(NDK)库,它们是单独捆绑的 我们还有一个测试Android应用程序,它使用前面提到的库项目作为依赖项,也构建为两种不同的风格。此应用程序还依赖于Android兼容性库(appcompat) 问题是,当我尝试只构建一种风格的应用程序时,它仍然构建两种风格的库(参见下面的示例),这使得Android studio中的编译非常长(我们的NDK阶段相当长),并阻止我们在Jenkins中的
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.test.test1"
minSdkVersion 19
targetSdkVersion 25
versionCode 1
versionName "1.0"
}
buildTypes {
debug {}
release {}
}
productFlavors {
armv7 {}
x86 {}
}
}
dependencies {
armv7Compile 'com.android.support:appcompat-v7:20.0.0'
armv7Compile project(path: ':lib', configuration: 'armv7Debug')
x86Compile 'com.android.support:appcompat-v7:20.0.0'
x86Compile project(path: ':lib', configuration: 'x86Debug')
}
apply plugin: 'com.android.library'
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
minSdkVersion 19
targetSdkVersion 25
versionCode 1
versionName "1.0"
defaultPublishConfig "debug"
publishNonDefault true
}
buildTypes {
debug {}
release {}
}
productFlavors {
armv7 {}
x86 {}
}
}
库构建。渐变
apply plugin: 'com.android.application'
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
applicationId "com.test.test1"
minSdkVersion 19
targetSdkVersion 25
versionCode 1
versionName "1.0"
}
buildTypes {
debug {}
release {}
}
productFlavors {
armv7 {}
x86 {}
}
}
dependencies {
armv7Compile 'com.android.support:appcompat-v7:20.0.0'
armv7Compile project(path: ':lib', configuration: 'armv7Debug')
x86Compile 'com.android.support:appcompat-v7:20.0.0'
x86Compile project(path: ':lib', configuration: 'x86Debug')
}
apply plugin: 'com.android.library'
android {
compileSdkVersion 25
buildToolsVersion "25.0.0"
defaultConfig {
minSdkVersion 19
targetSdkVersion 25
versionCode 1
versionName "1.0"
defaultPublishConfig "debug"
publishNonDefault true
}
buildTypes {
debug {}
release {}
}
productFlavors {
armv7 {}
x86 {}
}
}
当我运行此命令时(注意,我以干运行方式运行它,但您可以跳过-m标志):
这是我得到的输出(请注意名称中包含X86的lib任务):
为了清楚地了解是谁添加了x86风格任务的依赖项,我使用以下命令生成了一个点文件,并将其渲染为PNG:
$ dot -T png build/reports/visteg.dot -o visteg.dot.png
这就是我得到的:
如果仔细观察,您会发现有效触发所有其他X86构建任务的任务“:lib:bundleX86Debug”是“:app:prepeareComAndroidSupportAppcompatV72000Library”任务的依赖项
但不了解这两个不相关的依赖项之间的联系(因为库不依赖于Appcompat)
我试图改变的事情,但这并不重要:
- Gradle android插件版本+Gradle版本
- 构建工具版本
- Android SDK目标/编译/最低设置
- 使用除Appcompat依赖项以外的其他maven库依赖项
armv7Compile 'com.android.support:appcompat-v7:20.0.0'
armv7Compile project(path: ':lib', configuration: 'armv7Debug')
x86Compile 'com.android.support:appcompat-v7:21.0.0'
x86Compile project(path: ':lib', configuration: 'x86Debug')
当我这样做时,这是以前的同一个gradle命令的输出:
:app:preBuild SKIPPED
:app:preArmv7DebugBuild SKIPPED
:app:checkArmv7DebugManifest SKIPPED
:app:preArmv7ReleaseBuild SKIPPED
:lib:preBuild SKIPPED
:lib:preArmv7DebugBuild SKIPPED
:lib:checkArmv7DebugManifest SKIPPED
:lib:prepareArmv7DebugDependencies SKIPPED
:lib:compileArmv7DebugAidl SKIPPED
:lib:compileArmv7DebugNdk SKIPPED
:lib:compileLint SKIPPED
:lib:copyArmv7DebugLint SKIPPED
:lib:mergeArmv7DebugShaders SKIPPED
:lib:compileArmv7DebugShaders SKIPPED
:lib:generateArmv7DebugAssets SKIPPED
:lib:mergeArmv7DebugAssets SKIPPED
:lib:mergeArmv7DebugProguardFiles SKIPPED
:lib:packageArmv7DebugRenderscript SKIPPED
:lib:compileArmv7DebugRenderscript SKIPPED
:lib:generateArmv7DebugResValues SKIPPED
:lib:generateArmv7DebugResources SKIPPED
:lib:packageArmv7DebugResources SKIPPED
:lib:processArmv7DebugManifest SKIPPED
:lib:generateArmv7DebugBuildConfig SKIPPED
:lib:processArmv7DebugResources SKIPPED
:lib:generateArmv7DebugSources SKIPPED
:lib:incrementalArmv7DebugJavaCompilationSafeguard SKIPPED
:lib:compileArmv7DebugJavaWithJavac SKIPPED
:lib:processArmv7DebugJavaRes SKIPPED
:lib:transformResourcesWithMergeJavaResForArmv7Debug SKIPPED
:lib:transformClassesAndResourcesWithSyncLibJarsForArmv7Debug SKIPPED
:lib:mergeArmv7DebugJniLibFolders SKIPPED
:lib:transformNative_libsWithMergeJniLibsForArmv7Debug SKIPPED
:lib:transformNative_libsWithSyncJniLibsForArmv7Debug SKIPPED
:lib:bundleArmv7Debug SKIPPED
:app:prepareComAndroidSupportAppcompatV72000Library SKIPPED
:app:prepareComAndroidSupportSupportV42000Library SKIPPED
:app:prepareGradlebugLibUnspecifiedArmv7DebugLibrary SKIPPED
:app:prepareArmv7DebugDependencies SKIPPED
:app:compileArmv7DebugAidl SKIPPED
:app:compileArmv7DebugRenderscript SKIPPED
:app:generateArmv7DebugBuildConfig SKIPPED
:app:generateArmv7DebugResValues SKIPPED
:app:generateArmv7DebugResources SKIPPED
:app:mergeArmv7DebugResources SKIPPED
:app:processArmv7DebugManifest SKIPPED
:app:processArmv7DebugResources SKIPPED
:app:generateArmv7DebugSources SKIPPED
:app:incrementalArmv7DebugJavaCompilationSafeguard SKIPPED
:app:compileArmv7DebugJavaWithJavac SKIPPED
:app:compileArmv7DebugNdk SKIPPED
:app:compileArmv7DebugSources SKIPPED
:app:mergeArmv7DebugShaders SKIPPED
:app:compileArmv7DebugShaders SKIPPED
:app:generateArmv7DebugAssets SKIPPED
:app:mergeArmv7DebugAssets SKIPPED
:app:transformClassesWithDexForArmv7Debug SKIPPED
:app:mergeArmv7DebugJniLibFolders SKIPPED
:app:transformNative_libsWithMergeJniLibsForArmv7Debug SKIPPED
:app:processArmv7DebugJavaRes SKIPPED
:app:transformResourcesWithMergeJavaResForArmv7Debug SKIPPED
:app:validateSigningArmv7Debug SKIPPED
:app:packageArmv7Debug SKIPPED
:app:assembleArmv7Debug SKIPPED
:lib:compileArmv7DebugSources SKIPPED
:lib:assembleArmv7Debug SKIPPED
BUILD SUCCESSFUL
Total time: 1.199 secs
而且依赖关系图更简单,无需任何X86构建任务:
所以我的直觉是Gradle为每个依赖项准备任务,但是当它看到两种不同风格的依赖项(库和版本)相同时,它会有效地合并任务,从而运行两种风格
我找不到任何关于这个或已经存在的错误通知单的文档,在打开错误通知单之前的一个步骤,我想读到这篇文章的人可能会知道如何覆盖这个行为,或者会指出我的配置有什么问题
谢谢