it-swarm.com.ru

Слишком низкая скорость сборки Android (разрешение зависимостей)

Я работаю с Android Studio (моя текущая версия 1.5) в течение 2 лет. Все было хорошо, но когда я скачал Canary (2.1 p5), все пошло не так. Каждый раз, когда я хочу создать новый проект, открыть проект, синхронизировать или импортировать новую библиотеку или зависимость, сборка занимает слишком много времени - почти 20 минут .

Я ничего не делал, я просто скачал Canary-версию и запустил ее.

Симптомы:

  1. Это случилось когда я подключился к интернету
  2. Первая задержка на Gradle: Разрешить зависимости ': app: _debugCompile'
  3. ...
  4. Через 25 минут строительство почти завершено

Примечание : Когда я отключаю Интернет, gradle завершится как можно быстрее


Я пытался исправить это следующими способами :

  1. Я изменил Gradle на автономную работу (это работало, но я не хочу таким образом, потому что я хочу импортировать библиотеки или зависимости)
  2. Я создал новый файл (имя файла gradle.properties) в C:\Users\username\.gradle, а затем записал эти строки в него

    org.gradle.parallel=true
    org.gradle.daemon=true
    
  3. Я удалил эту версию, затем установил мою старую версию, которая работала нормально, но проблема все еще была :( 

  4. Отключить/включить брандмауэр

  5. Отключить/включить антивирус (Nod32)

  6. Переустановите ОС Windows (8.1)

  7. Я скачал все версии (1.0.0, ..., 1.5.1, 2.0.0, 2.1)

  8. Я использовал прокси


Системная информация :

  • Процессор: Intel Core i5
  • RAM: 6,00 ГБ
  • ОС: Windows 8.1 64 бит

build.gradle (Проект: appName)

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        jcenter()
    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:1.5.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        jcenter()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

gradle.build (Модуль: приложение)

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 23
    buildToolsVersion "23.0.3"

    defaultConfig {
        applicationId "com.example.test.myapplication"
        minSdkVersion 14
        targetSdkVersion 23
        versionCode 1
        versionName "1.0"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    compile 'com.Android.support:appcompat-v7:23.3.0'
}

Gradle отчет после строительства

Dependencies                  Duration
All dependencies              14m3.43s
:app:_releaseCompile          3m30.96s
:app:_debugCompile            3m30.73s
:app:_debugApk                3m30.69s
:app:_releaseApk              3m30.62s
:classpath                    0.428s
:app:_debugAndroidTestCompile 0.001s
:app:_debugAndroidTestApk     0s
:app:_debugUnitTestApk        0s
:app:_debugUnitTestCompile    0s
:app:_releaseUnitTestApk      0s
:app:_releaseUnitTestCompile  0s
:app:releaseWearApp           0s
:app:wearApp                  0s

После установки Android Studio 2.0 стабильная версия

  • 7:23:47 PM Начата синхронизация Gradle ====> 8:13:21 PM Синхронизация Gradle завершена
53
Mehdi Jahed Manesh

Проблема решена !

После 2 дней поиска я нашел решение, поэтому я хотел бы поделиться со всеми людьми, которые могут иметь ту же проблему. Проблема в том, что gradle не может подключиться к центральному хранилищу в какой-либо стране. Когда вы создаете новый проект или импортируете, ваш центральный репозиторий по умолчанию jcenter() и всякий раз, когда вы хотите построить или синхронизировать или добавить новую внешнюю зависимость, gradle собирается подключиться к https://bintray.com/ , но это не может, и процесс сборки будет ждать до подключения к jcenter(), поэтому этот процесс может занять много времени (+30 мин), даже если вы не можете добавить новую зависимость.

Решение :

  1. Убедитесь, что у вас последняя стабильная версия (текущая 2.0.0)
  2. Убедитесь, что ваша версия Gradle 2.0.0 в build.gradle (classpath 'com.Android.tools.build:gradle:2.0.0')
  3. Последний и самый важный шаг - это изменить jcenter () на mavenCentral ()

Таким образом, вы можете легко добавить новую зависимость и синхронизировать проект за 3 секунды!

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:2.0.0'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        mavenCentral()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Повеселись

76
Mehdi Jahed Manesh

Вы можете оптимизировать процесс сборки Gradle ... 

Попробуйте включить режим ожидания в принудительном режиме, заставляя собираться без какого-либо подключения к внешним репозиториям, например так:

enter image description here enter image description here

Это мне очень помогло, потому что в моей работе все соединения находятся за прокси и это увеличивает время сборки.

Если вам этого недостаточно, потратьте некоторое время на тестирование параметров в Gradle> Experimental ... Некоторые параметры могут улучшить вашу производительность:

enter image description here

4
Fabio Filho

В дополнение к @Mehdi Jahed Manesh ответ выше. 

Увеличьте объем памяти, выделенный для демона Gradle VM, на 1 ГБ до минимума 2 ГБ, используя свойство org.gradle.jvmargs, например:

org.gradle.jvmargs=-Xmx2048m
2
ayz4sci

Для тех, кто использует репозитории, требующие аутентификации , эта проблема может быть решена путем настройки gradle на использование только одной схемы аутентификации:

repositories {
    maven {
        credentials {
            username INTERNAL_REPO_USERNAME
            password INTERNAL_REPO_PASSWORD
        }
        // here comes the important part
        authentication {
            basic(BasicAuthentication)
        }
        url INTERNAL_REPO_URL
    }
}

Оказалось, что при аутентификации в репозиториях Gradle пытается аутентифицировать все виды схем. Приведенный выше конфиг заставляет Gradle использовать только базовую аутентификацию. Здесь это полный список доступных схем.

1
Balazs Banyai

После завершения первоначальной сборки попробуйте включить автономный режим в настройках Gradle. Так что каждая последующая сборка не начнет разрешать зависимости, а будет извлекаться из кеша. Если вы добавите новую зависимость, вам будет предложено отключить автономный режим и перестроить его.  image of the gradle preview

1
Ismail Iqbal

Как ответ Исмаила Икбала сказал, у меня работает перевод в автономный режим.

  1. Если вы используете студию Android, следуйте ответ Фабио Фильо

  2. Если вы используете командную строку, как я, вы можете попробовать 

gradlew assembleReleaseStaging(your task name) --offline
0
iplus26

В моем случае я решил ее, установив новую версию Java JDK . После установки нового JDK откройте AS, перейдите в «Файл» → «Структура проекта» → «Расположение SDK» и измените расположение JDK на то же, что и в новой версии. Java JDK. Затем вам будет предложено разрешение брандмауэра; Проверьте Public и подайте заявку. Пусть это решит градл.

0