关于andriod:JAVA升级导致Android编译时Jack-server出错

43次阅读

共计 4723 个字符,预计需要花费 12 分钟才能阅读完成。

记录下 Java 8 policy tool 降级导致编译安卓时 Jack server 出错,次要是其中的 java 启动参数 -Djavax.net.debug=ssl 调试办法,当前遇到相似问题好疾速的解决。
另外仅 Android6~Android8.1 应用 jack 编译,8.1 之后已废除该工具,详情可看下 https://source.android.google…

背景

大家的电脑降级后,编译安卓 8.1 的编译出错,出错为

communication error with Jack server (35), try 'jack-diagnose' or see Jack server log
curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to localhost:8077 

而后就解决吧,后果依照网上之前呈现问题的计划解决都不行,这个也节约了大家好几天的工夫。
我之前是依照笨办法比照替换解决的,之后网上查资料才找到调试办法(原网页已不记得是哪个了,见谅),如果按该办法调试,应该能够很快就能够解决问题。

调试办法

jack server 的日志寄存在 ~/.jack-server/logs , 然而日志里没有谬误日志。

通过剖析 prebuilts/sdk/tools/jack-admin,发现能够用 curl -v https://127.0.0.1:8076 命令去测试,这样不便疾速调试。
然而呢就是 https 连贯, 第二阶段握不上手,

# 连贯 jack 端口握手失败
$ curl -v https://127.0.0.1:8076 
*   Trying 127.0.0.1:8076...
* TCP_NODELAY set
* Connected to 127.0.0.1 (127.0.0.1) port 8076 (#0)
...
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to 127.0.0.1:8076 
* Closing connection 0
curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL in connection to 127.0.0.1:8076 

失常状况下,第一阶段 Client hello 后会有第二阶段 Server hello, 但就是没呈现这样的语句

TLS handshake, Server hello (2):

应用不同的 tls 版本也同样的后果

# 应用不同 tls 版本连贯
for args in "tlsv1.3" "tlsv1.2" "tlsv1" ;do curl -v --$args https://127.0.0.1:8076;echo ----; done

反正折腾了一大圈,到解决该问题后,其实正确的调试形式应该是,
剖析 jack-admin 里 start-server 和日志,
本人手动启动,其中要害的是增加 -Djavax.net.debug=ssl 调试参数,当然 ssl 也可改为 all,这样日志会全一些。

# 手动启动 jack-server 并加调试参数

$ prebuilts/sdk/tools/jack-admin kill-server # 留神须要把之前曾经起来的 jack server 杀了
# 增加 -Djavax.net.debug=ssl
$ cd ~/.jack-server
$ java -XX:MaxJavaStackTraceDepth=-1 -Djavax.net.debug=ssl -Djava.io.tmpdir=/tmp -Dfile.encoding=UTF-8 -cp /home/atom/.jack-server/launcher.jar com.android.jack.launcher.ServerLauncher

这个时候再用命令行 curl… 去连贯在终端就会呈现谬误日志 protocol is disabled or cipher suites are inappropriate

"throwable" : {javax.net.ssl.SSLHandshakeException: No appropriate protocol (protocol is disabled or cipher suites are inappropriate)
    at sun.security.ssl.HandshakeContext.<init>(HandshakeContext.java:171)
    at sun.security.ssl.ServerHandshakeContext.<init>(ServerHandshakeContext.java:62)
    at sun.security.ssl.TransportContext.kickstart(TransportContext.java:220)

顺着这个谬误日志去网上搜寻其实就能够很快解决问题了。

修复办法

修复办法倒想着有几个,可抉择本人喜爱的计划,有别的计划也欢送评论。

  • 使能 TLSv1

将禁用的 TLSv1 启用,最好也启用 SSLv3, 反正源码里写的是 SSLv3。
(对于 TLS, SSL 区别这些可网上查查,这里不列出)

# 应用 TLSv1
/usr/lib/jvm/java-8-openjdk-amd64/jre/lib/security
--- java.security 2021-04-30 13:44:46.922768831 +0800
+++ java.security.NG 2021-04-30 13:31:38.754028864 +0800
@@ -716,7 +716,7 @@
 #
 # Example:
 #   jdk.tls.disabledAlgorithms=MD5, SSLv3, DSA, RSA keySize < 2048
-jdk.tls.disabledAlgorithms=SSLv3, TLSv1.1, RC4, DES, MD5withRSA, \
+jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA, \
  • 应用安卓源码自带 JDK

可通过设置 JAVA_HOME 等形式,应用自带的 JDK prebuilts/jdk/jdk8/。
事实上,安卓后续的版本都用的自带的 JDK。

  • 批改源码

jack 源码在 https://android.googlesource…. , 须要想方法拜访。
最新分支应该为 ub-jack,17 年就不再保护了。

# 下载 jack 源码
$ git clone https://android.googlesource.com/toolchain/jack -b ub-jack --depth 1

批改的源码示例:

---
 .../android/jack/server/JackHttpServer.java   | 20 ++++++++++++++++++-
 1 file changed, 19 insertions(+), 1 deletion(-)

diff --git a/server/jack-server/src/com/android/jack/server/JackHttpServer.java b/server/jack-server/src/com/android/jack/server/JackHttpServer.java
index 4e5e75c3..7aa602ee 100644
--- a/server/jack-server/src/com/android/jack/server/JackHttpServer.java
+++ b/server/jack-server/src/com/android/jack/server/JackHttpServer.java
@@ -1391,6 +1391,7 @@ public class JackHttpServer implements HasVersion {
     FileInputStream keystoreServerIn = null;
     FileInputStream keystoreClientIn = null;
     SSLContext sslContext = null;
+    String[] httpsProtocols = {"TLSv1.3", "TLSv1.2", "TLSv1.1", "TLSv1", "SSLv3"};
 
     try {File keystoreServerFile = new File(serverDir, KEYSTORE_SERVER);
@@ -1416,12 +1417,29 @@ public class JackHttpServer implements HasVersion {TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
       tm.init(keystoreClient);
 
-      sslContext = SSLContext.getInstance("SSLv3");
+      logger.log(Level.INFO, "Java version" + System.getProperty("java.version"));
+      logger.log(Level.INFO, "Supported protocols" + Arrays.toString(SSLContext.getDefault().getSupportedSSLParameters().getProtocols()));
+      for (String protocol : httpsProtocols) {
+        try {+          sslContext = SSLContext.getInstance(protocol);
+        } catch (NoSuchAlgorithmException e) {
+          continue;
+        }
+        logger.log(Level.INFO, "Found protocols" + protocol);
+        break;
+      }
+
+      if (sslContext == null) {+        throw new NoSuchAlgorithmException();
+      }
+
       sslContext.init(keyManagerFactory.getKeyManagers(), tm.getTrustManagers(), null);
     } catch (IOException | KeyStoreException | NoSuchAlgorithmException | CertificateException
         | UnrecoverableKeyException | KeyManagementException | CannotCreateFileException
         | CannotChangePermissionException e) {throw new ServerException("Failed to setup ssl context", e);
+    } catch (Exception e) {+      logger.log(Level.INFO, "Ssl error" + e);
     } finally {if (keystoreClientIn != null) {
         try {
-- 
2.31.1

之后把 prebuilts/sdk/tools/Android.mk 里 jack 相干的去掉后,编译 jack-server 源码,
替换 prebuilts/sdk/tools/jack-server-4.11.ALPHA.jar ~/.jack-server/server-*.jar
随后 jack-admin kill-server,再编译安卓即可失常。

正文完
 0