Android 6.0–8.1용 Jack으로 컴파일

컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요.

Jack은 Java 소스를 Android dex 바이트코드로 컴파일한 Android 툴체인입니다. Jack을 사용하기 위해 다른 작업을 수행할 필요는 없습니다. 표준 makefile 명령을 사용하여 트리나 프로젝트를 컴파일하기만 하면 됩니다. Android 8.1은 Jack을 사용하는 마지막 릴리스입니다.

잭 소개

Jack은 그림 1과 같이 작동합니다.

잭 개요
그림 1. 잭 개요

잭 라이브러리 형식

Jack에는 라이브러리에 대해 미리 컴파일된 dex 코드가 포함된 자체 .jack 파일 형식이 있으므로 더 빠른 컴파일(pre-dex)이 가능합니다.

Jack 라이브러리 파일 내용
그림 2. Jack 라이브러리 파일 내용

처녀

Jill 도구는 아래와 같이 기존 .jar 라이브러리를 새 라이브러리 형식으로 변환합니다.

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_SERVICESERVER_PORT_ADMIN 변수)을 편집하여 포트를 변경합니다. 상황을 차단 해제하려면 $HOME/.jack 을 편집하고 SERVERfalse 로 변경하여 Jack 컴파일 서버를 비활성화합니다. 불행히도 이것은 컴파일 속도를 크게 저하시키고 로드 제어( make 의 옵션 -l )와 함께 make -j 를 실행하도록 강제할 수 있습니다.
진행 없이 컴파일이 멈춥니다. 상황을 차단 해제하려면 jack-admin kill-server 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를 재사용합니다. 모든 라이브러리는 사전 덱싱됩니다.

pre-dex가 있는 Jack 라이브러리
그림 4. pre-dex가 있는 Jack 라이브러리

Jack은 컴파일에서 축소, 난독화 또는 재패키징이 사용되는 경우 라이브러리 pre-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 (잭이 최적화하지 않음)
  • -dontpreverify (잭은 사전 검증하지 않음)
  • -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" 또는 "유지" 규칙 유형과 호환되지 않습니다.

멀티덱스 지원

Jack은 기본 및 레거시 multidex 지원을 제공합니다. dex 파일은 65K 메서드로 제한되므로 65K 메서드가 넘는 앱은 여러 dex 파일로 분할해야 합니다. 자세한 내용 은 64K 이상의 메서드가 있는 앱에 대해 multidex 활성화 를 참조하세요.