【AOSP】JackServer疑难杂症解决

2024-06-25  本文已影响0人  天枢破军

前言

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还不行。就我一个人用的电脑,就一个账户,搞那么多乱七八糟的干嘛,纯纯有毛病。
两个解决办法,一个是改权限:

第二个办法是不惯着这逼玩意,直接改JackServer的源码

git clone https://android.googlesource.com/platform/tools/jack
find . -name "PosixFileAccess.java"

找到checkAccessibleOnlyByOwner这个方法,改为空实现。然后重新编译JackServer,替换原来的JackServer。这个方法是GPT提供的,我没亲自试过。

上一篇 下一篇

猜你喜欢

热点阅读