构建Android时会忽略make -j(jobs)选项(默认为所有核心)

时间:2017-08-08 02:01:47

标签: android build compilation ninja

我使用以下命令构建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

请注意我如何在最后一行指定两个带有选项-j2的制作作业。

无论如何,构建实际上产生了clang / clang++ / javac以及其他任何内容的8个进程。

这会导致构建失败:

  

超出GC开销限额
  尝试使用java选项' -Xmx'增加堆大小   警告:这可能会产生部分或损坏的输出   忍者:构建停止:子命令失败。
  make:*** [ninja_wrapper]错误1

     无法建立一些目标


如何强制执行-j2选项以确保我的CPU和RAM没有达到最大值?

1 个答案:

答案 0 :(得分:0)

原因: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

非常感谢the FUCK JACK! project。已修改的脚本,其中包含issue #2PR 5的更改。

显而易见的是,构建失败并不是因为MACHINE内存不足,而是因为JACK服务器已经用完了。的确,错误信息说......

  

使用java选项' -Xmx'

尝试增加堆大小

(强调我的)。

http://www.2net.co.uk/blog/jack-server.html的这个网页解释了......

  

(...)让我们看看两台不同机器上的默认堆大小。   默认堆大小根据内存总量进行缩放   适合,忽略交换空间。在16 GiB机器上,它超过3   吉布:

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

但是,在8 GiB机器上,它小于2 GiB:

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

事实证明,jack-server需要大约3 GiB来构建一个典型的   AOSP Nougat目标,如果机器没有足够的话它会失败   内存。增加交换空间没有区别。

好的。因此,使用上面的命令,我能够将堆大小增加到4GiB并且编译时没有错误。

现在...

如何强制使用-j2选项以确保我的CPU和RAM没有达到最大值?

https://android.googlesource.com/platform/prebuilts/sdk/+/master/tools/README-jack-server.md)的页面说

  

config.properties文件

     

它包含Jack服务器配置属性。修改为   重新启动服务器后会考虑这些设置。   具有默认值的描述如下:

     

jack.server.max-service=<number>同时杰克的最大数量   任务。默认值为4。

     

(...)

     

如果您的计算机在编译期间无响应:

     

您可以通过减少插孔数来改善这种情况   通过编辑你的同步编辑   $HOME/.jack-server/config.properties并改变   jack.server.max-service为较低的值,然后重新启动   服务器


TL; DR:

jack.server.max-service=2中的

$HOME/.jack-server/config.properties并重新启动JACK服务器。