Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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
Gradle使用DexForDeBug在TransformClasses上缓慢构建_Gradle_Android Build - Fatal编程技术网

Gradle使用DexForDeBug在TransformClasses上缓慢构建

Gradle使用DexForDeBug在TransformClasses上缓慢构建,gradle,android-build,Gradle,Android Build,构建我的Android应用程序大约需要90秒(“快速”),每次更新代码最多需要3分钟。这完全是浪费时间,因为这是真的,我认为解决方案一定是唾手可得的。我试着调查这个问题,发现了不同的博客帖子,并给出了答案和建议,其中大部分我都试过了 我有org.gradle.deamon=true的gradle.properties文件 我使用Gradle Prefence在Android Studio上运行离线工作(改进了,但仍然很慢) 我在命令行上运行(速度更快,但仍然很慢) 在build.gradle的

构建我的Android应用程序大约需要90秒(“快速”),每次更新代码最多需要3分钟。这完全是浪费时间,因为这是真的,我认为解决方案一定是唾手可得的。我试着调查这个问题,发现了不同的博客帖子,并给出了答案和建议,其中大部分我都试过了

  • 我有org.gradle.deamon=true的gradle.properties文件
  • 我使用Gradle Prefence在Android Studio上运行离线工作(改进了,但仍然很慢)
  • 我在命令行上运行(速度更快,但仍然很慢)
  • 在build.gradle的defaultConfig中,我将multiDexEnabled设置为false
  • 在build.gradle的dexOptions中,我将preDexLibraries设置为false
  • 在gradle-wrapper.properties中,我获取了一个最新的gradle版本(2.8)(速度的显著变化发生在2.4上)
这个过程似乎需要很长时间,大约85%的总构建时间是:app:transformClassesWithDexForDebug

这个过程实际上在做什么?我可以找到在它上面崩溃的人,但是它对我来说很好,除了它需要很多时间。既然我现在不需要Dex,我需要它吗

另外,我有13个依赖项和3个testCompile依赖项。我已经指出了具体的播放包,所以我不会编译我不需要的东西。如果我理解正确,gradle也在构建每个项目构建的所有库。如果这是正确的,有没有办法跳过这一步?我是否可以自己将它们构建为封装库并包含它们,而不需要每次都对它们进行处理?这可能会使我在将来更改依赖项时失去一些灵活性,但在这一点上,我觉得我每天都在轻松地等待gradle一个多小时。我不确定灵活性对我来说是否值得这么多


我期待着得到任何关于如何改进构建过程的建议。提前感谢。

这似乎是Android Studio 2.0预览版中引入的新即时运行机制的一部分,它负责为应用程序中的每个方法插入指令,为将来的代码补丁创建执行分支。恐怕这就是它非常慢的原因


奇怪的是,即使禁用了Instant Run,此任务仍在执行。我不得不将“com.android.tools.build:gradle”降级到1.3.0以避免这项任务。

我也面临同样的问题,我花了大约10个小时才最终解决,所以我知道你的感受

我在谷歌上搜索了很多,我做了和你一样的配置工作,即使有一点帮助,编译和运行实际的应用程序仍然是一件痛苦的事情(有时当我更改一行代码时需要2-3分钟,但当我做更多的工作时,通常需要8分钟,而我的计算机在这段时间内完全冻结)

但谈够了,让我们来解决这个问题。“app:transformClassesWithDexForDebug”解决了Dalvik(5.0之前,api 21)操作系统版本的一些依赖性,这很重要,需要花费大量时间。开发时您不需要它,因为您可以在>=21上测试您的应用程序,所以为开发和发布创建单独的产品风格。这是我的gradle版本,它利用了它:

apply plugin: 'com.android.application'

final VERSION_MAJOR = 0
final VERSION_MINOR = 0
final VERSION_PATCH = 0
final VERSION_BUILD = 1

