前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux下Android7.0多用户编译问题

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

作者头像
fanfan
发布2018-01-24 18:33:39
2.2K0
发布2018-01-24 18:33:39
举报
文章被收录于专栏:编程思想之路编程思想之路

0.0 WHY

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

代码语言:javascript
复制
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下打开该文件

代码语言:javascript
复制
$ 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文件中的

代码语言:javascript
复制
SERVER_PORT_SERVICE=8076
SERVER_PORT_ADMIN=8077

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

代码语言:javascript
复制
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文件中的两个字段

代码语言:javascript
复制
:~/.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

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

代码语言:javascript
复制
mkdir: 无法创建目录"/tmp/jack-ucin/jack-task-15246/": 权限不够

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

代码语言:javascript
复制
chmod -R 777 ./jack-ucin

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

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

代码语言:javascript
复制
netstat -apn | grep 8072
代码语言:js
复制
             $(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);                 });             });         
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-10-17 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0.1 HOW
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档