Опция make -j (jobs) игнорируется при сборке Android (по умолчанию для всех ядер)

Я собираю Android-x86 (ветвь nougat-x86) с помощью этой последовательности команд:

repo init -u git://git.osdn.net/gitroot/android-x86/manifest -b nougat-x86

repo sync --no-tags --no-clone-bundle

virtualenv2 venv

. venv/bin/activate

. build/envsetup.sh

lunch android_x86_64-userdebug

export ANDROID_JACK_VM_ARGS="-Xmx4g -XX:+TieredCompilation -Dfile.encoding=UTF-8"
export JACK_SERVER_VM_ARGUMENT=$ANDROID_JACK_VM_ARGS
export SERVER_NB_COMPILE=1
export USE_CCACHE=1

LANG=C LC_ALL=C make -j2 iso_img

Обратите внимание, как я указываю два задания make с опцией -j2 в последней строке.

Несмотря на это, сборка фактически порождает 8 процессов clang / clang++ / javac и что-то еще.

Это приводит к сбою сборки:

Превышен лимит накладных расходов GC
Попробуйте увеличить размер кучи с помощью параметра java '-Xmx'
Предупреждение. Это могло привести к частичному или поврежденному выводу.
ninja: сборка остановлена: подкоманда не удалась.
make: ** * [ninja_wrapper] Ошибка 1

make failed to build some targets


Как включить параметр -j2, чтобы убедиться, что мой процессор и оперативная память не перегружены?


person Marc.2377    schedule 08.08.2017    source источник


Ответы (1)


Причина: сервер JACK неисправен.

Следующее решает проблему нехватки оперативной памяти:

./prebuilts/sdk/tools/jack-admin kill-server
rm -rf ~/.jack*    
export ANDROID_JACK_VM_ARGS="-Xmx4g -XX:+TieredCompilation -Dfile.encoding=UTF-8"
export SERVER_NB_COMPILE=2
export JACK_SERVER_VM_ARGUMENT=$ANDROID_JACK_VM_ARGS
./prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-server-4.*.ALPHA.jar
./prebuilts/sdk/tools/jack-admin start-server

Большое спасибо ЧЕЛОВЕКУ! проект. Измененный скрипт с изменениями из выпуска №2 и PR 5.


Что не сразу очевидно, так это то, что сборка не удалась не потому, что у МАШИНЫ закончилась память, а потому, что у JACK-сервера закончилась память. Действительно, сообщение об ошибке говорит...

Попробуйте увеличить размер кучи с помощью опции java '-Xmx'

(выделено мной).

Эта веб-страница по адресу http://www.2net.co.uk/blog/jack-server.html объясняет...

(...) давайте посмотрим на размер кучи по умолчанию на двух разных машинах. Размер кучи по умолчанию масштабируется в соответствии с общим объемом установленной памяти, игнорируя пространство подкачки. На машине 16 ГиБ это более 3 ГиБ:

$ java -XshowSettings 2>&1  | grep Heap
    Max. Heap Size (Estimated): 3.47G

Но на машине 8 ГБ это меньше 2 ГБ:

$ java -XshowSettings 2>&1  | grep Heap
    Max. Heap Size (Estimated): 1.71G

Оказывается, jack-серверу требуется около 3 ГиБ для создания типичной цели AOSP Nougat, поэтому он не работает, если на машине недостаточно оперативной памяти. Увеличение пространства подкачки не имеет значения.

Хорошо. Итак, с помощью приведенных выше команд я смог увеличить размер кучи до 4 ГБ и скомпилировать без ошибок.


В настоящее время...

Как применить параметр -j2, чтобы убедиться, что мой ЦП и ОЗУ не исчерпаны?

Страница по адресу (https://android.googlesource.com/platform/prebuilts/sdk/+/master/tools/README-jack-server.md) говорит

файл config.properties

Он содержит свойства конфигурации сервера Jack. Изменения этих настроек учитываются после перезапуска сервера. Ниже приводится описание со значениями по умолчанию:

jack.server.max-service=<number> Максимальное количество одновременных задач Джека. По умолчанию 4.

(...)

Если ваш компьютер перестает отвечать на запросы во время компиляции:

Вы можете улучшить ситуацию, уменьшив количество одновременных компиляций jack, отредактировав свой $HOME/.jack-server/config.properties и изменив jack.server.max-service на более низкое значение, а затем перезапустив сервер.


TL;DR:

jack.server.max-service=2 в $HOME/.jack-server/config.properties и перезапустите сервер JACK.

person Marc.2377    schedule 21.03.2018