linux下Android7.0多用户编译问题

0.0 WHY

linux下多用户使用open-jdk8编译时会有jack-server的问题。首先要明白为什么会出现这个问题,只有明白了原因,才能对症下药。注意这里重点是多用户会出错。如果只有一个用户的话应该问题不大。 因为在编译时需要启动jack-server,jack-server本质上还是一个server,既然是server那么肯定需要指定端口号等信息,那么这些信息配置在哪里呢?这些就要看编译报错的log了。如果没有修改端口,而该Linux也已经有其他用户使用openjdk8编译过了,那么就会报错,报错如下:

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 jack 
prebuilts/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 /Public2/user/.jack-settings
Installing jack server in "/Public2/user/.jack-server"
Communication error with Jack server (58), try 'jack-diagnose' or see Jack server log
Failed to contact Jack server: Problem reading /Public2/user/.jack-server/client.pem. Try 'jack-diagnose'
Failed to contact Jack server: Problem reading /Public2/user/.jack-server/client.pem. Try 'jack-diagnose'
ninja: build stopped: subcommand failed.
make: *** [ninja_wrapper] 错误 1

可以看到,编译时会向/Public2/user/.jack-settings文件中写关于server的信息,并在/Public2/user/.jack-server去安装server,在安装过程中出错。所以去这两个file或者目录去查看。 这些信息配置在帐户目录下的.jack-settings文件中。在Linux下打开该文件

$ cat .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

在使用openjdk1.8编译时会在.jack-settings指定的端口上开启jack server。也就相当于需要在Linux系统的指定端口开启一个server,那么如果该Linux下的所有用户都不改server的设置文件,而使用默认的settings,那么就相当于,多个人希望在Linux的同一个端口下开启jack-server(据说server大大提升了编译速率)。这怎么可能呢……….

0.1 HOW

既然明白了问题的原因,那么解决起来应该也简单不少。 如果想实现在Linux下多用户使用jack-server编译,那么就需要让每个用户用不同的端口来开启属于用户自己的jack-server。也就是说每个用户都需要配置自己的jack-server。所以用户需要修改.jack-settings文件来配置一个server。这个Linux上多个用户可以自己协商,只需要修改.jack-settings文件中的

SERVER_PORT_SERVICE=8076
SERVER_PORT_ADMIN=8077

修改这两个字段,比如,我的修改如下,注意,在修改时跳过Linux的特殊端口(百度),否则端口被占用的话也只能是自讨苦吃

SERVER_PORT_SERVICE=8073
SERVER_PORT_ADMIN=8074

注意,到这里,你的server才开始去安装和准备启动,当你给server分配了可用的端口之后,用户目录下的.jack-server文件夹下才会生出config.properties文件。以及.jack-server/logs/才会有server的log。但是,你会发现,你的编译依旧是会报错,因为又需要去配置config.properties文件中的端口号。说实话感觉挺坑的,我明明已经配置了.jack-settings中的端口号,而且config.properties也是编译时生成的,为什么该文件就不能去适配.jack-settings中的信息呢?不得而知,也许跟openjdk8有关系,也许跟Linux有关,谁知道呢…………. 所以接下来需要修改config.properties文件中的两个字段

:~/.jack-server$ cat config.properties 
#
#Tue Oct 17 09:36:52 CST 2017
jack.server.max-jars-size=104857600
jack.server.max-service=4
#修改保持和.jack-settings文件中的端口一致
jack.server.service.port=8073
jack.server.max-service.by-mem=1\=2147483648\:2\=3221225472\:3\=4294967296
#修改保持和.jack-settings文件中的端口一致
jack.server.admin.port=8074
jack.server.config.version=2
jack.server.time-out=7200

原本博主以为修改这两个就可以了,紧接着,依旧是有错。报错如下:

mkdir: 无法创建目录"/tmp/jack-ucin/jack-task-15246/": 权限不够

又是jack的问题,好了,去找这个目录的权限,tmp不是在帐户目录下,而是在Linux系统的根目录下,即所有用户共享。找到tmp/jack-ucin目录,发现权限确实有限。这是因为jack-ucin目录是由第一个使用openjdk8编译的用户进行编译时创建生成的,uid和gid为该用户,所以你要做的就是修改jack-ucin的权限至777

chmod -R 777 ./jack-ucin

在修改权限时你需要切换到root用户,或者是创建该目录的用户。 到目前为止,再次编译,jack-server成功启动。至此,编译环境问题已经解决,接下来,就是看自己的代码能不能编过了.

ps linux下查看当前端口号是否被占用

netstat -apn | grep 8072
             $(function () {                 $('pre.prettyprint code').each(function () {                     var lines = $(this).text().split('\n').length;                     var $numbering = $('<ul/>').addClass('pre-numbering').hide();                     $(this).addClass('has-numbering').parent().append($numbering);                     for (i = 1; i <= lines; i++) {                         $numbering.append($('<li/>').text(i));                     };                     $numbering.fadeIn(1700);                 });             });         

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Netkiller

跟我学 systemd

跟我学 systemd 摘要 我的系列文档 Netkiller Architect 手札Netkiller Developer 手札Netkiller PHP ...

37612
来自专栏IT笔记

SpringBoot开发案例之整合日志管理

有一种力量无人能抵挡,它永不言败生来倔强。有一种理想照亮了迷茫,在那写满荣耀的地方。

4918
来自专栏玩转JavaEE

JavaWeb之最简洁的配置实现文件上传

按:最近公众号文章主要是整理一些老文章,主要是个人CSDN上的博客,也会穿插一些新的技术点。 ---- Spring、SpringMVC持续介绍中,基础配置前面...

2793
来自专栏Java 源码分析

SpringCloud:Eureka服务注册与发现

Eureka 其实就是一个 服务注册与发现的中心,也就是相当于我们前面做的一些生产者的服务需要注册到我们的注册中心,那么我们的消费者就不用把代码写死,而是可以去...

1693
来自专栏BaronTalk

写给 Android 应用工程师的 Binder 原理剖析

这篇文章我酝酿了很久,参考了很多资料,读了很多源码,却依旧不敢下笔。生怕自己理解上还有偏差,对大家造成误解,贻笑大方。又怕自己理解不够透彻,无法用清晰直白的文字...

58410
来自专栏IT笔记

SpringBoot开发案例之整合日志管理

有一种力量无人能抵挡,它永不言败生来倔强。有一种理想照亮了迷茫,在那写满荣耀的地方。 ? 00.jpg 概述 参考文档:Logging 这里顺便引用以下部分原文...

4868
来自专栏思考的代码世界

Mac搭建yaf项目

1380
来自专栏Java成长之路

idea创建maven项目时一直显示“Loading archetype list ”

1786
来自专栏JMCui

Netty 系列二(传输).

    上一篇文章我们提到 Netty 的核心组件是 Channel、回调、Future、ChannelHandler、EventLoop,这篇文章主要是对 C...

1512
来自专栏F_Alex

SpringCloud-容错处理Hystrix熔断器(五)

3443

扫码关注云+社区

领取腾讯云代金券