Android N Java 8 기능 (Jack 컴파일러) 및 Kotlin interop


98

업데이트 3. KOTLIN은 이제 Android 개발을 위해 공식적으로 지원 됩니다. Google 제공. YAAAAAAAAS!

업데이트 2 : JetBrains가 장기적으로 Android 용 Kotlin을 지원하는 데 정말 전념하고있는 것 같습니다 . 나는 행복한 kotlin 사용자입니다 :).

업데이트 : JetBrains의 Hadi Hariri 는이 주제에 대한 몇 가지 정보를 공개 할 것이라고 언급했습니다 . 일단 업데이트되면이 게시물을 업데이트하겠습니다.


=== 사용 중단 된 항목 다음 ===

Google은 몇 가지 흥미로운 기능이 포함 된 곧 출시 될 Android N에 대한 미리보기를 출시했습니다. 가장 주목할만한 것은 부분적인 Java 8 언어 지원 입니다. 이것은 Google이 작업중인 새로운 Jack 도구 모음 으로 인해 가능합니다 .

javac 또는 kotlinc를 사용하는 현재 툴체인 :
javac ( .java-> .class)-> dx ( .class-> .dex)
kotlinc ( .kt-> .class)-> dx ( .class-> .dex)

새로운 Jack 툴체인 :
Jack ( .java-> .jack-> .dex)

저는 Google이 Jack 을 Android 개발을위한 기본 도구 모음 으로 만들기 위해 앞으로 나아갈 것이라고 가정 합니다. 업데이트 : Jack 은 이제 더 이상 사용되지 않습니다 . Yas.

제 질문은이 새로운 툴체인이 앞으로 Android 개발을위한 kotlin 사용자 로서 저에게 어떤 영향을 미칠 까요? "과거에 갇혀"가 될까요?


1
(kotlin_library (multiple * .kt) => .jar) then Jill (.jar => Jayce) 그런 다음 잭으로 가져 오기 (다른 (안드로이드가 아닌) (일반 자바) jars와 유사)
Selvin

문서 읽기 : "Jack을 사용하기 위해 다른 작업을 수행 할 필요가 없습니다. 표준 makefile 명령을 사용하여 트리 또는 프로젝트를 컴파일하십시오. Jack은 M 용 기본 Android 빌드 도구 모음입니다." -출처 : source.android.com/source/jack.html 확실히 오타이며 'M'이 아닌 ' N' 을 의미 합니까?
Mark Keen

Jack은 죽었습니다, 기뻐하세요 : P
EpicPandaForce

답변:


63

면책 조항 : 나는 Jack에서 일합니다

이것은 당신에게 영향을 미치지 않습니다. Kotlin의 컴파일러는 Jack / Jill이 잘 가져올 수있는 Java 6 바이트 코드를 생성합니다.


7
그것에 대한 몇 가지 세부 사항을 공유 할 수 있습니까? :
튜더 루카

하지만 Kotlin이 Jack의 성능 최적화에 도움이 될 수 있을까요? 잭 꽤 멋진 것 때문에 (일일 적어도) (지금은 일부 벤치 마크 기다릴 수 없다)
NitroG42

proguard의 저자로부터 벤치 마크에 대한 비디오 프레젠테이션을 보았습니다. 인터넷 검색을 조금만하면 찾을 수 있습니다
sakis kaliakoudas

Kotlin stdlib가 연결된 Android 프로젝트를 빌드하는 데 약간의 어려움이 있습니다. Jill / Jack의 버그처럼 보입니다. 조사해 주시겠습니까? code.google.com/p/android/issues/detail?id=196084
yanex

1
Jill이 Java 8 바이트 코드를 허용하지 않는다는 의미입니까? 라이브러리 모듈은 어떻습니까? .aar로 컴파일되고 Jill이 가져온 것보다 Java 8도 사용할 수 없습니까? 즉, Java 새 기능은 내부 프로젝트 .java 소스에만 사용할 수 있다는 의미입니까?
far.be

15

