# Android7.0 配置JACK支持多用户同时编译

reference:

背景

需要在一个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支持多用户同时编译的更多相关文章

  1. AgileConfig轻量级配置中心1.3.0发布,支持多用户权限控制

    AgileConfig 当初是设计给我自己用的一个工具,所以只设置了一道管理员密码,没有用户的概念.但是很多同学在使用过后都提出了需要多用户支持的建议.整个团队或者整个公司都使用同一个密码来管理非常的 ...

  2. centos6编译安装zabbix3.0和中文支持整理文档

    编者按: 最近公司部分业务迁移机房,为了更方便的监控管理主机资源,决定上线zabbix监控平台.运维人员使用2.4版本的进行部署,个人在业余时间尝鲜,使用zabbix3.0进行部署,整理文档如下,仅供 ...

  3. 使用webpack从0搭建多入口网站脚手架,可复用导航栏/底部通栏/侧边栏,根据页面文件自动更改配置,支持ES6/Less

    之前只知道webpack很强大,但是一直没有深入学习过,这次从头看了一下教程,然后从0开始搭建了一个多入口网站的开发脚手架,期间遇到过很多问题,所以有心整理一下,希望能给大家一点帮助. 多HTML网站 ...

  4. Android7.0新特性,及Android N适配

    新特性部分 Android 7.0 Nougat 提供新功能以提升性能.生产效率和安全性,主要新增了下面的新特性和优化: 一.新的Notification Android N 添加了很多新的notif ...

  5. python 开发一个支持多用户在线的FTP

    ### 作者介绍:* author:lzl### 博客地址:* http://www.cnblogs.com/lianzhilei/p/5813986.html### 功能实现 作业:开发一个支持多用 ...

  6. LNMP搭建04 -- 配置Nginx支持PHP

    首先建立存放网页文件的目录,执行 mkdri /usr/local/server/www  然后进入到该目录中 cd /usr/local/server/www 然后创建一个测试文件: phpinfo ...

  7. Android7.0 多窗口你值得拥有

    Android7.0 多窗口你值得拥有 什么是多窗口分屏? 多窗口分屏其实在国内并不陌生,已经有一些手机和平板搭载了"分屏多任务"和"APP窗口化"功能,但这些 ...

  8. (转)Python开发程序:支持多用户在线的FTP程序

    原文链接:http://www.itnose.net/detail/6642756.html 作业:开发一个支持多用户在线的FTP程序 要求: 用户加密认证 允许同时多用户登录 每个用户有自己的家目录 ...

  9. CAS (13) —— CAS 使用Maven Profile支持多环境编译

    CAS (13) -- CAS 使用Maven Profile支持多环境编译 摘要 CAS 使用Maven Profile支持多环境编译 版本 tomcat版本: tomcat-8.0.29 jdk版 ...

  10. WebService之Axis2(1):用POJO实现0配置的WebService

    Axis2是一套崭新的WebService引擎,该版本是对Axis1.x重新设计的产物.Axis2不仅支持SOAP1.1和SOAP1.2,还集成了非常流行的REST WebService,同时还支持S ...

随机推荐

  1. JUC并发编程学习笔记(二)Lock锁(重点)

    Lock锁(重点) 传统的synchronized 传统的解决多线程并发导致的一些问题我们会使用synchronized关键字来解决,synchronized的本质就是队列.锁. Lock的实现类有: ...

  2. Spark中的闭包引用和广播变量

    闭包引用 概念 所有编程语言都有闭包的概念,闭包就是在一个函数中引用了函数外的变量. Spark中,普通的变量是在Driver程序中创建的,RDD的计算是在分布式集群中的task程序上进行的.因此,当 ...

  3. 2021~2022Apache大数据相关项目盘点

    一.晋升为Apache TLP(Top-Level Project)的大数据相关项目 1.1.Apache DataSketches (20210203) 1.2.Apache Gobblin (20 ...

  4. 02 elasticsearch学习笔记-ES核心概念

    一. 前序 sh Elasticsearch是一个基于Apache Lucene(TM)的开源搜索引擎.无论在开源还是专有领域,Lucene 可以被认为是迄今为止最先进.性能最好的.功能最全的搜索引擎 ...

  5. LogAgen的工作流程

    LogAgen的工作流程: 一.读日志 --tailf 第三方库 新建tail_test/main.go package main import ( "fmt" "git ...

  6. iceoryx源码阅读(六)——共享内存创建

    目录 1 共享内存的组织 2 共享内存创建 2.1 IceOryxRouDiMemoryManager::createAndAnnounceMemory 2.2 RouDiMemoryManager: ...

  7. NASM中的伪指令

    伪指令不是真正的指令,而是为了方便NASM汇编器而存在,但是它们的地位与真正的指令相同: label: instruction operands ; comment instruction部分就可以是 ...

  8. .NET使用P/Invoke来实现注册表的增、删、改、查功能

    注册表可以用来进行存储一些程序的信息,例如用户的权限.或者某些值等,可以根据个人需要进行存储和删减. 当前注册表主目录: 引用包 Wesky.Net.OpenTools 1.0.5或者以上版本 操作演 ...

  9. (1)semantic-kernel入门课程

    (1)semantic-kernel入门课程 获取OpenAI在线API 由于在国内的限制,我们并没有办法直接访问OpenAI,所以下面的教程我们会推荐使用https://api.token-ai.c ...

  10. sass 混合指令 (Mixin Directives)详解

    ​ 混合指令(Mixin)用于定义可重复使用的样式,避免了使用无语意的 class,比如 .float-left.混合指令可以包含所有的 CSS 规则,绝大部分 Sass 规则,甚至通过参数功能引入变 ...