编译Android时禁用Jack
2017-07-06 18:18:52 +08
字数:815
标签:
Android
本文的代码与方法,基于Android O(8.0)。
问题 ¶
根据Android官网的介绍《使用 Jack 编译》,似乎Jack工具链是不错的东西。
Jack 是一种新型 Android 工具链,用于将 Java 源代码编译成 Android dex 字节码。
它取代了之前由 javac、ProGuard、jarjar 和 dx 等多种工具组成的 Android 工具链。
Jack 工具链具有以下优势:
完全开放源代码
它是在 AOSP 中提供的;并且欢迎用户贡献资源。
提高编译速度
Jack 提供以下具体支持来减少编译时间:dex 预处理、增量编译和 Jack 编译服务器。
支持压缩、混淆、重新打包和多 dex 处理
不再需要使用单独的软件包(如 ProGuard)
实际情况是,在单次编译中,Jack的优势很难体现。
而且,如果不手动停止Jack Server,它还会在后台一直运行,占用内存不放。
此外,对一些额外工具链的支持也较差,如静态代码分析。
禁用 ¶
在AOSP的master分支,以及Android O及以后版本,Android提供了禁用的支持。
在编译项目时,传入一个变量,即可实现禁用。
make 'ANDROID_COMPILE_WITH_JACK:=false'
原理 ¶
Android的全局编译工具与配置,都在项目根目录的build子目录下。
在其中,可以发现LOCAL_JACK_ENABLED,是决定一个模块是否使用Jack的关键。
而在build/make/core/clear_vars.mk可以发现,
这个值的全局默认值是DEFAULT_JACK_ENABLED。
在build/make/core/config.mk中,可以发现一个开关。
ifeq ($(ANDROID_COMPILE_WITH_JACK),true)
DEFAULT_JACK_ENABLED:=full
else
DEFAULT_JACK_ENABLED:=
endif
而最终,开关是在build/make/combo/javac.mk初始化。
ifndef ANDROID_COMPILE_WITH_JACK
# Defines if compilation with jack is enabled by default.
ANDROID_COMPILE_WITH_JACK := true
endif
所以,只需要在执行make时,初始化ANDROID_COMPILE_WITH_JACK为false,即可实现全局禁用。
参考 ¶
VCS:git clone https://android.googlesource.com/toolchain/jack
另外,关于Jack Server的禁用,详见《编译Android时禁用Jack Server》。