Компиляция собственного кода Android Studio выполняется медленно

Недавно я перешел с Eclipse+ADT на Android Studio. Мое приложение является полноценным собственным приложением C++. Я использую Android Studio 2.0 Beta 5 и Gradle Experimental 0.6.0-beta4.

Процесс сборки Android Studio очень медленный для нативного кода. Я прочитал все вопросы на Stackoverflow и в Интернете. Я применил все предложенные методы (--offline, --daemon, --parallel, -XmxSize и т.д.). В основном они направлены на ускорение сборки Java-кода. Процесс компиляции собственных файлов C++ (ndk-build) по-прежнему очень медленный. Даже если я пишу однострочный код C++, я жду 5-7 минут каждый раз, когда нажимаю кнопку «Выполнить», тогда как время компиляции Eclipse для той же задачи составляло около 15-20 секунд.

Есть ли у вас какие-либо предложения по ускорению процесса компиляции нативного кода (C/C++) в Android Studio?


person Rancs    schedule 26.02.2016    source источник
comment
Попробуйте разделить этап ndkBuild, как описано в ph0b.com/android-studio- gradle-and-ndk-интеграция   -  person Alex Cohn    schedule 26.02.2016
comment
@AlexCohn Это выводит работу из Android Studio. Это может быть вариант для приложений Java, которые не работают с собственными файлами, но используют некоторые собственные библиотеки. Мое приложение - чисто родное приложение. Я ищу решение внутри экспериментальной системы сборки gradle.   -  person Rancs    schedule 26.02.2016
comment
Одним из трюков может быть ограничение ABI, которые создает Android Studio.   -  person Alex Cohn    schedule 26.02.2016
comment
Я работаю только с 1 ABI во время разработки.   -  person Rancs    schedule 26.02.2016
comment
У меня более 50 файлов cpp в папке jni. Я чувствую, что gradle-experimental компилирует все с нуля всякий раз, когда я нажимаю кнопку «Выполнить».   -  person Rancs    schedule 26.02.2016
comment
Нет, это не происходит для меня   -  person Alex Cohn    schedule 26.02.2016
comment
Эй, @AlexCohn, спасибо за усилия. Я не думаю, что вы используете экспериментальный плагин gradle 0.6.0+. Он отличается и более развит, чем предыдущие версии. Он компилирует собственный код, не выходя за рамки make-файлов. Но сборка идет медленно. Я ищу решение для скорости компиляции в чисто экспериментальной области градиента.   -  person Rancs    schedule 01.03.2016
comment
Я использую 0.6.0 некоторое время; сегодня я сделал еще одну проверку с последней версией com.android.tools.build:gradle-experimental:0.6.0-beta5, и нет, я не вижу перестроение файлов C++, когда я нажимаю «Выполнить» или «Создать».   -  person Alex Cohn    schedule 03.03.2016
comment
@Rancs Я использую экспериментальный плагин gradle 0.7.0-alpha4, и у меня те же проблемы. Вы смогли это решить?   -  person kristoffz    schedule 31.05.2016
comment
@kristoffz К сожалению, еще нет. Из-за этой проблемы я пока не мог переключить производство с Eclipse на Android Studio. Меня больше напрягает время.   -  person Rancs    schedule 01.06.2016
comment
@Rancs Прошло 3 года, и я тоже столкнулся с этим. Даже если я не трогаю файлы C++ и меняю только java, запуск настолько медленный, что я схожу с ума. Вы нашли решение?   -  person Lothar    schedule 09.07.2019
comment
@Lothar Наша история закончилась интеграцией cmake, которая так же быстра, как старая производительность сборки Eclipse.   -  person Rancs    schedule 10.07.2019
comment
Какое сопротивление. Напоминает мне это: ib.paths.ws/EjHqOp8O   -  person Uval    schedule 19.04.2021


Ответы (2)


Если вы собираете на Linux, у меня есть лайфхак для ускорения сборки NDK:

cd <ndk-bundle-path>
mv ndk-build ndk-build2

Теперь создайте сценарий оболочки с именем «ndk-build», содержащий следующее:

#!/bin/sh
$(dirname $0)/ndk-build2 -j 8 $@

Теперь установите права на выполнение для нового скрипта:

chmod 775 ndk-build

Теперь любой, кто запустит ndk-build (в том числе gradle/android studio), будет вынужден одновременно запускать объектные файлы на 8 ядрах. 8 ядер это просто пример. Вы должны установить это на любое количество ядер, которые у вас есть. Если вы установите слишком большое значение по сравнению с количеством доступных ядер, вы, как правило, потеряете производительность. Если у процессора есть гиперпоточность, вы можете удвоить количество ядер.

Я уверен, что есть эквивалентный способ сделать это в Windows с помощью пакетного сценария или чего-то еще, но у меня нет доступного банкомата с Windows-машиной.

person bofjas    schedule 13.05.2016
comment
Почему 8 ядер? Это инвариант? - person IgorGanapolsky; 27.07.2016
comment
Это только потому, что у меня 4 ядра с гиперпоточностью. Вы должны установить его на то, что когда-либо было доступно. Если вы установите его выше, чем количество физических ядер (в два раза, если многопоточность), вы обычно теряете производительность. - person bofjas; 27.07.2016

Я дам ответ на свой старый вопрос, чтобы закрыть его.

В завершение истории мы интегрировали cmake в проект. Он работает так же быстро, как старая производительность сборки Eclipse.

person Rancs    schedule 30.11.2019