@Pavel Dudka

Jack-컴파일러입니다. javac와 비슷하지만 약간 다른 일을합니다.

여기에 이미지 설명 입력

보시다시피 Jack은 Java 소스 코드를 Dex 파일로 직접 컴파일합니다! 더 이상 중간 * .class 파일이 없으므로 dx 도구가 필요하지 않습니다!

하지만 기다려! 내 프로젝트에 타사 라이브러리 (.class 파일 모음으로 제공됨)를 포함하면 어떻게됩니까?

그리고 그때 Jill이 등장합니다.

여기에 이미지 설명 입력

Jill은 클래스 파일을 처리하고 Jack 컴파일러의 입력으로 사용할 수있는 특수 Jayce 형식으로 변환 할 수 있습니다.

자 이제 잠시 물러서서 생각해 보겠습니다. 우리가 그토록 중독 된 멋진 플러그인은 어떻게 될까요? 그들은 모두 .class 파일이 필요하며 Jack 컴파일러에는 더 이상 파일이 없습니다.

다행히 Jack은 즉시 사용할 수있는 중요한 기능 중 일부를 제공합니다.

  • Retrolambda-필요하지 않습니다. Jack은 람다를 제대로 처리 할 수 ​​있습니다.
  • Proguard-이제 Jack에 구워 졌으므로 난독 화 및 최소화를 계속 사용할 수 있습니다.

장점 :

Jack은 Java 프로그래밍 언어 1.7을 지원하고 아래에 설명 된 추가 기능을 통합합니다.

  • Predexing

    JACK 라이브러리 파일을 생성 할 때 라이브러리의 .dex가 생성되어 .jack 라이브러리 파일 내에 pre-dex로 저장됩니다. 컴파일 할 때 JACK은 각 라이브러리의 pre-dex를 재사용합니다. 모든 라이브러리는 pre-dexed입니다.

  • 증분 컴파일

    증분 컴파일은 마지막 컴파일 이후에 수정 된 구성 요소와 해당 종속성 만 다시 컴파일됨을 의미합니다. 변경 사항이 제한된 구성 요소 집합으로 만 제한되는 경우 증분 컴파일이 전체 컴파일보다 훨씬 빠를 수 있습니다.

  • 재 포장

    JACK은 jarjar 구성 파일을 사용하여 재 패키징을 수행합니다.

  • Multidex 지원

    dex 파일은 65K 메서드로 제한되므로 메서드가 65K 이상인 앱은 여러 dex 파일로 분할해야합니다. (multidex에 대한 자세한 내용은 '65K 이상의 메서드로 앱 빌드'를 참조하세요.)

단점 :

  • Jack은 Transform API를 지원하지 않습니다. 수정할 수있는 중간 Java 바이트 코드가 없으므로 여기서 언급하지 않은 일부 플러그인은 작동을 멈 춥니 다.
  • 주석 처리는 현재 Jack에서 지원하지 않으므로 Dagger, AutoValue 등과 같은 라이브러리에 크게 의존하는 경우 Jack으로 전환하기 전에 두 번 생각해야합니다. 편집 : Jake Wharton이 지적했듯이 Jack in N Preview는 주석 처리를 지원하지만 아직 Gradle을 통해 노출되지 않았습니다.
  • 자바 바이트 코드 수준에서 작동하는 Lint 감지기는 지원되지 않습니다.
  • Jacoco는 지원되지 않습니다. 개인적으로 Jacoco는 의심 스럽습니다 (보고 싶은 것을 실제로 보여주지 않습니다), 그래서 그것 없이는 완전히 살 수 있습니다
  • Dexguard-Proguard의 엔터프라이즈 버전은 현재 지원되지 않습니다.

'현재 Jack은 주석 처리를 지원하지 않음'이 2016 년 9 월부터 계속 유지됩니까? 지금 지원되는 것처럼 ... 보인다
ticofab

지원되지만 여전히 버그가 있습니다. 예 : 데이터 바인딩이 아직 작동하지 않음 : android # 210615
TmTron

