2020년 11월 23일
Kotlin 1.4.20 버전이 새로 나왔습니다. 이 버전에서는 여러 가지 실험적인 기능을 시도할 수 있는 기회가 주어집니다. Kotlin 팀의 기본 원칙 중 하나는 커뮤니티 피드백을 환영하며, 새로운 기능의 프로토타입에 대한 의견을 기다립니다. 이러한 기능을 시도하고 Slack (여기에서 초대를 받으세요) 또는 YouTrack에서 피드백을 공유해주세요.
Kotlin 1.4.20의 주요 하이라이트 중 일부는 다음과 같습니다:
- invokedynamic를 통한 문자열 연결과 같은 새로운 JVM 기능 지원.
- KMM 프로젝트의 성능 및 예외 처리 개선.
- JDK Path에 대한 확장 기능: Path("dir") / "file.txt".
또한 1.4.0에서 추가된 기존 기능에 대한 다양한 수정 및 개선 사항이 포함되어 있습니다. 따라서 이러한 기능 중 어느 것이든 문제가 발생했다면 이번에 다시 시도해 보는 것이 좋습니다.
Kotlin 1.4.20의 기능에 대해 자세히 알아보려면 계속 읽어보세요. 또한 Kotlin 문서의 "Kotlin 1.4.20에서 새로운 내용" 페이지에서 발표 내용을 간략하게 볼 수 있습니다. 모든 변경 내용은 변경 로그에서 확인할 수 있습니다.
이 릴리스에 도움을 주신 외부 기여자분들께 항상 감사드립니다.
자세한 내용은 다음과 같습니다:
Kotlin/JVM
JVM에서는 새로운 JVM 15 타겟을 추가하고 기존 기능과 성능을 개선하고 버그를 수정하는 데 주로 중점을 두었습니다.
invokedynamic 문자열 연결
Java 9부터 JVM에서 문자열 연결은 동적 메서드 호출(바이트코드에서 invokedynamic 명령어)을 통해 수행됩니다. 이것은 이전 구현보다 빠르게 작동하고 메모리를 덜 사용하며 바이트코드 변경을 필요로하지 않으므로 미래의 최적화를 위한 공간을 제공합니다.
우리는 Kotlin에서 이 메커니즘을 성능 향상을 위해 구현하기 시작했으며 현재 JVM 9+ 타겟에서 문자열 연결을 동적 호출로 컴파일할 수 있습니다.
현재 이 기능은 실험적이며 다음과 같은 경우를 다룹니다:
- 연산자(a + b), 명시적(a.plus(b)), 참조((a::plus)(b)) 형태의 String.plus.
- 인라인 및 데이터 클래스에서의 toString.
- 상수가 아닌 단일 인수를 가진 문자열 템플릿(KT-42457 참조를 제외한 경우).
invokedynamic 문자열 연결을 활성화하려면 다음 값 중 하나를 가진 -Xstring-concat 컴파일러 옵션을 추가하십시오:
- indy-with-constants: StringConcatFactory.makeConcatWithConstants()를 사용하여 문자열에 대한 invokedynamic 연결을 수행합니다(이것은 1.5에서 JVM 9+ 타겟에 대한 기본값으로 계획되어 있습니다).
- indy: StringConcatFactory.makeConcat()를 사용하여 문자열에 대한 invokedynamic 연결을 수행합니다.
- inline: StringBuilder.append()를 통한 기존 연결로 전환합니다.
Kotlin/JS
Kotlin/JS는 계속해서 진화하고 있으며 이번 릴리스에서는 프로젝트 마법사를 위한 새로운 템플릿, 프로젝트 구성을 더 잘 제어하기 위한 개선된 DSL 및 기타 기능 개선이 포함되어 있습니다. 또한 새로운 IR 컴파일러에는 코드 오류를 무시하고 프로젝트를 컴파일하는 새로운 방법이 추가되었습니다.
Gradle DSL 변경 사항
Kotlin/JS Gradle DSL은 웹팩 구성 조정, 자동 생성된 package.json 파일 수정, 및 종속성에 대한 개선된 제어를 포함한 프로젝트 설정 및 사용을 단순화하는 여러 업데이트를 받았습니다.
웹팩 구성에 대한 단일 지점
Kotlin 1.4.20에서는 브라우저 대상용으로 commonWebpackConfig라는 새로운 구성 블록을 소개했습니다. 이 블록 내에서 웹팩 작업, 실행 작업 및 테스트 작업에 대한 구성을 중복으로 작성하지 않고도 일반 설정을 조정할 수 있습니다.
모든 세 가지 작업에 대해 기본적으로 CSS 지원을 활성화하려면 프로젝트의 build.gradle(.kts)에 다음 스니펫을 포함하면 됩니다.
kotlin {
browser {
commonWebpackConfig {
cssSupport.enabled = true
}
binaries.executable()
}
}
Gradle에서 package.json 사용자 정의
package.json 파일은 일반적으로 JavaScript 프로젝트의 동작 방식을 정의하며 실행 가능한 스크립트, 종속성 등을 식별합니다. Kotlin/JS 프로젝트의 경우 빌드 시 자동으로 생성됩니다. package.json의 내용은 상황에 따라 다르기 때문에 이 파일을 사용자 정의하는 간단한 방법을 요청하는 요청이 많이 왔습니다.
Kotlin 1.4.20에서는 build.gradle 스크립트에서 compilations packageJson 블록을 사용하여 package.json 프로젝트 파일에 항목을 추가할 수 있습니다.
kotlin {
js(BOTH) {
compilations["main"].packageJson {
customField("hello", mapOf("one" to 1, "two" to 2))
}
}
}
프로젝트를 빌드하면 다음 블록이 구성 파일 build/js/packages/projectName/package.json에 추가됩니다.
"hello": {
"one": 1,
"two": 2
}
커맨드 라인에서 프로젝트를 실행하기 쉽게 스크립트 필드를 추가하거나 다른 후처리 도구에 대한 정보를 포함하려는 경우 이 새로운 사용자 정의 필드 지정 방법을 유용하게 사용할 수 있을 것입니다.
선택적 yarn 종속성 해결 (실험적)
npm에서 종속성을 포함할 때 종속성(전달적 종속성)에 대한 정밀한 제어가 필요한 경우가 있습니다. 이에는 여러 가지 이유가 있을 수 있습니다. 사용 중인 라이브러리의 종속성 중 하나에 중요한 업그레이드를 적용하려는 경우가 있을 수 있습니다. 또는 현재 응용 프로그램을 깨뜨리는 전달적 종속성의 업데이트를 롤백하려는 경우가 있을 수 있습니다. Yarn의 선택적 종속성 해결 기능을 사용하면 원래 작성자가 지정한 종속성을 재정의하여 개발을 계속할 수 있습니다.
Kotlin 1.4.20에서는 프로젝트의 Gradle 빌드 스크립트를 통해이 기능을 구성할 수 있는 실험적인 방법을 제공합니다. Kotlin/JS 옵션의 나머지 부분과의 원활한 API 통합에 대한 작업을 진행 중이지만 이미 YarnRootExtension 내에서 이 기능을 사용할 수 있습니다. 프로젝트의 종속성 버전을 영향을 주려면 resolution 함수를 사용하고 패키지 이름 선택기(이름이 Yarn에서 지정한 대로)와 원하는 버전을 지정합니다.
build.gradle.kts 파일에 선택적 종속성 해결 구성을 위한 예제 설정은 다음과 같습니다.
rootProject.plugins.withType<YarnPlugin> {
rootProject.the<YarnRootExtension>().apply {
resolution("react", "16.0.0")
resolution("processor/decamelize", "3.0.0")
}
}
여기서 react를 필요로 하는 모든 npm 종속성은 버전 16.0.0을 받고, processor는 버전 3.0.0의 decamelize 종속성을 받습니다. 또한 resolution 블록에 include 및 exclude 호출을 전달할 수도 있으며 이를 사용하여 허용 가능한 버전에 대한 제약 조건을 지정할 수 있습니다.
세분화된 작업 공간 비활성화 (실험적)
Kotlin/JS Gradle 플러그인은 빌드 시 필요한 종속성만 설치합니다. 예를 들어, webpack-dev-server 패키지는 *Run 작업 중 하나를 실행할 때만 설치되며 assemble 작업을 실행할 때는 설치되지 않습니다. 이렇게 하면 불필요한 다운로드가 피해지지만 병렬로 여러 개의 Gradle 프로세스를 실행할 때 문제가 발생할 수 있습니다. 종속성 요구 사항이 충돌하면 두 개의 npm 패키지 설치가 오류를 발생시킬 수 있습니다.
이 문제를 해결하기 위해 Kotlin 1.4.20에는 이러한 세분화된 작업 공간을 비활성화하는 새로운(실험적) 옵션도 포함되어 있습니다. 선택적 종속성 해결을 위한 실험적 지원과 마찬가지로 이 기능은 현재 YarnRootExtension 내에서 사용할 수 있지만 Kotlin/JS Gradle DSL의 나머지 부분과 더 밀접하게 통합될 예정입니다. 이를 사용하려면 build.gradle.kts 파일에 다음 스니펫을 추가하십시오.
rootProject.plugins.withType<YarnPlugin> {
rootProject.the<YarnRootExtension>().disableGranularWorkspaces()
}
이 구성으로 Kotlin/JS Gradle 플러그인은 현재 실행 중인 작업과 관련이 없는 작업에서도 사용될 수 있는 모든 npm 종속성을 설치합니다. 이렇게 하면 첫 번째 Gradle 빌드가 조금 더 오래 걸릴 수 있지만 다음에 실행할 작업에 대한 다운로드된 종속성이 최신 상태가 됩니다. 이렇게 함으로써 병렬로 여러 개의 Gradle 프로세스를 실행할 때 충돌을 피할 수 있습니다.
새로운 마법사 템플릿
프로젝트를 생성하는 동안 프로젝트를 더 편리하게 사용자 정의할 수 있는 새로운 조정 가능한 Kotlin/JS 애플리케이션용 템플릿이 있는 Kotlin 프로젝트 마법사가 제공됩니다. 브라우저 및 Node.js 실행 환경을 위한 템플릿이 있으며 프로젝트를 시작하는 좋은 출발점 역할을 하며 초기 구성을 미세 조정할 수 있습니다. 이는 새로운 IR 컴파일러를 활성화하거나 추가 라이브러리 지원을 설정하는 것과 같은 설정을 포함합니다.
Kotlin 1.4.20에서는 다음과 같은 세 가지 템플릿이 제공됩니다:
- 브라우저 애플리케이션: 브라우저에서 실행되는 Kotlin/JS Gradle 프로젝트를 설정할 수 있는 베어본 템플릿입니다.
- React 애플리케이션: 적절한 kotlin-wrappers를 사용하여 React 앱을 빌드하기 시작할 수 있는 모든 필수 구성 요소를 제공합니다. 스타일 시트, 탐색 구성 요소 및 상태 컨테이너 통합을 활성화할 수 있는 옵션을 제공합니다.
- Node.js 애플리케이션: 프로젝트가 Node.js 실행 환경에서 실행되도록 미리 구성합니다. Kotlin 1.4.20에서는 Kotlin/JS 애플리케이션용으로 소개한 실험적인 kotlinx-nodejs 패키지를 직접 포함하는 옵션이 있습니다.
컴파일 오류 무시 (실험적)
Kotlin 1.4.20에서는 Kotlin/JS IR 컴파일러에서 사용 가능한 새로운 기능을 소개하려고 합니다. 이것은 컴파일되지 않는 상태에서 일반적으로 컴파일되지 않을 때 응용 프로그램을 시도할 수 있게 해주는 기능으로, 복잡한 리팩토링을 수행하거나 컴파일 오류와 관련 없는 시스템의 일부를 작업할 때 유용합니다. 이 새로운 컴파일러 모드로 컴파일러는 모든 오류 코드를 무시하고 컴파일할 때 에러가 발생하지 않는 한 실행 중 예외로 대체합니다.
Kotlin 1.4.20은 코드 오류를 무시하는 두 가지 허용 정책을 제공합니다:
- SEMANTIC 모드에서 컴파일러는 구문적으로 올바르지만 의미적으로 이상한 코드를 허용합니다. 이는 유형 불일치를 포함하는 문이 예입니다(예: val x: String = 3).
- SYNTAX 모드에서 컴파일러는 구문 오류가 포함된 코드를 허용합니다. 무엇을 작성하든 컴파일러는 실행 가능한 실행 파일을 생성하려고 시도합니다.
- 실험적 기능으로 컴파일 오류를 무시하려면 컴파일러 옵션을 통해 이 기능을 활성화해야 합니다. 이 기능은 Kotlin/JS IR 컴파일러에서만 사용할 수 있습니다. 활성화하려면 build.gradle.kts 파일에 다음 스니펫을 추가하십시오.
kotlin {
js(IR) {
compilations.all {
compileKotlinTask.kotlinOptions.freeCompilerArgs += listOf("-Xerror-tolerance-policy=SYNTAX")
}
}
}
오류가 있는 컴파일과 함께 컴파일하는 것이 Kotlin/JS 프로젝트에서 작업하는 동안 피드백 루프를 더욱 강화하고 반복 속도를 높이는 데 도움이 될 것으로 기대합니다. 이 기능을 시도하면서 발견하는 피드백과 문제에 대한 여러분의 의견을 기대하고 있으며 나중에 Kotlin/JS Gradle DSL 및 해당 작업과 더 깊게 통합하는 기능을 제공할 것입니다.
이러한 Kotlin 1.4.20의 새로운 기능을 통해 Kotlin/JS 프로젝트를 더욱 효율적으로 개발할 수 있게 되었습니다. 이러한 개선 사항에 대한 의견과 피드백을 기다리며 여러분의 프로젝트를 성공적으로 개발하길 바랍니다.
Kotlin/Native
성능은 Kotlin/Native의 주요 우선 순위 중 하나로 남아 있습니다. 이 영역의 주요 기능 중 하나는 새로운 이스케이프 분석 메커니즘의 프로토 타입으로, 이후 릴리스에서 더욱 다듬고 개선할 계획입니다. 물론 인덱스 범위 검사(in)와 같은 더 작은 성능 향상도 있습니다.
1.4.20에서 Kotlin/Native 개발의 개선점 중 하나는 개발을 다듬고 버그를 수정하는 것입니다. 이전 버전에서 발견된 오래된 문제와 1.4 기능에서 발견된 문제를 해결했습니다. 예를 들어 코드 공유 메커니즘과 같은 경우 Kotlin/Native와 Kotlin/JVM 간의 동작 불일치를 수정하는 개선점이 있습니다. 이는 프로퍼티 초기화나 함수 참조에서 equals 및 hashCode가 작동하는 방식과 같은 특수한 경우에 해당합니다.
마지막으로 Objective-C 상호 운용 기능을 확장하여 Objective-C 예외를 Kotlin 예외로 래핑하는 옵션을 추가했습니다. 이를 통해 Kotlin 코드에서 이러한 예외를 처리할 수 있게 되었습니다.
이스케이프 분석
이스케이프 분석은 컴파일러가 객체를 스택에 할당할 것인지 아니면 힙에 "이스케이프" 할 것인지 결정하는 기술입니다. 스택에 할당하면 훨씬 빠르고 미래의 가비지 수집을 필요로하지 않습니다.
Kotlin/Native은 이미 로컬 이스케이프 분석을 가지고 있었지만, 새로운 보다 효율적인 전역 이스케이프 분석의 프로토 타입 구현을 도입하고 있습니다. 이것은 릴리스 빌드를 위한 별도의 컴파일 단계에서 수행됩니다 (-opt 컴파일러 옵션을 사용).
이 프로토타입은 이미 우리의 벤치마크에서 평균 성능 향상이 10%를 넘는 결과를 얻었습니다. 알고리즘을 최적화하여 스택 할당을 위한 더 많은 객체를 찾고 프로그램을 더 빠르게 실행하도록하는 방법을 연구 중입니다.
프로토 타입 작업을 계속 진행하는 동안 실제 프로젝트에서 얻는 결과를 시도하고 공유하여 우리를 크게 도울 수 있습니다.
이스케이프 분석 단계를 비활성화하려면 -Xdisable-phases=EscapeAnalysis 컴파일러 옵션을 사용하십시오.
Objective-C 예외의 옵트인 래핑
Objective-C에서 예외의 목적은 Kotlin에서의 목적과 다릅니다. 그들의 사용은 일반적으로 개발 중에 오류를 찾는 데 제한됩니다. 그러나 기술적으로는 Objective-C 라이브러리가 런타임에서 예외를 throw 할 수 있습니다. 이전에는 Kotlin/Native에서 이러한 예외를 처리할 옵션이 없었으며, 라이브러리에서 NSException이 throw되면 Kotlin/Native 프로그램 전체가 종료되었습니다.
1.4.20에서는 런타임에서 이러한 예외를 처리할 수 있는 옵션을 추가하여 프로그램 충돌을 피하도록 했습니다. Objective-C 예외를 Kotlin 예외로 래핑하려면 cinterop 호출에서 -Xforeign-exception-mode objc-wrap 옵션을 지정하거나 .def 파일에 foreignExceptionMode = objc-wrap 속성을 추가하십시오. CocoaPods 통합을 사용하는 경우 종속성의 pod {} 빌드 스크립트 블록에 다음과 같이 옵션을 지정하십시오:
pod("foo") {
extraOpts = listOf("-Xforeign-exception-mode”, “objc-wrap")
}
기본 동작은 변경되지 않습니다. Objective-C 코드에서 예외가 throw되면 프로그램이 종료됩니다.
CocoaPods 플러그인 개선
작업 실행 개선
이 릴리스에서는 작업 실행 흐름을 크게 개선했습니다. 예를 들어 새로운 CocoaPods 종속성을 추가하면 기존 종속성이 다시 빌드되지 않습니다. 추가 대상을 추가해도 기존 대상의 종속성을 다시 빌드하지 않습니다.
확장된 DSL
1.4.20에서 Kotlin 프로젝트에 CocoaPods 종속성을 추가하기 위한 DSL을 확장했습니다.
로컬 Pods 및 CocoaPods 리포지토리에서 Pods 외에도 다음 유형의 라이브러리에 종속성을 추가할 수 있습니다:
- 사용자 정의 스펙 리포지토리에서의 라이브러리.
- Git 리포지토리에서의 원격 라이브러리.
- 아카이브에서의 라이브러리 (임의의 HTTP 주소로도 사용 가능).
- 정적 라이브러리.
- 사용자 정의 cinterop 옵션을 가진 라이브러리.
이전 DSL 구문은 여전히 지원됩니다.
다음 예제에서 몇 가지 DSL 변경 사항을 살펴보겠습니다.
Git 리포지토리에서의 원격 라이브러리에 대한 종속성.
원하는 버전의 Pod을 얻기 위해 태그, 커밋 또는 브랜치를 지정할 수 있습니다.
pod("JSONModel") {
source = git("https://github.com/jsonmodel/jsonmodel.git") {
branch = "key-mapper-class"
}
}
사용자 정의 스펙 리포지토리에서의 라이브러리에 대한 종속성.
specRepos {
url("https://github.com/Kotlin/kotlin-cocoapods-spec.git")
}
pod("example")
Xcode와의 업데이트
Xcode와 정확하게 작동하려면 Kotlin에 몇 가지 Podfile 변경 사항이 필요합니다:
- Kotlin Pod에 Git, HTTP 또는 specRepo 팟 종속성이 있는 경우 Podfile에서도 명시해야 합니다. 예를 들어 CocoaPods 리포지토리에서 AFNetworking에 종속성을 추가하는 경우 Podfile에서 다음과 같이 선언해야 합니다.
pod 'AFNetworking'
- 사용자 정의 스펙에서 라이브러리를 추가하는 경우 Podfile의 시작 부분에 specs의 위치도 지정해야 합니다.
source 'https://github.com/Kotlin/kotlin-cocoapods-spec.git'
target 'kotlin-cocoapods-xcproj' do
// ... 다른 Pods ...
pod 'example'
end
IntelliJ IDEA에서는 통합 오류에 대한 자세한 설명이 제공되므로 Podfile에 문제가 있는 경우 즉시 해결 방법에 대한 정보를 받을 수 있습니다.
기존 Kotlin 버전에서 1.4.20 이상으로 업데이트하려면 hierarchical project structure 지원을 사용하도록 설정한 경우 Kotlin을 버전 1.4.20 이상으로 업그레이드해야 합니다. 그러나 hierarchical project structure 지원을 사용하지 않는 경우 이전 Kotlin 버전을 사용하는 사용자는 여전히 라이브러리를 사용할 수 있습니다.
Xcode 12 libraries 지원
Xcode 12에서 제공된 새로운 라이브러리를 지원하게 되었습니다. 이제 Kotlin 코드에서 이러한 라이브러리를 자유롭게 사용할 수 있습니다!
multiplatform library publications의 업데이트된 구조
Kotlin 1.4.20 이전에는 multiplatform library publications에 플랫폼별 publications과 메타데이터 publications이 포함되어 있었습니다. 그러나 메타데이터 publications에 대한 명시적인 종속성이 필요하지 않았으므로 이 artifact는 명시적으로 사용되지 않았습니다.
Kotlin 1.4.20부터는 별도의 메타데이터 publications가 더 이상 없습니다. 메타데이터 artifact는 이제 루트 publications에 포함되며, 공통 소스 집합에 종속성으로 추가될 때 적절한 플랫폼별 artifacts로 자동으로 해결됩니다.
빈 classifier 없이 라이브러리의 루트 모듈에 빈 artifact를 추가하지 말아야 함을 유의해야 합니다. 이렇게 하면 Maven Central과 같은 리포지토리 요구 사항을 충족시키기 위한 문제가 발생하며, 이제 이 모듈에 포함된 메타데이터 artifacts와 충돌이 발생합니다.
1.4.20에서 발행된 라이브러리와의 호환성
계층적 프로젝트 구조 지원을 활성화하고 Kotlin 1.4.20 이상에서 이러한 지원을 사용하는 multiplatform library를 사용하려면 프로젝트에서 Kotlin을 버전 1.4.20 이상으로 업그레이드해야 합니다. 그러나 hierarchical project structure 지원을 사용하지 않는 경우 이전 Kotlin 버전을 사용하는 사용자는 여전히 라이브러리를 사용할 수 있습니다.
라이브러리 저자이고 Kotlin 1.4.20 이상에서 hierarchical project structure 지원을 사용하여 multiplatform library를 발행하는 경우, 이러한 지원을 사용하지 않는 이전 Kotlin 버전을 사용하는 사용자는 라이브러리를 사용할 수 없게됩니다. 그들은 Kotlin을 1.4.20 이상으로 업그레이드해야 합니다.
그러나 또한 hierarchical project structure 지원을 사용하지 않는 경우, 이전 Kotlin 버전을 사용하는 사용자는 여전히 라이브러리를 사용할 수 있습니다.
자세한 내용은 multiplatform library를 발행하는 방법에 대해 알아보세요.
표준 라이브러리 변경 사항
java.nio.file.Path에 대한 확장
1.4.20부터 표준 라이브러리에서는 java.nio.file.Path에 대한 실험적인 확장 기능을 제공합니다.
이러한 확장은 kotlin.io.path 패키지에 있습니다. Path 자체는 JDK 7 이상에서 사용 가능하므로 확장은 kotlin-stdlib-jdk7 모듈에 배치됩니다. 이를 사용하려면 실험적인 주석 ExperimentalPathApi에 동의해야 합니다.
// div (/) 연산자를 사용하여 경로 생성
val baseDir = Path("/base")
val subDir = baseDir / "subdirectory"
// 디렉터리에서 파일 목록 가져오기
val kotlinFiles: List<Path> = Path("/home/user").listDirectoryEntries("*.kt")
String.replace 함수의 성능 향상
Kotlin 커뮤니티에서 개선 제안이 나올 때마다 우리는 항상 기뻐합니다. 다음 내용은 그 중 하나입니다. 이번 릴리스에서는 String.replace() 함수의 구현을 변경했습니다.
대소문자 구분 기능은 indexOf를 기반으로 한 수동 대체 루프를 사용하고, 대소문자 구분하지 않는 기능은 정규 표현식 일치를 사용합니다.
이 개선으로 함수의 실행이 특정 경우에 빨라집니다.
Kotlin Android Extensions의 폐기
Kotlin Android Extensions을 처음 만들었을 때부터 Android 생태계에서 Kotlin의 인기 성장에 큰 역할을 해 왔습니다. 이러한 확장 기능을 통해 개발자들에게 보일러플레이트 코드를 줄이는 편리하고 효율적인 도구를 제공했습니다.
- UI 상호 작용을위한 Synthetic 뷰 (kotlinx.android.synthetics) 및 객체를 Parcel로 전달하기위한 Parcelable 구현 생성기 (@Parcelize) 등을 포함합니다.
- 초기에는 kotlin-android-extensions에 더 많은 구성 요소를 추가하는 것을 고려했지만, 이러한 추가는 이루어지지 않았으며 사용자로부터 플러그인을 독립적인 부분으로 분리하도록 요청받은 적도 있습니다.
다른 한편으로, Android 생태계는 항상 진화하고 있으며 개발자들은 작업을 더 쉽게 만드는 새로운 도구를 얻고 있습니다. Kotlin Android Extensions로 채워졌던 일부 공백은 이제 Google의 네이티브 메커니즘에 의해 처리되었습니다. 예를 들어, UI 상호 작용에 대한 간결한 구문과 관련하여 Kotlin synthetics와 마찬가지로 findViewById를 대체하는 Android Jetpack이 있습니다.
이러한 두 가지 요인을 고려하여 synthetics를 사용하지 않고 view 바인딩을 선호하고 Parcelable 구현 생성기를 별도의 플러그인으로 이동하기로 결정했습니다.
1.4.20에서는 kotlin-android-extensions에서 Parcelable 구현 생성기를 추출하고 나머지 부분에 대한 폐기 주기를 시작했습니다. 현재로서는 경고와 함께 계속 작동합니다. 미래에는 프로젝트를 다른 솔루션으로 전환해야 할 것입니다. Android 프로젝트를 synthetics에서 view 바인딩으로 마이그레이션하는 지침은 다음과 같습니다.
Parcelable 구현 생성기는 이제 새로운 kotlin-parcelize 플러그인에서 사용할 수 있습니다. kotlin-android-extensions 대신 이 플러그인을 적용하십시오. @Parcelize 주석은 kotlinx.parcelize 패키지로 이동했습니다. kotlin-parcelize와 kotlin-android-extensions를 한 모듈에서 동시에 적용할 수 없음을 유의하십시오.
Kotlin을 최신 버전으로 업데이트하는 방법
Kotlin의 최신 버전으로 프로젝트를 업데이트하기 전에 play.kotl.in에서 새로운 언어 및 표준 라이브러리 기능을 온라인으로 시도해볼 수 있습니다.
IntelliJ IDEA 및 Android Studio에서 Kotlin 플러그인을 버전 1.4.20으로 업데이트할 수 있습니다. 업데이트 방법은 여기에서 확인하세요.
이전 버전의 Kotlin으로 작성된 기존 프로젝트에서 작업하려면 프로젝트 구성에서 1.4.20 Kotlin 버전을 사용하십시오. 자세한 내용은 Gradle 및 Maven 문서를 참조하십시오.
GitHub 릴리스 페이지에서 명령줄 컴파일러를 다운로드할 수 있습니다.
이 릴리스와 함께 다음 라이브러리 버전을 사용할 수 있습니다:
- kotlinx.atomicfu 버전 0.14.4
- kotlinx.coroutines 버전 1.4.1
- kotlinx.serialization 버전 1.0.1
- ktor 버전 1.4.1
- kotlinx.html 버전 0.7.2
- kotlinx-nodejs 버전 0.0.6
kotlin-wrappers (kotlin-react 등)의 라이브러리 버전은 해당 저장소에서 찾을 수 있습니다.
릴리스 세부 정보 및 호환 라이브러리 목록은 여기에서도 확인할 수 있습니다.
새 릴리스에 문제가 발생하면 Slack에서 도움을 얻을 수 있으며 문제를 YouTrack에서 보고할 수 있습니다.
외부 기여자
이 릴리스에 포함된 pull request를 제출한 모든 외부 기여자에게 감사드립니다:
- Jinseong Jeon
- Toshiaki Kameyama
- Steven Schäfer
- Mads Ager
- Mark Punzalan
- Ivan Gavrilovic
- pyos
- Jim Sproch
- Kristoffer Andersen
- Aleksandrina Streltsova
- cketti
- Konstantin Virolainen
- AJ Alt
- Henrik Tunedal
- Juan Chen
- KotlinIsland,
- Valeriy Vyrva
- Alex Chmyr
- Alexey Kudravtsev
- Andrey Matveev
- Aurimas Liutikas
- Dat Trieu
- Dereck Bridie
- Efeturi Money
- Elijah Verdoorn
- Enteerman
- fee1-dead
- Francesco Vasco
- Gia Thuan Lam
- Guillaume Darmont
- Jake Wharton
- Julian Kotrba
- Kevin Bierhoff
- Matthew Gharrity
- Matts966
- Raluca Sauciuc
- Ryan Nett
- Sebastian Kaspari
- Vladimir Krivosheev
- n-p-s
- Pavlos-Petros Tournaris
- Robert Bares
- Yoshinori Isogai
- Kris
- Derek Bodin
- Dominik Wuttke
- Sam Wang
- Uzi Landsmann
- Yuya Urano
- Norbert Nogacki
- Alexandre Juca
원문
https://blog.jetbrains.com/kotlin/2020/11/kotlin-1-4-20-released/
댓글