Jack은 Android 6.0 - 8.1용 기본 Android 빌드 도구 체인입니다.
Jack은 Java 소스를 Android dex 바이트코드로 컴파일하는 Android 툴체인입니다. Jack을 사용하기 위해 다르게 수행할 필요는 없습니다. 표준 makefile 명령을 사용하여 트리나 프로젝트를 컴파일하면 됩니다. Android 8.1은 Jack을 사용하는 마지막 릴리스입니다.
잭 소개
Jack은 그림 1과 같이 작동합니다.
그림 1. 잭 개요.
잭 라이브러리 형식
Jack에는 라이브러리에 대해 사전 컴파일된 dex 코드가 포함된 자체 .jack
파일 형식이 있어 더 빠른 컴파일(pre-dex)이 가능합니다.
그림 2. Jack 라이브러리 파일 콘텐츠.
처녀
다음 그림에 표시된 것처럼 Jill 도구는 기존 .jar
라이브러리를 새 라이브러리 형식으로 변환합니다.
그림 3. 기존 .jar
라이브러리를 가져오는 워크플로우.
잭 컴파일 서버
Jack을 처음 사용하면 컴퓨터에서 로컬 Jack 컴파일 서버가 시작됩니다. 이 서버:
- 새 호스트 JRE JVM 실행, Jack 코드 로드, Jack 초기화 및 각 컴파일 시 JIT 워밍업을 방지하므로 본질적인 속도 향상이 가능합니다. 또한 소규모 컴파일(예: 증분 모드) 중에 매우 좋은 컴파일 시간을 제공합니다.
- 병렬 Jack 컴파일 수를 제어하는 단기 솔루션입니다. 서버는 병렬 컴파일 수를 제한하므로 컴퓨터 과부하(메모리 또는 디스크 문제)를 방지합니다.
Jack 서버는 컴파일 없이 유휴 시간이 지나면 자동으로 종료됩니다. localhost 인터페이스에서 두 개의 TCP 포트를 사용하며 외부에서는 사용할 수 없습니다. 모든 매개변수(병렬 컴파일 수, 시간 초과, 포트 번호 등)는 $HOME/.jack
파일을 편집하여 수정할 수 있습니다.
$HOME/.jack 파일
$HOME/.jack
파일에는 전체 bash 구문의 Jack 서버 변수에 대한 다음 설정이 포함되어 있습니다.
-
SERVER=true
Jack의 서버 기능을 활성화합니다. -
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 컴파일 문제 해결
문제 | 행동 |
---|---|
컴파일 중에 컴퓨터가 응답하지 않거나 메모리 부족 오류 로 인해 Jack 컴파일이 실패하는 경우 | $HOME/.jack 편집하고 SERVER_NB_COMPILE 더 낮은 값으로 변경하여 동시 Jack 컴파일 수를 줄이세요. |
백그라운드 서버를 시작할 수 없습니다 . 컴파일이 실패합니다. | 가장 가능성이 높은 원인은 컴퓨터에서 TCP 포트가 이미 사용되고 있기 때문입니다. $HOME/.jack ( SERVER_PORT_SERVICE 및 SERVER_PORT_ADMIN 변수)을 편집하여 포트를 변경합니다. 상황을 차단 해제하려면 $HOME/.jack 편집하고 SERVER false 로 변경하여 Jack 컴파일 서버를 비활성화합니다. 불행하게도 이로 인해 컴파일 속도가 크게 느려지고 로드 제어( make 의 -l 옵션)와 함께 make -j 실행해야 할 수도 있습니다. |
아무런 진행 없이 컴파일이 중단됩니다. | 상황을 차단 해제하려면 jack-admin kill-server 사용하여 Jack 백그라운드 서버를 종료한 다음 임시 디렉터리( /tmp 또는 $TMPDIR )의 jack-$USER 에 포함된 임시 디렉터리를 제거하세요. |
잭 로그 찾기
dist 대상으로 make
명령을 실행한 경우 Jack 로그는 $ANDROID_BUILD_TOP/out/dist/logs/jack-server.log
에 있습니다. 그렇지 않으면 jack-admin server-log
실행하여 로그를 찾을 수 있습니다. 재현 가능한 Jack 오류가 발생하는 경우 다음 변수를 설정하여 더 자세한 로그를 얻을 수 있습니다.
export ANDROID_JACK_EXTRA_ARGS="--verbose debug --sanity-checks on -D sched.runner=single-threaded"
표준 makefile 명령을 사용하여 트리(또는 프로젝트)를 컴파일하고 표준 출력 및 오류를 첨부합니다. 자세한 빌드 로그를 제거하려면 다음을 실행하세요.
unset ANDROID_JACK_EXTRA_ARGS
잭 제한 사항
- 기본적으로 Jack 서버는 컴퓨터에서 한 명의 사용자만 사용할 수 있습니다. 추가 사용자를 지원하려면 각 사용자에 대해 서로 다른 포트 번호를 선택하고 이에 따라
SERVER_NB_COMPILE
조정하십시오.$HOME/.jack
에서SERVER=false
설정하여 Jack 서버를 비활성화할 수도 있습니다. 현재vm-tests-tf
통합으로 인해 CTS 컴파일이 느립니다. JaCoCo 등의 바이트코드 조작 도구는 지원되지 않습니다.
잭 사용
Jack은 Java 프로그래밍 언어 1.7을 지원하며 아래 설명된 추가 기능을 통합합니다.
사전 덱싱
Jack 라이브러리 파일을 생성하면 라이브러리의 .dex
생성되어 .jack
라이브러리 파일 내에 pre-dex로 저장됩니다. 컴파일할 때 Jack은 각 라이브러리의 pre-dex를 재사용합니다. 모든 라이브러리는 사전 덱싱되어 있습니다.
그림 4. pre-dex가 포함된 Jack 라이브러리
Jack은 컴파일에 축소, 난독화 또는 재패키징이 사용되는 경우 라이브러리 pre-dex를 재사용하지 않습니다.
증분 컴파일
증분 컴파일은 마지막 컴파일 이후에 수정된 구성 요소(및 해당 종속성)만 다시 컴파일됨을 의미합니다. 변경 사항이 구성 요소 집합으로 제한되는 경우 증분 컴파일은 전체 컴파일보다 훨씬 더 빠를 수 있습니다.
증분 컴파일은 기본적으로 비활성화되어 있습니다(축소, 난독화, 재패키징 또는 multi-dex 레거시가 활성화되면 자동으로 비활성화됩니다). 증분 빌드를 활성화하려면 증분 빌드하려는 프로젝트의 Android.mk
파일에 다음 줄을 추가하세요.
LOCAL_JACK_ENABLED := incremental
축소 및 난독화
Jack은 ProGuard 구성 파일을 사용하여 축소 및 난독화를 활성화합니다.
일반적인 옵션은 다음과 같습니다.
-
@
-
-include
-
-basedirectory
-
-injars
-
-outjars
(1개의 출력 jar만 지원됨) -
-libraryjars
-
-keep
-
-keepclassmembers
-
-keepclasseswithmembers
-
-keepnames
-
-keepclassmembernames
-
-keepclasseswithmembernames
-
-printseeds
축소 옵션에는 다음이 포함됩니다.
-
-dontshrink
난독화 옵션에는 다음이 포함됩니다.
-
-dontobfuscate
-
-printmapping
-
-applymapping
-
-obfuscationdictionary
-
-classobfuscationdictionary
-
-packageobfuscationdictionary
-
-useuniqueclassmembernames
-
-dontusemixedcaseclassnames
-
-keeppackagenames
-
-flattenpackagehierarchy
-
-repackageclasses
-
-keepattributes
-
-adaptclassstrings
무시되는 옵션은 다음과 같습니다.
-
-dontoptimize
(Jack이 최적화하지 않음) -
-dontpreverify
(Jack이 사전 확인하지 않음) -
-skipnonpubliclibraryclasses
-
-dontskipnonpubliclibraryclasses
-
-dontskipnonpubliclibraryclassmembers
-
-keepdirectories
-
-target
-
-forceprocessing
-
-printusage
-
-whyareyoukeeping
-
-optimizations
-
-optimizationpasses
-
-assumenosideeffects
-
-allowaccessmodification
-
-mergeinterfacesaggressively
-
-overloadaggressively
-
-microedition
-
-verbose
-
-dontnote
-
-dontwarn
-
-ignorewarnings
-
-printconfiguration
-
-dump
재포장
Jack은 jarjar 구성 파일을 사용하여 재패키징을 수행합니다. Jack은 "규칙" 규칙 유형과 호환되지만 "zap" 또는 "keep" 규칙 유형과는 호환되지 않습니다.
멀티덱스 지원
Jack은 내장형 및 레거시 멀티덱스 지원을 제공합니다. dex 파일은 65K 메서드로 제한되므로 65K 메서드가 넘는 앱은 여러 dex 파일로 분할해야 합니다. 자세한 내용은 64K 이상의 메서드를 사용하는 앱에 대해 multidex 활성화를 참조하세요.