주석 처리는 Jack에서 완전히 지원되지 않습니다. Jack이 기반으로하는 Eclipse 컴파일러에서와 동일한 노후화 상태에 있습니다 ( 여러 메서드는 플레이스 홀더로 구현되며 호출시 예외가 발생하며 수정되지 않은 버그가 많이 있습니다. ECJ 버그 추적기에서).
user1643723 nov.

7

Google은 Jack을 기본 도구로 사용하지 않고 Jack and Jill.
Jill과 함께 .class 파일을 dex로 컴파일하는 것은 여기에 있습니다. 그렇지 않으면 jar / aar 라이브러리에 작별 인사를 할 수 있습니다.

Jack 또는 Jill이 더 느릴 지 여부는 여전히 논쟁의 여지가 있습니다. Android 팀은 jack이 현재 빌드 프로세스보다 빠르기를 희망하지만 지금은 그렇지 않습니다.

또한 Jack과 Dex는 공개적으로 사용할 수 있으며 kotlin 팀이 kotlin 소스 코드에서 .jack 또는 .dex 파일을 내보내는 도구를 작성하는 것을 방해하는 것은 없습니다.


7

업데이트 (2017 년 3 월 16 일)

다행히 Jack은 죽었으므로 Kotlin 개발자에게 영향을 미치지 않습니다.


Jack이 미래라면 Kotlin과 함께 과거에 갇히게 될 것입니다. 현재 Jack은 비 Java 소스를 Dalvik 바이트 코드로 컴파일 할 수있는 플러그인을 지원하지 않습니다. 그리고 JetBrains가 그랬더라도 사소한 작업이 아닌 Kotlin 컴파일러에 새 백엔드를 추가해야합니다. 따라서 Jill과 함께 Kotlin을 사용해야하며 지금 사용하는 도구 모음과 매우 유사한 것이 될 것입니다.

아래 이미지에서 볼 수 있듯이 Jack을 명시 적으로 끌 수없는 경우에도 Jill을 사용하기 위해 프로젝트를 라이브러리 프로젝트로 변환 할 수 있습니다. 그리고 응용 프로그램 프로젝트는이 라이브러리 프로젝트를 참조합니다.

Jack and Jill 애플리케이션 빌드

Kotlin이 Jack과 함께 작동하는 방법을 확인하는 유일한 방법은 Kotlin 컴파일러에 Java 백엔드, 즉 Xtend 와 같은 Java 코드를 생성하는 백엔드를 추가하는 것 입니다. 이 경우 Kotlin 컴파일러에서 생성 된 코드는 Jack에서 다른 자바 코드처럼 처리 할 수 ​​있습니다.

그러나 현재로서는 Jack이 출시 될 때 지원할 내용을 정확히 알지 못합니다. 어쩌면 무언가가 극적으로 바뀌고 Jack에 Kotlin 지원을 추가하는 것이 가능해질 것입니다.


7
사실 Kotlin 팀은 Jack & Jill을 지원할 계획이 있습니다. 라이브 이벤트에서 이에 대해 들었지만 여기 JetBrains의 공식 게시물을 선호하므로 질문에 대답하지 않았습니다.
hotkey

그것은 훌륭 할 것이지만 내가 들었던 유일한 지원은 Jill을 통한 것입니다. 그리고 내가 답변에서 언급 했듯이이 지원을 추가하는 방법은 그리 많지 않습니다.
Michael

사실, 메모리 내 코드 생성 (그리고 훨씬 덜 현실적인 옵션 인 Kotlin-> dex)에 대한 무언가가 있었기 때문에 Kotlin Android 빌드도 상당한 속도 향상이있었습니다.
hotkey

메모리 내 코드 생성이 Jack 통합과 어떻게 관련되는지 이해하지 못합니다. 그리고 Kotlin to dex 컴파일은 JetBrains가 Jack과 유사한 자체 도구 모음을 작성하고 지원해야 함을 의미합니다.
Michael

