目录
Jack介绍
官方介绍https://source.android.com/docs/setup/create/jack?hl=zh-cn
简而言之,Jack 是一种 Android 工具链,用于将 Java 源代码编译成 Android dex 字节码。Android老的版本6.0~8.1在编译时会使用Jack,使用 Jack 时,它会在您的计算机上启动一个本地 Jack 编译服务器,用于实现内在加速和控制并行Jack编译数量,该服务器使用localhost(127.0.0.1)接口上的2个TCP端口,且空闲一段时间后会自动关闭。
Jack Server交互命令
使用prebuilts/sdk/tools/jack-admin可执行如下交互命令
jack-admin start-server
jack-admin kill-server
jack-admin list-server
jack-admin uninstall-server
jack-admin install-server jack-launcher.jar jack-server-4.8.ALPHA.jar
jack-admin dump-report
jack-admin server-log 查找log所在目录
编译常见问题及解决方法
端口冲突
编译提示
Communication error with Jack server (58), try 'jack-diagnose' or see Jack server log
Failed to contact Jack server: Problem reading /root/.jack-server/client.pem. Try 'jack-diagnose'
jack服务器使用localhost(127.0.0.1)接口上的2个TCP端口,需确保没有被其他应用占用,如下2个文件,且2个文件中端口号应对应一致
$HOME/.jack-settings文件
SERVER_PORT_SERVICE=8078
SERVER_PORT_ADMIN=8079
$HOME/.jack-server/config.properties 文件
jack.server.service.port=8078
jack.server.admin.port=8079
文件权限问题
编译提示No Jack server running. Try 'jack-admin start-server'
查看$HOME/.jack-server/logs/中的log:
com.android.jack.server.api.v01.ServerException: './config.properties' musthave permission rw------- but have rwx------
Caused by: java.io.IOException: './config.properties' must have permissionrw------- but have rwx------
... 2 more
发现是配置文件的权限不对造成的,把文件$HOME/.jack-server/config.properties的权限由rwx改为rw即可解决问题。
SSL报错
编译提示
Communication error with Jack server (35), try 'jack-diagnose' or see Jack server log SSL error when connecting to the Jack server. Try 'jack-diagnose' SSL error when connecting to the Jack server. Try 'jack-diagnose'
解决方法:
在/etc/java-8-openjdk/security/java.security中取消TLSv1, TLSv1.1 禁用
修改前
jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
include jdk.disabled.namedCurves
修改后
jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA, \
DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL, \
include jdk.disabled.namedCurves
.jack-server访问问题
$HOME/.jack-server/logs日志如下
com.android.jack.server.api.v01.ServerException: '.' is not owned by 'root' but by 'user'
at com.android.jack.server.JackServerImpl.run(JackServerImpl.java:65)
at com.android.jack.launcher.ServerLauncher$3.run(ServerLauncher.java:391)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.io.IOException: '.' is not owned by 'root' but by 'user'
at com.android.jack.server.JackHttpServer.getCurrentUser(JackHttpServer.java:1040)
at com.android.jack.server.JackHttpServer.<init>(JackHttpServer.java:377)
at com.android.jack.server.JackServerImpl.run(JackServerImpl.java:61)
... 2 more
原因是 $HOME/.jack-server的owner和group都应该是root,却变成了user
修改如下:
chown -R root /home/user/.jack-server
chgrp -R root /home/user/.jack-server