Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/192.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android-Gradle-当两种口味共享相同的依赖关系时,如何强制Gradle只构建特定的配置_Android_Gradle_Android Gradle Plugin - Fatal编程技术网

Android-Gradle-当两种口味共享相同的依赖关系时,如何强制Gradle只构建特定的配置

Android-Gradle-当两种口味共享相同的依赖关系时,如何强制Gradle只构建特定的配置,android,gradle,android-gradle-plugin,Android,Gradle,Android Gradle Plugin,我们开发了一个Android库,它有两种风格,分别称为“armv7”和“x86”,每种风格都依赖于特定于平台的本机(NDK)库,它们是单独捆绑的 我们还有一个测试Android应用程序,它使用前面提到的库项目作为依赖项,也构建为两种不同的风格。此应用程序还依赖于Android兼容性库(appcompat) 问题是,当我尝试只构建一种风格的应用程序时,它仍然构建两种风格的库(参见下面的示例),这使得Android studio中的编译非常长(我们的NDK阶段相当长),并阻止我们在Jenkins中的

我们开发了一个Android库,它有两种风格,分别称为“armv7”和“x86”,每种风格都依赖于特定于平台的本机(NDK)库,它们是单独捆绑的

我们还有一个测试Android应用程序,它使用前面提到的库项目作为依赖项,也构建为两种不同的风格。此应用程序还依赖于Android兼容性库(appcompat)

问题是,当我尝试只构建一种风格的应用程序时,它仍然构建两种风格的库(参见下面的示例),这使得Android studio中的编译非常长(我们的NDK阶段相当长),并阻止我们在Jenkins中的部署工作中分离这些风格的构建

为了演示这个问题,我创建了一个演示项目,您可以在这里看到:

基本上,您拥有的是android应用程序和android库的框架,它们都有两种风格:armv7和x86,并且应用程序也依赖于appcompat

App build.gralde

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库依赖项
唯一起作用的是,我为appcompat使用了两个不同的版本。例如:

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为每个依赖项准备任务,但是当它看到两种不同风格的依赖项(库和版本)相同时,它会有效地合并任务,从而运行两种风格

我找不到任何关于这个或已经存在的错误通知单的文档,在打开错误通知单之前的一个步骤,我想读到这篇文章的人可能会知道如何覆盖这个行为,或者会指出我的配置有什么问题

谢谢