1
Kotlin 팀이 아닌 다른 사람이 할 수있는 일과 할 수없는 일, 할 수있는 일과 할 수없는 일을 말해야할지 모르겠습니다. 그들은 이전에 이것에 대해 이야기했고 그들이 발표 할 수있는 계획을 가지고 있습니다.
Jayson Minard

5

오늘 게시 된 블로그 게시물 ( Kotlin의 Android 로드맵 ) 에서 말한대로 :

현재 Jack이 Kotlin에서 생성 한 바이트 코드를 올바르게 처리하지 못하는 몇 가지 문제 ( 196084203531 )가 있지만 Google 팀과 협력하여 문제를 해결하거나 Google 측에서 해결 방법을 제공 할 계획입니다. 이 작업이 완료되면 매번 모든 클래스 파일을 번역하는 것과는 반대로 증분 컴파일 중에 Jill사용하여 변경된 클래스 파일 만 번역 할 수 있습니다 (이전 Android 도구에서 가능한 유일한 동작).

따라서 Kotlin은 결국 Jack & Jill을 지원하고 혜택을받을 것입니다.


2

최신 Google 발표에 따라-

Java 8 언어 기능에 대한 지원을 현재 javac 및 dx 도구 세트에 직접 추가하고 Jack 도구 체인을 더 이상 사용하지 않기로 결정했습니다. 이 새로운 방향으로 Java 클래스 파일 형식에 의존하는 기존 도구 및 플러그인이 계속 작동해야합니다. 앞으로 Java 8 언어 기능은 Android 빌드 시스템에서 기본적으로 지원됩니다. 앞으로 몇 주 안에 Android Studio의 일부로 출시 할 예정이며,이 결정을 일찍 알려 드리고자합니다.

처음에는 Jack 툴체인을 통해 Java 8 지원 추가를 테스트했습니다. 시간이 지남에 따라 주석 프로세서, 바이트 코드 분석기 및 리 라이터가 영향을받는 것을 고려했을 때 Jack으로 전환하는 비용이 커뮤니티에 비해 너무 높다는 것을 깨달았습니다. Jack 도구 모음을 사용해보고 훌륭한 피드백을 주셔서 감사합니다. 새 지원이 릴리스 될 때까지 계속 Jack을 사용하여 Java 8 코드를 빌드 할 수 있습니다. Jack에서 마이그레이션하려면 작업이 거의 필요하지 않습니다.

따라서 잭 툴체인이 안드로이드 개발을위한 기본 툴체인이되는 것에 대해 걱정할 필요가 없습니다. kotlin을 계속 사용하거나 일반 javac / dx 도구 세트를 사용할 수 있습니다.

출처 : Android에서 Java 8 언어 기능 지원의 미래


1

공식 Kotlin 블로그에서 이미이 블로그 게시물을 찾았습니다. : Kotlin의 Android 로드맵

거기에서 다음과 같은 부분을 찾을 수 있습니다.

Android 빌드 성능을 개선하기 위해 다음으로 할 일은 Android의 새로운 Jack 및 Jill 도구 모음과 의 통합을 제공하는 것 입니다. 현재 Jack이 Kotlin에서 생성 한 바이트 코드를 올바르게 처리하지 못하는 몇 가지 문제 ( 196084203531 )가 있지만 Google 팀과 협력하여 문제를 해결하거나 Google 측에서 해결 방법을 제공 할 계획입니다. 이 작업이 완료되면 매번 모든 클래스 파일을 번역하는 것과는 반대로 증분 컴파일 중에 Jill을 사용하여 변경된 클래스 파일 만 번역 할 수 있습니다 (이전 Android 도구에서 가능한 유일한 동작).

따라서 @LukasBergstrom이 말했듯이 "과거에 갇혀있는"문제는 없습니다 ;-)

Reddit이 주제와 관련된 토론 도 확인할 수 있습니다 . Jack 및 Jill과 함께 Kotlin의 상태는 어떻습니까?

즐거운 코딩입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.