android {
    compileSdkVersion 23
    buildToolsVersion "23.0.1"

    defaultConfig {
        applicationId "com.app"
        minSdkVersion 15
        targetSdkVersion 23
        multiDexEnabled true
        versionName "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_PATCH}.${VERSION_BUILD}"
        versionCode VERSION_MAJOR * 10000000 + VERSION_MINOR * 100000 + VERSION_PATCH * 1000 + VERSION_BUILD
    }

    dexOptions {
        incremental = true;
        preDexLibraries = false
        javaMaxHeapSize "2g"
    }


    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    productFlavors {
        dev {
            minSdkVersion 21
            applicationId = "com.app.test"
        }
        prod {
            minSdkVersion 15
            applicationId = "com.app" // you don't need it, but can be useful

        }
    }

    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_7
        targetCompatibility JavaVersion.VERSION_1_7
    }
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES.txt'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/dependencies.txt'
        exclude 'META-INF/LGPL2.1'
        exclude 'META-INF/ASL2.0'
    }
    lintOptions {
        checkReleaseBuilds false
        abortOnError true
    }

}

afterEvaluate {
    tasks.matching {
        it.name.startsWith('dex')
    }.each { dx ->
        if (dx.additionalParameters == null) {
            dx.additionalParameters = ['--multi-dex']
        } else {
            dx.additionalParameters += '--multi-dex'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
   ... 
}
下一件事是要确保你真的用这个来构建你的应用程序。单击视图->工具窗口->构建工具,并确保已将构建变量设置为“devDebug”


对一些人来说,这可能就足够了。我在SO和reddit上发现了很多线索,都以这款产品的味道结尾,但实际上这对我一点帮助都没有。帮助我的是手动升级gradle。既然您已经尝试过了,我认为您的做法是正确的,但我建议您使用更新的gradle 2.9版,它的“”超过了2.8。

编辑:此时,我建议您在安装1.5的同时运行Android Studio 2.x。您可以访问instant run,它与所有更新的工具一样非常有用。如果你坚持1.5,请继续阅读

我已经设法将Android Studio 1.5调试版本的速度从2分钟提高到30秒。这可能不适用于您的命令行执行,但可能会更快

使用此配置,您的第一个IDE构建所需的时间与相同,但增量构建速度更快,即使您修改了类。如果修改附加的库,则会损失一些收益

第1步。(如果您有幸已经将>=21的Minsdk版本作为目标,请跳过此项。)

@vanomart关于minSdkVersion调试风格>=21的回答没有错,但唯一需要做的是将以下内容添加到模块(应用程序)build.gradle中,并确保在“构建变体”选项卡中调试时以开发为目标:

android {
    [...]
    productFlavors {
        dev {
            minSdkVersion 21 //The important bit.
        }
        prod {
            minSdkVersion 15 //Example. Set to your real requirement.
        }
    }
第2步。预编制索引LIB

在您的模块(应用程序)build.gradle中设置以下配置。这对于IDE构建更快,对于每个构建都从头开始的构建器服务器来说则不然

android {
    [...]
    dexOptions {
        preDexLibraries true
        javaMaxHeapSize "2g" // Use gig increments depending on needs
    }
来源,与“提高构建服务器性能”相反(部分):

第3步。确保您使用的是模块(应用程序)build.gradle中最新的buildToolsVersion

android {
    buildToolsVersion "23.0.2"
    [...]
“…将所有模块中的生成工具版本更新为最新版本 (23.0.2)。[…]它将使用新的更快版本的dex,这有助于 即时运行和完整构建都要快一点。”

资料来源:

步骤4。使用最新的Gradle构建工具

在您的项目build.gradle中,设置为最新版本(当前为2.0.0-alpha6)

更新列表:

第5步。使用最新的Gradle包装。修改gradle wrapper.properties,将此行更新为使用2.10:

distributionUrl=https\://downloads.gradle.org/distributions/gradle-2.10-all.zip
#Alternative url if the above does not work:
#distributionUrl=https://services.gradle.org/distributions/gradle-2.10-all.zip
在Android Studio首选项中,确保选择了“使用默认渐变包装器”。我建议重新启动Android Studio,以确保Gradle守护进程重新启动

“在许多情况下,Gradle 2.9是mu
distributionUrl=https\://downloads.gradle.org/distributions/gradle-2.10-all.zip
#Alternative url if the above does not work:
#distributionUrl=https://services.gradle.org/distributions/gradle-2.10-all.zip
classpath 'com.android.tools.build:gradle:2.1.0'
org.gradle.jvmargs = -Xmx2048m