Android N Java 8 기능(Jack 컴파일러) 및 Kotlin interop
업데이트 3. KOTLIN은 이제 Android 개발을 공식적으로 지원합니다. Google. YAAAAAAAAS!
업데이트 2: JetBrains는 장기적으로 Kotlin for Android를 지원하기 위해 노력하고 있는 것 같습니다.저는 Happy Kotlin 사용자입니다. : )
업데이트: JetBrains의 Hadi Hariri는 이 주제에 대한 정보를 공개할 것이라고 말했습니다.그들이 게시하는 대로 이 게시물을 업데이트하겠습니다.
=== NEXT ====== 사사음음음 ===
구글은 곧 출시될 Android N의 프리뷰를 발표했는데, 가장 주목할 만한 것은 자바 8 언어 부분 지원이다.이것은 구글이 작업 중인 새로운 잭 툴 체인 덕분에 가능합니다.
javac 또는 kotlinc를 사용하는 현재 도구 체인:
javac (.java
-->.class
) --> dx (.class
-->.dex
키보드(.kt
-->.class
) --> dx (.class
-->.dex
)
잭 툴 체인: " " " " " 。
잭(.java
-->.jack
-->.dex
)
저는 구글이 잭을 안드로이드 개발을 위한 기본 툴 체인으로 만드는 것을 추진할 것이라고 생각합니다.업데이트: 잭은 더 이상 사용되지 않게 되었습니다.야스.
이 새로운 툴체인이 향후 Android 개발을 위한 Kotlin 사용자로서 나에게 어떤 영향을 미칠까?'과거에 갇힐까'?
면책사항:나는 잭을 위해 일한다.
이건 너한테 영향을 주지 않을 거야.Kotlin의 컴파일러는 Java 6 바이트 코드를 생성합니다.Jack/Jill은 이 코드를 정상적으로 Import할 수 있습니다.
@Pavel Dudka
잭은 컴파일러입니다.javac과 비슷하지만 조금 다른 기능을 합니다.
보시다시피 잭은 Java 소스 코드를 덱스 파일로 바로 컴파일합니다!중간 *.class 파일이 없어졌기 때문에 dx 툴은 필요 없습니다!
하지만 기다려!프로젝트에 서드파티 라이브러리(.class 파일 모음으로 제공됨)를 포함하면 어떻게 됩니까?
그 때 질은 연주를 시작합니다.
Jill은 클래스 파일을 처리하여 잭 컴파일러의 입력으로 사용할 수 있는 특수 Jayce 형식으로 변환할 수 있습니다.
그러니 잠시 비켜서서 생각해 봅시다...우리가 그렇게 중독된 그 멋진 플러그인들은 어떻게 되는 거야?모두 .class 파일이 필요하고, 잭 컴파일러는 더 이상 파일을 가지고 있지 않습니다.
다행히 잭은 다음과 같은 중요한 기능을 즉시 제공합니다.
- Retrolambda - 필요하지 않습니다.잭은 람다를 제대로 다룰 수 있다.
- Proguard - 현재 잭에 내장되어 있기 때문에 난독화와 최소화를 계속 사용할 수 있습니다.
장점:
잭은 Java 프로그래밍 언어 1.7을 지원하며 아래에 설명된 추가 기능을 통합합니다.
프리덱스
JACK 라이브러리 파일을 생성할 때 라이브러리의 .dex가 생성되어 .jack 라이브러리 파일 내에 프리덱스로 저장됩니다.컴파일 시 JACK은 각 라이브러리의 프리덱스를 재사용합니다.모든 라이브러리가 프리덱스 되어 있다.
증분 컴파일
증분 컴파일은 마지막 컴파일 이후 터치된 컴포넌트와 그 의존관계만 재컴파일됨을 의미합니다.변경이 제한된 컴포넌트 세트로 제한되는 경우 증분 컴파일은 전체 컴파일보다 훨씬 빠를 수 있습니다.
재패키지화
JACK은 jarjar 컨피규레이션파일을 사용하여 재패키지화를 수행합니다.
멀티덱스 지원
덱스 파일은 65K 메서드로 제한되므로 65K 메서드가 넘는 앱은 여러 개의 덱스 파일로 분할해야 합니다.(멀티덱스에 대한 자세한 내용은 '65K 이상의 메서드로 앱 빌드'를 참조하십시오.)
단점:
- 변환 API는 잭에서 지원되지 않습니다. 수정할 수 있는 중간 Java 바이트 코드가 없으므로 여기서 언급하지 않은 일부 플러그인이 작동을 중지합니다.
- 주석 처리는 현재 잭에서 지원되지 않으므로 Daughter, AutoValue 등의 라이브러리에 크게 의존하고 있다면 잭으로 전환하기 전에 다시 한 번 생각해 보아야 합니다.편집: Jake Warton이 지적한 바와 같이, Jack in N Preview는 주석 처리를 지원하지만 Gradle을 통해 아직 공개되지 않았습니다.
- Java 바이트 코드 수준에서 작동하는 린트 디텍터는 지원되지 않습니다.
- Jacoco는 지원되지 않습니다.저는 개인적으로 Jacoco를 의심하고 있기 때문에 (보고 싶은 것을 잘 나타내고 있지 않기 때문에) Jacoco 없이도 충분히 살 수 있습니다.
- Dexguard - Proguard 엔터프라이즈 버전은 현재 지원되지 않습니다.
, 잭은 디폴트 툴로 푸시하지 .Jack and Jill
.
Jill과 함께 .class 파일을 덱스로 컴파일하는 것은 앞으로도 계속될 것입니다.그렇지 않으면 jar/aar 라이브러리에 작별 인사를 할 수 있습니다.
잭과 질 중 어느 쪽이 더 느릴지는 아직 논쟁의 여지가 있다.Android 팀은 잭이 현재 빌드 프로세스보다 더 빠를 것으로 기대하지만, 지금은 그렇지 않습니다.
게다가 잭과 덱스는 오픈되어 있기 때문에 kotlin 팀이 kotlin 소스 코드에서 .jack 또는 .dex 파일을 에뮬레이트하는 툴을 작성할 수 없습니다.
갱신(2017년 3월 16일)
다행히 잭은 죽었고 그래서 코틀린 개발자들에게는 영향을 주지 않을 것이다.
만약 잭이 미래라면 당신은 코틀린과 과거에 갇히게 될 것이다.현재 잭은 비 Java 소스를 Dalvik 바이트 코드로 컴파일할 수 있는 플러그인을 지원하지 않습니다.그리고 JetBrains가 새로운 백엔드를 Kotlin 컴파일러에 추가해야 합니다.이것은 간단한 작업이 아닙니다.따라서 Kotlin을 Jill과 함께 사용해야 하며 현재 사용하고 있는 툴 체인과 매우 유사합니다.
아래 이미지에서 알 수 있듯이 Jack을 명시적으로 끌 수 없는 경우에도 프로젝트를 라이브러리 프로젝트로 변환하여 Jill을 사용할 수 있습니다.애플리케이션 프로젝트는 이 라이브러리 프로젝트만 참조합니다.
Kotlin이 Jack과 어떻게 연동할 수 있는지 알 수 있는 유일한 방법은 Kotlin 컴파일러에 Java 백엔드, 즉 Xtend와 같은 Java 코드를 생성하는 백엔드를 추가하는 것입니다.이 경우 Kotlin 컴파일러에 의해 생성된 코드는 다른 Java 코드와 마찬가지로 잭에 의해 처리될 수 있습니다.
하지만 현재로서는 출시될 때 Jack이 정확히 무엇을 지원할지는 알 수 없습니다.뭔가 극적으로 변화하여 Kotlin이 Jack을 지원할 수 있게 될지도 모릅니다.
오늘 게재된 블로그 투고(Kotlin의 Android Roadmap):
현시점에서는 잭이 Kotlin에서 생성된 바이트 코드를 올바르게 처리할 수 없는 문제가 몇 가지 있지만(196084 및 203531) Google 팀과 협력하여 문제를 해결하거나 해결 방법을 제공할 예정입니다.이 작업이 완료되면 모든 클래스 파일을 매번 번역하는 것이 아니라 증분 컴파일 중에 Jill을 사용하여 변경된 클래스 파일만 번역할 수 있습니다(이전 Android 툴링에서는 이것이 유일한 동작입니다).
따라서 Kotlin은 최종적으로 Jack & Jill을 지원하여 혜택을 받을 수 있습니다.
최신 구글 발표에 따르면 -
현재 javac 및 dx 툴셋에 Java 8 언어 기능을 직접 추가하고 Jack 툴체인을 사용하지 않기로 결정했습니다.이 새로운 방향에서는 Java 클래스 파일 형식에 의존하는 기존 도구와 플러그인이 계속 작동합니다.앞으로 Java 8 언어 기능은 Android 빌드 시스템에서 기본적으로 지원됩니다.향후 몇 주 안에 Android Studio의 일부로 이 결정을 발표할 예정입니다.
처음에 Jack 툴체인을 통해 Java 8 지원 추가를 테스트했습니다.시간이 지남에 따라 우리는 주석 프로세서, 바이트 코드 분석기 및 리라이터가 영향을 받는 것을 고려했을 때 Jack으로의 전환 비용이 커뮤니티에 비해 너무 높다는 것을 깨달았습니다.Jack 툴체인을 시험해보고 좋은 피드백을 주셔서 감사합니다.새로운 지원이 릴리스될 때까지 잭을 사용하여 Java 8 코드를 작성할 수 있습니다.잭에서 이행하는 작업은 거의 또는 전혀 필요 없습니다.
따라서 잭 툴체인이 안드로이드 개발을 위한 기본 툴체인이 되는 것에 대해 걱정할 필요가 없습니다.kotlin을 계속 사용하거나 일반 javac/dx 도구 세트를 사용할 수 있습니다.
출처 : Android에서의 Java 8 언어 기능 지원의 미래
저는 이미 Kotlin 공식 블로그에서 블로그 투고를 찾았습니다: Kotlin의 Android Roadmap
여기서 다음을 나타내는 부품을 찾을 수 있습니다.
다음으로 Android 빌드 성능을 개선하기 위해 Android의 새로운 Jack 및 Jill 툴 체인과의 통합을 계획하고 있습니다.현시점에서는 잭이 Kotlin에서 생성된 바이트 코드를 올바르게 처리할 수 없는 문제가 몇 가지 있지만(196084 및 203531) Google 팀과 협력하여 문제를 해결하거나 해결 방법을 제공할 예정입니다.이 작업이 완료되면 모든 클래스 파일을 매번 번역하는 것이 아니라 증분 컴파일 중에 Jill을 사용하여 변경된 클래스 파일만 번역할 수 있습니다(이전 Android 툴링에서는 이것이 유일한 동작입니다).
@LukasBergstrom이 말했듯이, "과거에 걸림"은 문제가 없습니다;-)
확인하실 수도 있습니다.Reddit
다음 토픽에 링크된 토론:잭과 질과 함께 있는 코틀린의 상태는 어떻습니까?
해피 코딩.
Kotlin 블로그에 따르면 릴리스 1.1-beta2 신기능 섹션:
잭 툴체인이 유효하게 되어 있는 경우의 Android 프로젝트 구축 지원(jackOptions {true}).
언급URL : https://stackoverflow.com/questions/35919849/android-n-java-8-features-jack-compiler-and-kotlin-interop
'programing' 카테고리의 다른 글
XML을 해석하고 특정 노드 속성의 인스턴스를 가져오려면 어떻게 해야 합니까? (0) | 2022.10.28 |
---|---|
Maven에서 외부 속성 파일을 읽는 방법 (0) | 2022.10.28 |
php: 함수가 호출된 위치를 확인합니다. (0) | 2022.10.28 |
SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo 실패:이름 또는 서비스를 알 수 없습니다. (0) | 2022.10.28 |
MySQL: 여러 열의 MAX 또는 GREAST를 가져오지만 NULL 필드를 사용합니다. (0) | 2022.10.28 |