编译Android时禁用Jack Server

本文的代码与方法,基于Android O(8.0)。

简介

Jack Server,是Jack/Jill工具链中的一个组成部分。 启动一个独立于编译主进程的Server进程,执行Jack工具链的编译过程,与主进程通过端口进行网络通信。

需要启用Jack工具链,而又要禁用Jack Server的情况,是非常少的。 很不幸,孤却遇到了。

单独关闭Jack Server

prebuilts/sdk/tools/jack_server_setup.mk中,可以看到:

ifdef JACK_SERVER
ifneq ($(JACK_SERVER),true)
jack_server_disabled=true
endif
endif

prebuilts/sdk/tools/jack中:

JACK_SERVER=${JACK_SERVER:=true}
JACK_MAIN_COMMAND=${JACK_MAIN_COMMAND:="java -Djava.io.tmpdir=$TMPDIR -Dfile.encoding=UTF-8 -XX:+TieredCompilation"}
JACK_REPOSITORY=${JACK_REPOSITORY:=}


#
# If not in server mode, exec jack
#
if [ "$JACK_SERVER" != "true" ]; then
  if [ -z "$JACK_REPOSITORY" ]; then
    echo "Running Jack without Jack server requires definition of JACK_REPOSITORY" >&2
    abort
  fi
  JACK_JAR=$JACK_REPOSITORY/jack-$JACK_VERSION.jar
  if [ ! -r "$JACK_JAR" ]; then
    echo "Jack jar \"$JACK_JAR\" is not readable" >&2
    abort
  fi


  exec $JACK_MAIN_COMMAND -jar $JACK_JAR "$@"
  echo "Cannot succeed to launch Jack without Jack server" >&2
  abort
fi

为了让JACK_JAR=$JACK_REPOSITORY/jack-$JACK_VERSION.jar这句得到一个可执行的jar, JACK_REPOSITORY需要被设置成prebuilts/sdk/tools/jack/jacks

所以,单独关闭Jack Server,只需要设置两个环境变量即可。

make 'JACK_SERVER:=false' 'JACK_REPOSITORY:=prebuilts/sdk/tools/jack/jacks'

关闭已运行的Server

关闭已运行的Jack Server,并不能阻止在下次编译时自动启动。 设定编译总开关,还得用上面给出的方法。

而有时,比如编译完成后,需要单独关闭已运行的Server。 因为它占用了大量内存,而又拒不释放!

查看已运行的Server:

jack-admin list-server

关闭已运行的Server:

jack-admin stop-server

jack-admin命令,是编译过程中安装在out/host/linux-x86/bin目录下的。 所以,在启用Jack的make结束后,才可以使用。 未配置环境,或未make完毕时,也可以直接访问prebuilts/sdk/tools/jack-admin来使用。

其它用法,可以查看该命令的帮助。

参考

孤之前有介绍过《编译Android时禁用Jack》,是指禁用整个Jack/Jill工具链。


相关笔记