Android7.0 配置JACK支持多用戶同時編譯


# Android7.0 配置JACK支持多用戶同時編譯

reference:

背景

需要在一個Android7平台上進行有關的工作,但是編譯的時候發現有問題。記錄一下。因為和同事共用一台服務器,因為他的編譯沒問題;而我的編譯沒成功。

在網上收集了各方的資料,再結合自己的經驗,終於解決了這個問題。

介紹

Android7.0(也就是Android N)以上默認使用JACK編譯器而不再使用openjdk了。

Android7.0系統編譯工具鏈使用了全新的Jack server來取代以往的編譯器工具

Jack is a new Android toolchain that compiles Java source into Android dex bytecode. It replaces the previous Android toolchain, which consists of multiple tools, such as javac, ProGuard, jarjar, and dx.

然而,在 2017 年 3 月 14 日公告發布之后,Jack 工具鏈已被棄用。Jack 是 Android 6.0–8.1 的默認 Android 編譯工具鏈

當你編譯Android時,只需使用標准的makefile命令執行即可。當第一次執行編譯時,會在你的機器上啟動一個jack編譯服務: 這個服務大大提高了編譯速度,因為它避免了啟動一個新的JVM,加載Jack代碼,初始化Jack和每次編譯都要預制JIT,即使在很小的編譯過程中,它也很好的節省了時間。

這個服務也是一個控制Jack並行編譯的短期解決方案。它可以限制編譯的並行數據量,這樣也可以避免內存硬盤溢出問題。

當一段時間沒有編譯活動,Jack 服務會自動關閉,默認它在本地使用了兩個TCP端口,且不對外公開。它也提供了很多參數來配置Jack服務,例如並行數量,timeout時間,端口等等。

但是,如果不做修改時,同一台linux服務器上不允許不同用戶同時進行andorid7.0的編譯,體現為:第二個開始編譯的用戶無法正常啟動jack server,且jack server居然不能關閉

雖然JACK文檔中有說提供一些宏,理論上只要設置宏為對應的值就可以關閉,但實測發現無效。

報錯:Communication error with Jack server (58), try 'jack-diagnose' or see Jack server log

原因:JACK編譯器不支持多用戶同時編譯,其他用戶在編譯,端口被占用。

解決方法

以下是自己試過的做法。

修改$HOME/.jack-settings$HOME/.jack-server/config.properties中的端口號,方可支持多用戶同時編譯。

注意事項:

0、編譯成功的用戶的配置才允許修改。(編譯失敗的用戶修改會遇到很多問題)

1、兩個文件中的端口號必須一致

2、修改后的端口號必須是沒有被使用的。

新用戶刪除目錄

編譯失敗的用戶上,刪除有關配置。

這樣的做法是為了避免 直接修改 $HOME/.jack-settings 造成的種種問題。

sudo rm $HOME/.jack-settings $HOME/.jack-server/ -rf

舊用戶修改配置

編譯成功的用戶上,修改以下配置:

  • $HOME/.jack-settings
# Server settings
SERVER_HOST=127.0.0.1
SERVER_PORT_SERVICE=8776 # Port A
SERVER_PORT_ADMIN=8777   # Port B

# Internal, do not touch
SETTING_VERSION=4
  • $HOME/.jack-server/config.properties
#Fri Nov 02 14:18:58 CST 2018
jack.server.idle=180
jack.server.max-service.by-mem=1\=2147483648\:2\=3221225472\:3\=4294967296
jack.server.shutdown=21600
jack.server.time-out=7200
jack.server.max-jars-size=104857600
jack.server.service.port=8776 # Port A
jack.server.admin.port=8777   # Port B
jack.server.config.version=4
jack.server.max-service=4
jack.server.deep-idle=900

重啟機器

為了方便,直接重啟機器更好。

修改以后,重啟服務。

out/host/linux-x86/bin/jack-admin kill-server 
out/host/linux-x86/bin/jack-admin start-server
# 或者
./prebuilts/sdk/tools/jack-admin kill-server
./prebuilts/sdk/tools/jack-admin start-server 

如果出現下列錯誤:

Launching Jack server java -XX:MaxJavaStackTraceDepth=-1 -Djava.io.tmpdir=/tmp -Dfile.encoding=UTF-8 -XX:+TieredCompilation -cp /home/schips/.jack-server/launcher.jar com.android.jack.launcher.ServerLauncherJack server failed to (re)start, try 'jack-diagnose' or see Jack server log
No Jack server running. Try 'jack-admin start-server'
No Jack server running. Try 'jack-admin start-server'

可以使用./prebuilts/sdk/tools/jack-admin dump-report將日志dump出來。

$ ./prebuilts/sdk/tools/jack-admin dump-report
Creating report...
Dumping Jack server stacks...
Getting current user id...
Listing Jack server process...
Listing process using Jack server service port 8776...
Listing process using Jack server admin port 8777...
Collecting Jack client configuration...
Listing Jack server installation dir...
Collecting curl version...
Collecting curl connection info...
Collecting Jack server stats...
Zipping Jack server installation dir except keys and certificates...
Jack server report saved in 'jack-report.254730.zip'. Consider reviewing content before publishing.

