书史足自悦,安用勤与劬。这篇文章主要讲述构建Android时会忽略make -j(jobs)选项(默认为所有核心)相关的知识,希望能为你提供帮助。
我正在用这一系列命令构建android-x86(nougat-x86
分支):
repo init -u git://git.osdn.net/gitroot/android-x86/manifest -b nougat-x86repo sync --no-tags --no-clone-bundlevirtualenv2 venv. venv/bin/activate. build/envsetup.shlunch android_x86_64-userdebugexport 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=1LANG=C LC_ALL=C make -j2 iso_img
请注意我是如何在最后一行使用选项
-j2
指定两个make作业。无论如何,构建实际上产生了
clang
/ clang++
/ javac
的8个进程以及其他任何东西。这会导致构建失败:
超出了GC开销限制 尝试使用java选项'-Xmx'增加堆大小 警告:这可能会产生部分或损坏的输出。 忍者:构建停止:子命令失败。 make:*** [ninja_wrapper]错误1如何强制执行
make failed to build some targets
-j2
选项以确保我的CPU和RAM没有达到最大值?答案原因:JACK服务器是邪恶的。
以下解决了out-of-ram问题:
./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 #2和PR 5的更改。
不明显的是,构建失败并不是因为MACHINE内存不足,而是因为JACK服务器已经用完了。的确,错误信息说......
尝试使用java选项'-Xmx'增加堆大小(强调我的)。
http://www.2net.co.uk/blog/jack-server.html的这个网页解释了......
(...)让我们看看两台不同机器上的默认堆大小。默认堆大小根据所安装的内存总量进行缩放,忽略交换空间。在16 GiB机器上,它超过3 GiB:好的。因此,使用上面的命令我能够将堆大小增加到4GiB并且编译没有错误。
$ 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目标,因此如果机器没有足够的RAM,它就会失败。增加交换空间没有区别。
现在...
如何强制执行-j2选项以确保我的CPU和RAM没有达到最大值?(https://android.googlesource.com/platform/prebuilts/sdk/+/master/tools/README-jack-server.md)的页面说
config.properties文件
它包含Jack服务器配置属性。重新启动服务器后会考虑对这些设置的修改。具有默认值的描述如下:
jack.server.max-service=< number>
最大并发Jack任务数。默认值为4。
(...)
如果您的计算机在编译期间无响应:
您可以通过编辑$HOME/.jack-server/config.properties
并将jack.server.max-service更改为较低的值然后重新启动服务器来减少插孔同时编译的数量,从而改善这种情况。
TL; DR:【构建Android时会忽略make -j(jobs)选项(默认为所有核心)】在
jack.server.max-service=2
的$HOME/.jack-server/config.properties
并重新启动JACK服务器。推荐阅读
- 任务执行失败'(app:transformDexArchiveWithExternalLibsDexMergerForDebug')
- 升级Android Studio 3.1.2后,ProGuard配置解析器出错()
- Android studio安装APK在手机上但无法找到该应用程序
- 下一代技术如何帮助当今防止欺诈
- AR Apps开发人员的7个基本技能
- 由数据驱动的医疗保健提供商的5大优势
- 数据分析中机器学习和大数据的智能实现(5个实际应用)
- 如何在Symfony 4的Twig视图中从services.yaml中检索特定和所有YAML参数
- 使用NoSQL数据库示例