前言
JackServer是AOSP自带的一个编译Java代码的服务器,每次执行make的时候会判断当前用户是否安装了JackServer,如果没有,就会自动安装。但这玩意经常报各种错。本文记录解决这些错误的方法。
开发环境
AOSP开发极其依赖开发环境,介绍一下我的开发环境作为参考:
硬件环境
Ubuntu 16.04虚拟机或实体机
编译源码要有至少8G的内存,如果要用AS或者ASFP打开源码目录,需要16G以上内存,不然会中途报错
硬盘空间300G以上,推荐500G以上避免报错
软件环境
用apt安装这堆东西:
sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig libxml2-utils
Java需要openjdk1.8
sudo apt-get install openjdk-8-jdk
python2.7,系统自带的就可以
JackServer目录和使用方式
JackServer的目录在~/.jackserver/
设置文件在.jack-server/config.properties
和~/.jack-settings
日志文件在~/.jack-server/logs/
启动指令:
先cd到AOSP根目录下
./prebuilts/sdk/tools/jack-admin start-server
停止指令:
./prebuilts/sdk/tools/jack-admin kill-server
多数情况下不需要手动启动和停止JackServer
查看错误指令:
要先source build/envsetup.sh才能找到命令
jack-diagnose
但是这个指令大多数情况下是不会真的报错的,更常用的是下面这个指令:
输出log:
./prebuilts/sdk/tools/jack-admin dump-report
疑难杂症
SSL报错
症状:控制台输出这句话
Jack server failed to ,SSL error when connecting to the Jack server. Try ‘jack-diagnose‘
要改两个文件,JackServer自带的配置和openJdk的配置,分别在以下两个位置:
gedit [你的AOSP源码路径]/prebuilts/jdk/jdk8/darwin-x86/jre/lib/security/java.security
sudo gedit /etc/java-8-openjdk/security/java.security
删掉TLSv1, TLSv1.1,
,然后重启Ubuntu
OOM
内存不足导致的,控制台会输出这句话
Out of memory error (version 1.3-rc7 'Douarn' (445000 d7be3910514558d6715ce455ce0861ae2f56925a by android-jack-team@google.com)).
GC overhead limit exceeded.
编辑~/.jack-settings
加入这行
JACK_SERVER_VM_ARGUMENTS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4g -Xms1g"
Ubuntu内存不够的话可以用zram和swap缓解,有条件最好上大内存。
SETTING_VERSION未绑定的变量
症状:控制台输出这句话
jack-admin: 行 55: SETTING_VERSION: 未绑定的变量
编辑~/.jack-settings
加入这行
SETTING_VERSION=4
服务器地址不匹配
报错信息我忘了,反正就是说服务器的地址不匹配的意思。打开源码会发现里面匹配localhost,但服务器的地址是127.0.0.1
当时看见这个报错的时候...我真的很想把谷歌程序员脑子打开看看里面装的什么东西。本地有jdk不用,非要搞什么服务器,自己服务自己就算了。丫的判断地址是不是一致,不ping一下,搁这字符串判断,还localhost和127.0.0.1都不设置个别名...国际大厂的水平就这?
解决办法,没错,还是上面那个~/.jack-settings
,加入这行
SERVER_HOST=localhost
端口被占用
改了就是了,这次要改两个文件。
第一个还是~/.jack-settings
,加入这两行
SERVER_PORT_SERVICE=8074
SERVER_PORT_ADMIN=8075
第二个是~/.jack-server/config.properties
,修改这两行
jack.server.service.port=8074
jack.server.admin.port=8075
然后设置权限
chmod 0600 .jack-server/config.properties
chmod 0600 .jack-settings
权限错误
查看~/.jack-server/logs/
的日志,发现最新的文件有以下内容:
SEVERE: com.android.jack.launcher.ServerLauncher: Server 1 Exception
com.android.jack.server.api.v01.ServerException: '.' has the following invalid permissions ---rwxrwx
at com.android.jack.server.JackServerImpl.run(JackServerImpl.java:71)
at com.android.jack.launcher.ServerLauncher$3.run(ServerLauncher.java:392)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: '.' has the following invalid permissions ---rwxrwx
at com.android.jack.server.PosixFileAccess.checkAccessibleOnlyByOwner(PosixFileAccess.java:62)
at com.android.jack.server.JackHttpServer.getCurrentUser(JackHttpServer.java:1232)
at com.android.jack.server.JackHttpServer.<init>(JackHttpServer.java:525)
at com.android.jack.server.JackServerImpl.run(JackServerImpl.java:66)
... 2 more
谷歌真的有毛病,还非要求文件的权限长什么样,777还不行。就我一个人用的电脑,就一个账户,搞那么多乱七八糟的干嘛,纯纯有毛病。
两个解决办法,一个是改权限:
- ~/.jack-server 目录本身权限设置为700
- ~/.jack-server/logs 目录及目录下文件设置为777
- ~/.jack-server/jack 目录及目录下的文件设置为777
- ~/.jack-server/ 目录下其他文件设置为600
第二个办法是不惯着这逼玩意,直接改JackServer的源码
git clone https://android.googlesource.com/platform/tools/jack
find . -name "PosixFileAccess.java"
找到checkAccessibleOnlyByOwner
这个方法,改为空实现。然后重新编译JackServer,替换原来的JackServer。这个方法是GPT提供的,我没亲自试过。