Android7.0 配置JACK支持多用户同时编译
reference:
- https://blog.csdn.net/whorus1/article/details/80364772
- https://www.cnblogs.com/lialong1st/p/10635124.html
- https://blog.csdn.net/qq_27061049/article/details/70156200
- https://blog.csdn.net/babytiger/article/details/111050099
背景
需要在一个Android7平台上进行有关的工作,但是编译的时候发现有问题。记录一下。因为和同事共用一台服务器,因为他的编译没问题;而我的编译没成功。
在网上收集了各方的资料,再结合自己的经验,终于解决了这个问题。
介绍
Android7.0(也就是Android N)以上默认使用JACK编译器而不再使用openjdk了。
Android7.0系统编译工具链使用了全新的Jack server来取代以往的编译器工具
Jack is a new Android toolchain that compiles Java source into Android dex bytecode. It replaces the previous Android toolchain, which consists of multiple tools, such as javac, ProGuard, jarjar, and dx.
然而,在 2017 年 3 月 14 日公告发布之后,Jack 工具链已被弃用。Jack 是 Android 6.0–8.1 的默认 Android 编译工具链。
当你编译Android时,只需使用标准的makefile命令执行即可。当第一次执行编译时,会在你的机器上启动一个jack编译服务: 这个服务大大提高了编译速度,因为它避免了启动一个新的JVM,加载Jack代码,初始化Jack和每次编译都要预制JIT,即使在很小的编译过程中,它也很好的节省了时间。
这个服务也是一个控制Jack并行编译的短期解决方案。它可以限制编译的并行数据量,这样也可以避免内存硬盘溢出问题。
当一段时间没有编译活动,Jack 服务会自动关闭,默认它在本地使用了两个TCP端口,且不对外公开。它也提供了很多参数来配置Jack服务,例如并行数量,timeout时间,端口等等。
但是,如果不做修改时,同一台linux服务器上不允许不同用户同时进行andorid7.0的编译,体现为:第二个开始编译的用户无法正常启动jack server,且jack server居然不能关闭。
虽然JACK文档中有说提供一些宏,理论上只要设置宏为对应的值就可以关闭,但实测发现无效。
报错:Communication error with Jack server (58), try 'jack-diagnose' or see Jack server log
原因:JACK编译器不支持多用户同时编译,其他用户在编译,端口被占用。
解决方法
以下是我自己试过的做法。
修改$HOME/.jack-settings和$HOME/.jack-server/config.properties中的端口号,方可支持多用户同时编译。
注意事项:
0、编译成功的用户的配置才允许修改。(编译失败的用户修改会遇到很多问题)
1、两个文件中的端口号必须一致。
2、修改后的端口号必须是没有被使用的。
新用户删除目录
在编译失败的用户上,删除有关配置。
这样的做法是为了避免 直接修改
$HOME/.jack-settings造成的种种问题。
sudo rm $HOME/.jack-settings $HOME/.jack-server/ -rf
旧用户修改配置
在编译成功的用户上,修改以下配置:
$HOME/.jack-settings:
# Server settings
SERVER_HOST=127.0.0.1
SERVER_PORT_SERVICE=8776 # Port A
SERVER_PORT_ADMIN=8777 # Port B
# Internal, do not touch
SETTING_VERSION=4
$HOME/.jack-server/config.properties:
#Fri Nov 02 14:18:58 CST 2018
jack.server.idle=180
jack.server.max-service.by-mem=1\=2147483648\:2\=3221225472\:3\=4294967296
jack.server.shutdown=21600
jack.server.time-out=7200
jack.server.max-jars-size=104857600
jack.server.service.port=8776 # Port A
jack.server.admin.port=8777 # Port B
jack.server.config.version=4
jack.server.max-service=4
jack.server.deep-idle=900
重启机器
为了方便,直接重启机器更好。
修改以后,重启服务。
out/host/linux-x86/bin/jack-admin kill-server
out/host/linux-x86/bin/jack-admin start-server
# 或者
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server
如果出现下列错误:
Launching Jack server java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=/tmp -Dfile.encoding=UTF-8 -XX:+TieredCompilation -cp /home/schips/.jack-server/launcher.jar com.android.jack.launcher.ServerLauncherJack server failed to (re)start, try 'jack-diagnose' or see Jack server log
No Jack server running. Try 'jack-admin start-server'
No Jack server running. Try 'jack-admin start-server'
可以使用./prebuilts/sdk/tools/jack-admin dump-report将日志dump出来。
$ ./prebuilts/sdk/tools/jack-admin dump-report
Creating report...
Dumping Jack server stacks...
Getting current user id...
Listing Jack server process...
Listing process using Jack server service port 8776...
Listing process using Jack server admin port 8777...
Collecting Jack client configuration...
Listing Jack server installation dir...
Collecting curl version...
Collecting curl connection info...
Collecting Jack server stats...
Zipping Jack server installation dir except keys and certificates...
Jack server report saved in 'jack-report.254730.zip'. Consider reviewing content before publishing.
会得到 jack-report.xx.zip,解压以后,再根据具体的原因对report.xxxxx.txt进行排查:
| 错误原因 | 解决 |
|---|---|
| Protocol https not supported or disabled in libcurl | 安装libcurl |
| connect to 127.0.0.1 port 8777 failed: Connection refused | 修改对应的文件权限,chmod 600 $HOME/.jack-server/config.properties $HOME/.jack-settings |
也可以根据文件 $HOME/.jack-server/logs/jack-server-0-*.log:查看错误原因
10:26:40.898:SEVERE: com.android.jack.launcher.ServerLauncher: Server 1 Exception
com.android.jack.server.api.v01.ServerException: './config.properties' **musthave permission rw------- but have rwx------**
atcom.android.jack.server.JackServerImpl.run(JackServerImpl.java:65)
atcom.android.jack.launcher.ServerLauncher$3.run(ServerLauncher.java:391)
atjava.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: './config.properties' must have permission rw------- but have rwx------
at com.android.jack.server.JackHttpServer.checkAccess(JackHttpServer.java:696)
atcom.android.jack.server.JackHttpServer.loadConfig(JackHttpServer.java:513)
atcom.android.jack.server.JackHttpServer.<init>(JackHttpServer.java:379)
at com.android.jack.server.JackServerImpl.run(JackServerImpl.java:61)
... 2 more
发现是配置文件的权限不对造成的,把文件$HOME/.jack-server/config.properties的权限由rwx改为rw即可解决问题。
chmod 600 $HOME/.jack-server/config.properties $HOME/.jack-settings
另外一个权限问题:那个目录不应该由root以外的其他用户持有。
com.android.jack.server.api.v01.ServerException: '.' is not owned by 'root' but by 'user'
at com.android.jack.server.JackServerImpl.run(JackServerImpl.java:65)
at com.android.jack.launcher.ServerLauncher$3.run(ServerLauncher.java:391)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: '.' is not owned by 'root' but by 'user'
at com.android.jack.server.JackHttpServer.getCurrentUser(JackHttpServer.java:1040)
at com.android.jack.server.JackHttpServer.<init>(JackHttpServer.java:377)
at com.android.jack.server.JackServerImpl.run(JackServerImpl.java:61)
... 2 more
解决方法:
sudo chown root $HOME/.jack-server/
sudo chgrp root $HOME/.jack-server/
重新编译
之前编译失败的用户,重新编译试试。如果成功,再如同编译成功的用户修改配置一样,再将自己的端口号改掉。
此后,如果有新的用户需要编译,以这个方法重试即可。
附录:网友的调试记录
尝试关闭JACK,但发现失败
1),当在板型目录中的BoardConfig.mk中添加ANDROID_COMPILE_WITH_JACK:=false时,编译会出错:
ninja: error: 'out/target/common/obj/APPS/ActSensorCalib_intermediates/with-local/classes.dex', needed by 'out/target/common/obj/APPS/ActSensorCalib_intermediates/classes.dex', missing and no known rule to make it
make[1]: *** [ninja_wrapper] Error 1
2),当在板型目录中的BoardConfig.mk中添加DEFAULT_JACK_ENABLED := disabled时,仍然不能关闭JACK,都会报错:
[ 34% 13188/37803] Ensure Jack server is installed and started
FAILED: /bin/bash -c "(prebuilts/sdk/tools/jack-admin install-server prebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar 2>&1 || (exit 0) ) &&
(JACK_SERVER_VM_ARGUMENTS=\"-Dfile.encoding=UTF-8 -XX:+TieredCompilation\" prebuilts/sdk/tools/jack-admin start-server 2>&1 || exit 0 ) &&
(prebuilts/sdk/tools/jack-admin update server prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar 4.8.ALPHA 2>&1 || exit 0 ) &&
(prebuilts/sdk/tools/jack-admin update jackprebuilts/sdk/tools/jacks/jack-2.28.RELEASE.jar 2.28.RELEASE || exit 47;
prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-3.36.CANDIDATE.jar 3.36.CANDIDATE || exit 47;
prebuilts/sdk/tools/jack-admin update jack prebuilts/sdk/tools/jacks/jack-4.7.BETA.jar 4.7.BETA || exit 47 )"
Writing client settings in /home/test/.jack-settings
Installing jack server in "/home/test/.jack-server"
Communication error with Jack server (58), try 'jack-diagnose' or see Jack server log
Failed to contact Jack server: Problem reading /home/test/.jack-server/client.pem. Try 'jack-diagnose'
Failed to contact Jack server: Problem reading /home/test/.jack-server/client.pem. Try 'jack-diagnose'
[ 34% 13188/37803] Compiling SDK Stubs...tubs_current_intermediates/classes.jar
Note: Some input files use or override a deprecated API.
Note: Recompile with -Xlint:deprecation for details.
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
[ 34% 13188/37803] target SharedLib: l...bLLVM_intermediates/LINKED/libLLVM.so)
ninja: build stopped: subcommand failed.
make[1]: *** [ninja_wrapper] Error 1
make[1]: Leaving directory `/home/test/700E/android/android'
3),尝试通过设置ANDROID_FORCE_JACK_ENABLED := disabled来进行关闭JACK ,编译也报错,跟1)一样的错误:
ninja: warning: multiple rules generate out/target/product/s900_RY_VR/system/xbin/su. builds involving this target will not be correct; continuing anyway [-w dupbuild=warn]
ninja: error: 'out/target/common/obj/APPS/ActSensorCalib_intermediates/with-local/classes.dex', needed by 'out/target/common/obj/APPS/ActSensorCalib_intermediates/classes.dex', missing and no known rule to make it
make[1]: *** [ninja_wrapper] Error 1
修改配置
网上有很多人反映这个问题,https://code.google.com/p/android/issues/detail?id=194027,但是目前没有有效的解决方案,最可能的办法是从2个方面尝试:
1),这个issue有人说是需要增加RAM:I was on VitualMachine when I had the error. And the fix was to increase the RAM,不过他是在虚拟机上,我们的应该跟RAM无关;
2),通过修改配置文件$HOME/.jack-settings,设置不同的端口号:
# Server settings
SERVER_HOST=127.0.0.1
SERVER_PORT_SERVICE=8076
SERVER_PORT_ADMIN=8077
# Internal, do not touch
SETTING_VERSION=4
通过实验发现,单独修改配置文件$HOME/.jack-settings中的端口号没有效果,jack server一直启动失败,提示端口被占用:
com.android.jack.server.api.v01.ServerException: Problem while opening service port
at com.android.jack.server.JackHttpServer.start(JackHttpServer.java:611)
at com.android.jack.server.JackServerImpl.run(JackServerImpl.java:62)
at com.android.jack.launcher.ServerLauncher$3.run(ServerLauncher.java:391)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.net.BindException: **Address already in use**
at sun.nio.ch.Net.bind0(Native Method)
at sun.nio.ch.Net.bind(Net.java:433)
at sun.nio.ch.Net.bind(Net.java:425)
at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
at com.android.jack.server.ServerParameters.openSocket(ServerParameters.java:88)
at com.android.jack.server.ServerParameters.getServiceSocket(ServerParameters.java:67)
at com.android.jack.server.JackHttpServer.start(JackHttpServer.java:605)
3),需要同时修改 $HOME/.jack-server/config.properties 中的端口号,方才有效,可以在别的用户启动了jack server的情况再启动另一个jack server,这样就可以实现多用户同时编译,亲测有效:
#Tue Sep 13 17:44:41 CST 2016
jack.server.max-jars-size=104857600
jack.server.max-service=4
jack.server.service.port=8076 # 修改这里
jack.server.max-service.by-mem=1\=2147483648\:2\=3221225472\:3\=4294967296
jack.server.admin.port=8077 # 修改这里
jack.server.config.version=2
jack.server.time-out=7200
总结一下解决方案就是:
同时修改$HOME/.jack-settings和$HOME/.jack-server/config.properties中的端口号,方可支持多用户同时编译。
补充一下后来编译遇到的错误的解决方法:
错误提示:
[ 8% 1/12] Ensure Jack server is installed and started
再试了一次还是报错:
FAILED:/bin/bash -c "(prebuilts/sdk/tools/jack-admin install-serverprebuilts/sdk/tools/jack-launcher.jar prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar2>&1 || (exit 0) ) &&(JACK_SERVER_VM_ARGUMENTS=\"-Dfile.encoding=UTF-8-XX:+TieredCompilation\" prebuilts/sdk/tools/jack-admin start-server2>&1 || exit 0 ) && (prebuilts/sdk/tools/jack-admin updateserver prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar 4.8.ALPHA 2>&1 ||exit 0 ) && (prebuilts/sdk/tools/jack-admin update jackprebuilts/sdk/tools/jacks/jack-2.28.RELEASE.jar 2.28.RELEASE || exit 47;prebuilts/sdk/tools/jack-admin update jackprebuilts/sdk/tools/jacks/jack-3.36.CANDIDATE.jar 3.36.CANDIDATE || exit 47;prebuilts/sdk/tools/jack-admin update jackprebuilts/sdk/tools/jacks/jack-4.7.BETA.jar 4.7.BETA || exit 47 )"
Jack server already installed in"/home/local/ACTIONS/songzhining/.jack-server"
Launching Jack server java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=/tmp-Dfile.encoding=UTF-8 -XX:+TieredCompilation -cp/home/local/ACTIONS/songzhining/.jack-server/launcher.jarcom.android.jack.launcher.ServerLauncher
Jack server failed to (re)start, try 'jack-diagnose' or see Jack server log
No Jack server running. Try 'jack-admin start-server'
No Jack server running. Try 'jack-admin start-server'
ninja: build stopped: subcommand failed.
make[1]: *** [ninja_wrapper] Error 1
解决方案:
通过查看文件 $HOME/.jack-server/logs/jack-server-0-0.log:
10:26:40.898:SEVERE: com.android.jack.launcher.ServerLauncher: Server 1 Exception
com.android.jack.server.api.v01.ServerException: './config.properties' **musthave permission rw------- but have rwx------**
atcom.android.jack.server.JackServerImpl.run(JackServerImpl.java:65)
atcom.android.jack.launcher.ServerLauncher$3.run(ServerLauncher.java:391)
atjava.lang.Thread.run(Thread.java:745)
Caused by: java.io.IOException: './config.properties' must have permission rw------- but have rwx------
at com.android.jack.server.JackHttpServer.checkAccess(JackHttpServer.java:696)
atcom.android.jack.server.JackHttpServer.loadConfig(JackHttpServer.java:513)
atcom.android.jack.server.JackHttpServer.<init>(JackHttpServer.java:379)
at com.android.jack.server.JackServerImpl.run(JackServerImpl.java:61)
... 2 more
发现是配置文件的权限不对造成的,把文件$HOME/.jack-server/config.properties的权限由rwx改为rw即可解决问题。
chmod 600 $HOME/.jack-server/config.properties $HOME/.jack-settings
Android7.0 配置JACK支持多用户同时编译的更多相关文章
- AgileConfig轻量级配置中心1.3.0发布,支持多用户权限控制
AgileConfig 当初是设计给我自己用的一个工具,所以只设置了一道管理员密码,没有用户的概念.但是很多同学在使用过后都提出了需要多用户支持的建议.整个团队或者整个公司都使用同一个密码来管理非常的 ...
- centos6编译安装zabbix3.0和中文支持整理文档
编者按: 最近公司部分业务迁移机房,为了更方便的监控管理主机资源,决定上线zabbix监控平台.运维人员使用2.4版本的进行部署,个人在业余时间尝鲜,使用zabbix3.0进行部署,整理文档如下,仅供 ...
- 使用webpack从0搭建多入口网站脚手架,可复用导航栏/底部通栏/侧边栏,根据页面文件自动更改配置,支持ES6/Less
之前只知道webpack很强大,但是一直没有深入学习过,这次从头看了一下教程,然后从0开始搭建了一个多入口网站的开发脚手架,期间遇到过很多问题,所以有心整理一下,希望能给大家一点帮助. 多HTML网站 ...
- Android7.0新特性,及Android N适配
新特性部分 Android 7.0 Nougat 提供新功能以提升性能.生产效率和安全性,主要新增了下面的新特性和优化: 一.新的Notification Android N 添加了很多新的notif ...
- python 开发一个支持多用户在线的FTP
### 作者介绍:* author:lzl### 博客地址:* http://www.cnblogs.com/lianzhilei/p/5813986.html### 功能实现 作业:开发一个支持多用 ...
- LNMP搭建04 -- 配置Nginx支持PHP
首先建立存放网页文件的目录,执行 mkdri /usr/local/server/www 然后进入到该目录中 cd /usr/local/server/www 然后创建一个测试文件: phpinfo ...
- Android7.0 多窗口你值得拥有
Android7.0 多窗口你值得拥有 什么是多窗口分屏? 多窗口分屏其实在国内并不陌生,已经有一些手机和平板搭载了"分屏多任务"和"APP窗口化"功能,但这些 ...
- (转)Python开发程序:支持多用户在线的FTP程序
原文链接:http://www.itnose.net/detail/6642756.html 作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ...
- CAS (13) —— CAS 使用Maven Profile支持多环境编译
CAS (13) -- CAS 使用Maven Profile支持多环境编译 摘要 CAS 使用Maven Profile支持多环境编译 版本 tomcat版本: tomcat-8.0.29 jdk版 ...
- WebService之Axis2(1):用POJO实现0配置的WebService
Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物.Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持S ...
随机推荐
- 史上功能最全的Java权限认证框架!
大家好,我是 Java 陈序员.权限认证是我们日常开发绕不过的话题,这是因为我们的应用程序需要防护,防止被窜入和攻击. 在 Java 后端开发中,实现权限认证有很多种方案可以选择,一个拦截器.过滤器也 ...
- 自动生成robot自动化测试用例
背景:java项目使用swagger管理接口,随着需求的开发接口也有增加,要从swagger界面中去查找出新增的接口是件很费时,效率很低的事情. 适用情况: java项目且适用swagger管理接口 ...
- 从SAP CRM上传设备到SAP ERP
文档<Step by step to download equipment from ERP with hierarchy>描述了从ERP复制设备到CRM的步骤.默认情况下,ERP中的设备 ...
- 一:大数据架构回顾-Lambda架构
"我们正在从IT时代走向DT时代(数据时代).IT和DT之间,不仅仅是技术的变革,更是思想意识的变革,IT主要是为自我服务,用来更好地自我控制和管理,DT则是激活生产力,让别人活得比你好&q ...
- ZJC比赛
\(\large{Uptatete}\) 先放张图 这次是真的没想再改了,但是一到教室就又会怎么优化了 没必要每个点都让它和其他所有点判断一下,可以从上一个点加加减减啥的转过来 然后我就在昨天那个 \ ...
- vue特殊attribute-key
官方说明:如果不使用 key,Vue 会使用一种最大限度减少动态元素并且尽可能的尝试就地复用相同类型元素的算法.而使用 key 时,它会基于 key 的变化重新排列元素顺序,并且会移除 key 不存在 ...
- HH的项链——题解
题目描述 直接求解会导致不同贝壳在上个区间算过但这个区间没标记的情况,所以在求解时要把上个区间的标记转移到这个区间 转移前先右边界由小到大排序,然后转移上个右边界到这个右边界的标记,同时记录上个标记出 ...
- Unity HDRP BentNormal的理解
1.通过网上冲浪了解到,BentNormal可以解决间接环境高光漏光及间接漫反射光照漏光的问题. 这里的漏光是指间接光照部分没有考虑到模型自身的遮挡关系导致的漏光. 2.可以通过SD之类的软件烘焙Be ...
- 移动通信网络中的 FDD/TDD 无线帧
目录 文章目录 目录 前文列表 无线帧 FDD 与 TDD 的区别 FDD 无线帧 TDD 无线帧 前文列表 <移动通信网络中的资源类型> 无线帧 LTE 支持两种类型的无线帧:FDD(F ...
- 【Azure Developer】如何通过Azure Portal快速获取到对应操作的API并转换为Python代码
问题描述 对于Azure资源进行配置操作,门户上可以正常操作.但是想通过Python代码实现,这样可以批量处理.那么在没有SDK的情况下,是否有快速办法呢? 问题解答 当然可以,Azure Porta ...