會得到 jack-report.xx.zip,解壓以后,再根據具體的原因對report.xxxxx.txt進行排查:

錯誤原因 解決
Protocol https not supported or disabled in libcurl 安裝libcurl
connect to 127.0.0.1 port 8777 failed: Connection refused 修改對應的文件權限,chmod 600 $HOME/.jack-server/config.properties $HOME/.jack-settings

也可以根據文件 $HOME/.jack-server/logs/jack-server-0-*.log:查看錯誤原因

10:26:40.898:SEVERE: com.android.jack.launcher.ServerLauncher: Server 1 Exception
 com.android.jack.server.api.v01.ServerException: './config.properties' **musthave permission rw------- but have rwx------**
  atcom.android.jack.server.JackServerImpl.run(JackServerImpl.java:65)
  atcom.android.jack.launcher.ServerLauncher$3.run(ServerLauncher.java:391)
  atjava.lang.Thread.run(Thread.java:745)
 Caused by: java.io.IOException: './config.properties' must have permission rw------- but have rwx------
  at com.android.jack.server.JackHttpServer.checkAccess(JackHttpServer.java:696)
  atcom.android.jack.server.JackHttpServer.loadConfig(JackHttpServer.java:513)
  atcom.android.jack.server.JackHttpServer.<init>(JackHttpServer.java:379)
  at com.android.jack.server.JackServerImpl.run(JackServerImpl.java:61)
  ... 2 more

發現是配置文件的權限不對造成的,把文件$HOME/.jack-server/config.properties的權限由rwx改為rw即可解決問題。

chmod 600 $HOME/.jack-server/config.properties $HOME/.jack-settings

另外一個權限問題:那個目錄不應該由root以外的其他用戶持有。

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

解決方法:

sudo chown root  $HOME/.jack-server/
sudo chgrp root  $HOME/.jack-server/

重新編譯

之前編譯失敗的用戶,重新編譯試試。如果成功,再如同編譯成功的用戶修改配置一樣,再將自己的端口號改掉。

此后,如果有新的用戶需要編譯,以這個方法重試即可。

附錄:網友的調試記錄

嘗試關閉JACK,但發現失敗

1),當在板型目錄中的BoardConfig.mk中添加ANDROID_COMPILE_WITH_JACK:=false時,編譯會出錯:

ninja: error:  'out/target/common/obj/APPS/ActSensorCalib_intermediates/with-local/classes.dex', needed by  'out/target/common/obj/APPS/ActSensorCalib_intermediates/classes.dex',  missing and no known rule to make it

make[1]: *** [ninja_wrapper] Error 1

2),當在板型目錄中的BoardConfig.mk中添加DEFAULT_JACK_ENABLED := disabled時,仍然不能關閉JACK,都會報錯:

[ 34% 13188/37803] Ensure Jack server is installed and started

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 jackprebuilts/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 /home/test/.jack-settings

Installing jack server in "/home/test/.jack-server"

Communication error with Jack server (58), try 'jack-diagnose' or see Jack server log

Failed to contact Jack server: Problem reading /home/test/.jack-server/client.pem. Try 'jack-diagnose'

Failed to contact Jack server: Problem reading /home/test/.jack-server/client.pem. Try 'jack-diagnose'

[ 34% 13188/37803] Compiling SDK Stubs...tubs_current_intermediates/classes.jar

Note: Some input files use or override a deprecated API.

Note: Recompile with -Xlint:deprecation for details.

Note: Some input files use unchecked or unsafe operations.

Note: Recompile with -Xlint:unchecked for details.

[ 34% 13188/37803] target SharedLib: l...bLLVM_intermediates/LINKED/libLLVM.so)

ninja: build stopped: subcommand failed.

make[1]: *** [ninja_wrapper] Error 1

