Android 7.0工程之预编译jack服务器

/*****************************************************************************
 * Author : Elvins Fu    yeyecheng_93@163.com
 *
 * Info : Boway Inc,(C) 2016-11-28, All rights revseved.
 *
 * Description : This document is summed up by the author for that the company of Boway’s   
 * R&D install the Java running environment or Java development kit and build the project on   
 * Android 7.0 Platform success.
 *
 * This context describes that Android 7.0 Environment preview build tools has been replace       
 * openjdk-7-jre tools with jack server.
****************************************************************************/


1.Android 7.0工程的环境需要加载openJDK 8 ,虽然上篇文档已经描述了openjdk-8的安装方法,但通常和很多ubuntu主机的Jack -server是没有和Android7.0的工程Jack -server相互交互的,Android的工程会提供相应的压缩文件去运行jack-server服务,若要顺利的编译工程,则要ubuntu主机的Jack -server和Android的工程Jack -server相互交互。


在编译过程中会有如下错误信息。
[6% 1127/18030] 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 
--------------------------------------
No Jack server running. Try 'jack-admin start-server'
No Jack server running. Try 'jack-admin start-server'


bule@sky:~/**/jianwen.fu/V65_An7/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/prayasm/.jack-server/launcher.jar com.android.jack.launcher.ServerLauncher
Jack server failed to (re)start, try 'jack-diagnose' or see Jack server log




2.ubuntu主机的本地目录的




注意在服务器192.168.2.188主目录不存在jack-server,我以自己的主机模拟192.168.2.188环境,下面的命令作为参考;
找个已安装openjdk8环境的Ubuntu主机,把文件拷贝过来,这样的方法比以前编译openjdk8的方法更快速,但依赖关系并不好,风险度高。
------------------------------------
2079 scp -r /etc/java-8-openjdk/ bule@192.168.2.244:/etc/
(先传输该文件夹,下面的文件夹中有对此文件的软连接文件)
2075 scp -r /usr/lib/jvm/java-1.8.0-openjdk-amd64 bule@192.168.2.244:/usr/lib/jvm
2077 scp -r /usr/lib/jvm/java-8-openjdk-amd64/ bule@192.168.2.244:/usr/lib/jvm


如服务器192.168.2.188,Ubuntu用户主目录无.jack .jack-server .jack-setting,那么在192.168.1.15的Ubuntu主机中执行以下命令,边将文件传输到了192.168.2.244主机上。


2081 scp -r .jack-server/ bule@192.168.2.244:.jack-server
2082 scp -r .jack bule@192.168.2.244:.jack
2086 scp -r .jack-settings bule@192.168.2.244:.jack-settings
-------------------------------------------------------------
将openjdk写入系统的环境和配置编译选项中
2040 sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-openjdk-amd64/bin/java
2041 sudo update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-8-openjdk-amd64/bin/java 1081
2042 sudo update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-8-openjdk-amd64/bin/javac 1081
2043 sudo update-alternatives --install /usr/bin/javap javap /usr/lib/jvm/java-8-openjdk-amd64/bin/javap 1081
2044 sudo update-alternatives --install /usr/bin/javah javah /usr/lib/jvm/java-8-openjdk-amd64/bin/javah 1081
2045 sudo update-alternatives --install /usr/bin/jar jar /usr/lib/jvm/java-8-openjdk-amd64/bin/jar 1081
2048 sudo update-alternatives --install /usr/bin/javadoc javadoc /usr/lib/jvm/java-8-openjdk-amd64/bin/javadoc 1081
------------------------------
转换为openjdk-8-jre的java环境


2050 sudo update-alternatives --config javadoc 
2051 sudo update-alternatives --install /usr/bin/java java 
2052 sudo update-alternatives --config java
2053 sudo update-alternatives --config javac
2054 sudo update-alternatives --config javap
2055 sudo update-alternatives --config javah
2056 sudo update-alternatives --config javadoc 
2057 sudo update-alternatives --config jar










3.在Android 7.0的工程中进行编译之前,运行如下命令,进行交互
bule@sky:~/workspace/jianwen.fu/jianwen.fu/V65_An7/prebuilts/sdk/tools$
 jack-admin start-server
 jack-admin kill-server
 jack-admin list-server
 jack-admin uninstall-server
 mm -j32 showcommands &> mm.out
 jack-admin install-server jack-launcher.jar  jack-server-4.8.ALPHA.jar
 jack-admin dump-report
 jack-admin dump-re




以上环境配置成功后,ubuntu主机的Jack -server和Android的工程Jack -server相互交互,Android 7.0能够成功编译.


4.参考信息
http://source.android.com/source/initializing.html.
http://source.android.com/source/jack.html
https://code.google.com/p/android/issues
https://android.googlesource.com/platform/prebuilts/sdk/+/master/tools/README-jack-server.md
https://code.google.com/p/android/issues/detail?id=194027#c14


5.Jack server的分析


当你编译Android时,你不需要修改任何内容。 Jack是Andriod M的默认编译工具。只需使用标准的makefile命令执行即可。
当第一次执行jack时,它会在你的机器上启动一个jack编译服务:
这个服务大大提高了编译速度,因为它避免了启动一个新的JVM,加载Jack代码,初始化Jack和每次编译都要预制JIT,即使在很小的编译过程中,它也很好的节省了时间(例如,在incremental模式)
这个服务也是一个控制Jack并行编译的短期解决方案。它可以限制编译的并行数据量,这样也可以避免内存硬盘溢出问题
当一段时间没有编译活动,Jack 服务会自动关闭,默认它在本地使用了两个TCP端口,且不对外公开。它也提供了很多参数来配置Jack服务,例如并行数量,timeout时间,端口等等。只修改$HOME/.jack 文件即可。
$HOME/.jack 文件
$HOME/.jack 文件包含了Jack服务的设置变量
以下是现在可用的变量说明:
SERVER=true 启用Jack server SERVER_PORT_SERVICE=8072 编译服务TCP端口. SERVER_PORT_ADMIN=8073 管理服务TCP端口 SERVER_COUNT=1 目前没用 SERVER_NB_COMPILE=4 最大编译并行数 SERVER_TIMEOUT=60 空闲时间分钟数据,无编译时间超出该时间,将自动关闭服务 SERVER_LOG=${SERVER_LOG:=$SERVER_DIR/jack-$SERVER_PORT_SERVICE.log} 服务器日志存放目录,可被环境变量替换 JACK_VM_COMMAND=${JACK_VM_COMMAND:=java} 默认启动JVM的命令,可被环境变量替换 
Jack 问题
1.你的电脑没有响应或者编译过程出现内存溢出
你可以减少SERVER_NB_COMPILE数量,来减少编译占用内存。
1.Cannot launch background server
很有可能时TCP端口被占用,试着修改SERVER_PORT_SERVICE和SERVER_PORT_ADMIN参数
Jack 限制
?Jack server 默认是单用户的,所以只能同时被一个用户使用。如果需要多个用户同时使用,请每个人都使用不同的端口。也可以通过设置SERVER=false 禁用Jack Server
?CTS 编译会变慢.
?二进制码有关的工具将不支持, 例如 JaCoCo.
使用Jack特性
Jack支持JDK1.7,并且整合了一下特性
Predexing
当生成Jack包时,dex包将会被生成,并存储到Jack包中,这个过程就是pre-dex,在编译过程中,Jack会为每一个包使用pre-dex.
所有的包都将pre-dexed
限制:
当前版本,如果设置了代码压缩/混淆/重新打包,Jack将不会重用pre-dex 包




6.Jack-server多用户编译实现


Android7.0(也就是Android N)上默认使用JACK编译器而不再使用openjdk了,但发现JACK不是很好用,比如最大的一个问题就是,同一台linux服务器上不允许不同用户同时进行andorid7.0的编译,原因就是后面开始编译的用户无法正常启动jack server,而jack server居然不能关闭,虽然JACK文档中有说提供一些宏,只要设置宏为对应的值就可以关闭,但实测发现无效,关闭不了,




尝试解决,网上有很多人反映这个问题,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一直启动失败,提示端口被占用:

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 (修改上面红色这2行,比如改为8086,8087等)


总结一下解决方案就是:
同时修改$HOME/.jack-settings和$HOME/.jack-server/config.properties中的端口号(比如都改为8086/8087),方可支持多用户同时编译。
目前可以先用这个方法解决问题,后面看google是否会对JACK做优化。有任何问题,请大家拍砖!


---------------------------------------------------------------------------------------------------
补充一下后来编译遇到的错误的解决方法: 
错误提示:
 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:

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即可解决问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值