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

Posted fanfan-公众号-码农修仙儿

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux下Android7.0多用户编译问题相关的知识,希望对你有一定的参考价值。

在此首先感谢Android7.0 JACK编译器不支持多用户同时编译的问题的解决该篇文章的作者龙骨一身为我提供了很多问题解决方案,也学习到了很多。接下来相当于一个学习笔记了。

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

我的博客即将搬运同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan

以上是关于linux下Android7.0多用户编译问题的主要内容,如果未能解决你的问题,请参考以下文章

Android7.0多窗口实现原理

Android7.0 Ninja编译原理

Android7.0 拨号盘应用源码分析 界面浅析

Android7.0多窗口实现原理

android7.0关于TelephonyManager.getDeviceId()返回null的问题

Android7.0 FileUriExposedException 问题解决