make[1]: Leaving directory `/home/test/700E/android/android'

3),嘗試通過設置ANDROID_FORCE_JACK_ENABLED := disabled來進行關閉JACK ,編譯也報錯,跟1)一樣的錯誤:

ninja: warning: multiple rules generate  out/target/product/s900_RY_VR/system/xbin/su. builds involving this  target will not be correct; continuing anyway [-w dupbuild=warn]

ninja: error:  'out/target/common/obj/APPS/ActSensorCalib_intermediates/with-local/classes.dex', needed by  'out/target/common/obj/APPS/ActSensorCalib_intermediates/classes.dex',  missing and no known rule to make it

make[1]: *** [ninja_wrapper] Error 1

修改配置

網上有很多人反映這個問題,https://code.google.com/p/android/issues/detail?id=194027,但是目前沒有有效的解決方案,最可能的辦法是從2個方面嘗試:

1),這個issue有人說是需要增加RAM:I was on VitualMachine when I had the error. And the fix was to increase the RAM,不過他是在虛擬機上,我們的應該跟RAM無關;

2),通過修改配置文件$HOME/.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

通過實驗發現,單獨修改配置文件$HOME/.jack-settings中的端口號沒有效果,jack server一直啟動失敗,提示端口被占用:

com.android.jack.server.api.v01.ServerException: Problem while opening service port

	at com.android.jack.server.JackHttpServer.start(JackHttpServer.java:611)
	at com.android.jack.server.JackServerImpl.run(JackServerImpl.java:62)
	at com.android.jack.launcher.ServerLauncher$3.run(ServerLauncher.java:391)
	at java.lang.Thread.run(Thread.java:745)
	
Caused by: java.net.BindException: **Address already in use**

	at sun.nio.ch.Net.bind0(Native Method)
	at sun.nio.ch.Net.bind(Net.java:433)
	at sun.nio.ch.Net.bind(Net.java:425)
	at sun.nio.ch.ServerSocketChannelImpl.bind(ServerSocketChannelImpl.java:223)
	at sun.nio.ch.ServerSocketAdaptor.bind(ServerSocketAdaptor.java:74)
	at com.android.jack.server.ServerParameters.openSocket(ServerParameters.java:88)
	at com.android.jack.server.ServerParameters.getServiceSocket(ServerParameters.java:67)
	at com.android.jack.server.JackHttpServer.start(JackHttpServer.java:605)

3),需要同時修改 $HOME/.jack-server/config.properties 中的端口號,方才有效,可以在別的用戶啟動了jack server的情況再啟動另一個jack server,這樣就可以實現多用戶同時編譯,親測有效:

#Tue Sep 13 17:44:41 CST 2016

jack.server.max-jars-size=104857600
jack.server.max-service=4
jack.server.service.port=8076  # 修改這里
jack.server.max-service.by-mem=1\=2147483648\:2\=3221225472\:3\=4294967296
jack.server.admin.port=8077    # 修改這里

jack.server.config.version=2

jack.server.time-out=7200  

總結一下解決方案就是:

同時修改$HOME/.jack-settings$HOME/.jack-server/config.properties中的端口號,方可支持多用戶同時編譯。

補充一下后來編譯遇到的錯誤的解決方法:

錯誤提示:

[ 8% 1/12] Ensure Jack server is installed and started

再試了一次還是報錯:

FAILED:/bin/bash -c "(prebuilts/sdk/tools/jack-admin  install-serverprebuilts/sdk/tools/jack-launcher.jar  prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar2>&1 || (exit 0) )  &&(JACK_SERVER_VM_ARGUMENTS=\"-Dfile.encoding=UTF-8-XX:+TieredCompilation\" prebuilts/sdk/tools/jack-admin start-server2>&1 || exit 0 )  && (prebuilts/sdk/tools/jack-admin updateserver  prebuilts/sdk/tools/jack-server-4.8.ALPHA.jar 4.8.ALPHA 2>&1  ||exit 0 ) && (prebuilts/sdk/tools/jack-admin update  jackprebuilts/sdk/tools/jacks/jack-2.28.RELEASE.jar 2.28.RELEASE || exit 47;prebuilts/sdk/tools/jack-admin update  jackprebuilts/sdk/tools/jacks/jack-3.36.CANDIDATE.jar 3.36.CANDIDATE ||  exit 47;prebuilts/sdk/tools/jack-admin update  jackprebuilts/sdk/tools/jacks/jack-4.7.BETA.jar 4.7.BETA || exit 47 )"
 Jack server already installed in"/home/local/ACTIONS/songzhining/.jack-server"
 Launching Jack server java -XX:MaxJavaStackTraceDepth=-1  -Djava.io.tmpdir=/tmp-Dfile.encoding=UTF-8 -XX:+TieredCompilation  -cp/home/local/ACTIONS/songzhining/.jack-server/launcher.jarcom.android.jack.launcher.ServerLauncher
 Jack server failed to (re)start, try 'jack-diagnose' or see Jack server log
 No Jack server running. Try 'jack-admin start-server'
 No Jack server running. Try 'jack-admin start-server'
 ninja: build stopped: subcommand failed.
 make[1]: *** [ninja_wrapper] Error 1

解決方案:

通過查看文件 $HOME/.jack-server/logs/jack-server-0-0.log

10:26:40.898:SEVERE: com.android.jack.launcher.ServerLauncher: Server 1 Exception
 com.android.jack.server.api.v01.ServerException: './config.properties' **musthave permission rw------- but have rwx------**
  atcom.android.jack.server.JackServerImpl.run(JackServerImpl.java:65)
  atcom.android.jack.launcher.ServerLauncher$3.run(ServerLauncher.java:391)
  atjava.lang.Thread.run(Thread.java:745)
 Caused by: java.io.IOException: './config.properties' must have permission rw------- but have rwx------
  at com.android.jack.server.JackHttpServer.checkAccess(JackHttpServer.java:696)
  atcom.android.jack.server.JackHttpServer.loadConfig(JackHttpServer.java:513)
  atcom.android.jack.server.JackHttpServer.<init>(JackHttpServer.java:379)
  at com.android.jack.server.JackServerImpl.run(JackServerImpl.java:61)
  ... 2 more

發現是配置文件的權限不對造成的,把文件$HOME/.jack-server/config.properties的權限由rwx改為rw即可解決問題。

chmod 600 $HOME/.jack-server/config.properties $HOME/.jack-settings


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM