Android Gradle 플러그인 3.6.0(2020년 2월)
이 버전의 Android 플러그인에는 다음이 필요합니다.
-
Gradle 5.6.4. 자세한 내용은 Gradle 업데이트하기 섹션을 읽어보세요.
새로운 기능
이 버전의 Android Gradle 플러그인에는 다음과 같은 새로운 기능이 포함됩니다.
뷰 결합
뷰 결합에서는 코드에서 뷰를 참조할 때 컴파일 시간 안전성을 제공합니다. 이제 findViewById()
를 자동 생성된 결합 클래스 참조로 대체할 수 있습니다. 뷰 결합을 사용하려면 각 모듈의 build.gradle
파일에 다음을 포함하세요.
android { viewBinding.enabled = true }
android { viewBinding.enabled = true }
자세한 내용은 뷰 결합 문서를 참고하세요.
Maven Publish 플러그인 지원
Android Gradle 플러그인에는 빌드 아티팩트를 Apache Maven 저장소에 게시할 수 있는 Maven Publish Gradle 플러그인 지원 기능이 포함되어 있습니다. Android Gradle 플러그인은 Maven 저장소에 대한 게시를 맞춤설정하는 데 사용할 수 있는 앱 또는 라이브러리 모듈의 빌드 변형 아티팩트마다 구성요소를 생성합니다.
자세한 내용은 Maven Publish 플러그인 사용 방법에 관한 페이지를 참고하세요.
새로운 기본 패키징 도구
앱의 디버그 버전을 빌드할 때 플러그인은 zipflinger라는 새로운 패키징 도구를 사용하여 APK를 빌드합니다. 이 새로운 도구를 사용하면 빌드 속도가 향상됩니다. 새 패키징 도구가 제대로 작동하지 않으면 버그를 신고하세요. 다음을 gradle.properties
파일에 포함하면 이전 패키징 도구를 사용하도록 되돌릴 수 있습니다.
android.useNewApkCreator=false
네이티브 빌드 속성
이제 Clang이 프로젝트의 각 C/C++ 파일을 빌드하고 링크하는 데 걸리는 시간을 결정할 수 있습니다. Gradle은 이러한 컴파일러 이벤트의 타임스탬프를 포함하는 Chrome 트레이스를 출력할 수 있으며 이에 따라 프로젝트를 빌드하는 데 필요한 시간을 더 잘 파악할 수 있습니다. 이 빌드 속성 파일을 출력하려면 다음 단계를 따르세요.
-
Gradle 빌드를 실행할 때
-Pandroid.enableProfileJson=true
플래그를 추가합니다. 예를 들면 다음과 같습니다.gradlew assembleDebug -Pandroid.enableProfileJson=true
-
Chrome 브라우저를 열고 검색창에
chrome://tracing
을 입력합니다. -
로드 버튼을 클릭하고
<var>project-root</var>/build/android-profile
로 이동하여 파일을 찾습니다. 파일 이름은profile-<var>timestamp</var>.json.gz
입니다.
뷰어 상단에서 네이티브 빌드 속성 데이터를 볼 수 있습니다.
동작 변경사항
이 버전의 플러그인을 사용하면 동작에 다음과 같은 변경사항이 나타날 수 있습니다.
네이티브 라이브러리가 기본적으로 압축되지 않고 패키징됨
앱을 빌드하면 기본적으로 플러그인이 extractNativeLibs
를 "false"
로 설정합니다. 즉, 네이티브 라이브러리가 페이지 정렬되고 압축되지 않은 상태로 패키징됩니다. 이렇게 하면 업로드 크기는 커지지만 사용자에게 다음과 같은 장점이 있습니다.
- 플랫폼이 라이브러리 사본을 생성하지 않고 설치된 APK에서 직접 네이티브 라이브러리에 액세스할 수 있기 때문에 앱 설치 크기가 더 작습니다.
- APK 또는 Android App Bundle에 압축되지 않은 네이티브 라이브러리를 포함할 때 일반적으로 Play 스토어에서 압축이 더 많이 되므로 다운로드 크기가 더 작습니다.
패키지 압축 네이티브 라이브러리 대신 Android Gradle 플러그인을 사용하려면 앱 매니페스트에 다음을 포함하세요.
<application
android:extractNativeLibs="true"
... >
</application>
참고: extractNativeLibs
매니페스트 속성은 useLegacyPackaging
DSL 옵션으로 대체되었습니다. 자세한 내용은 DSL을 사용하여 압축된 네이티브 라이브러리 패키징 출시 노트를 참고하세요.
기본 NDK 버전
여러 버전의 NDK를 다운로드하면 이제 Android Gradle 플러그인이 소스 코드 파일을 컴파일할 때 사용할 기본 버전을 선택합니다.
이전에는 플러그인이 가장 최근에 다운로드한 NDK 버전을 선택했습니다.
모듈의 build.gradle
파일에서 android.ndkVersion
속성을 사용하여 플러그인에서 선택한 기본값을 재정의합니다.
간소화된 R 클래스 생성
Android Gradle 플러그인은 프로젝트의 라이브러리 모듈마다 R 클래스 하나만 생성하고 이러한 R 클래스를 다른 모듈 종속 항목과 공유함으로써 컴파일 클래스 경로를 단순화합니다. 이렇게 최적화하면 빌드 속도는 빨라지지만 다음 사항에 유의해야 합니다.
- 컴파일러가 업스트림 모듈 종속 항목과 R 클래스를 공유하므로 프로젝트에 포함된 각 모듈이 고유한 패키지 이름을 사용해야 합니다.
- 라이브러리의 R 클래스가 다른 프로젝트 종속 항목에 보이는지 여부는 라이브러리를 종속 항목으로 포함하는 데 사용된 설정에 의해 결정됩니다. 예를 들어 A 라이브러리에 B 라이브러리가 'api' 종속 항목으로 포함되어 있으면 A 라이브러리 및 A 라이브러리에 종속된 다른 라이브러리는 B 라이브러리의 R 클래스에 액세스할 수 있습니다. 하지만 다른 라이브러리는 B 라이브러리의 R 클래스에 액세스하지 못할 수 있습니다. 이는 A 라이브러리가
implementation
종속 항목 구성을 사용하는 경우에 적용됩니다. 자세한 내용은 종속 항목 구성을 참고하세요.
기본 설정에 없는 리소스 삭제
라이브러리 모듈의 경우 기본 리소스 세트에 포함하지 않은 언어의 리소스를 포함하면(예: /values-es/strings.xml
에 hello_world
를 문자열 리소스로 포함하며 /values/strings.xml
에 이 리소스를 정의하지 않음) Android Gradle 플러그인이 프로젝트를 컴파일할 때 더 이상 해당 리소스를 포함하지 않습니다. 이와 같이 작업을 변경하면서 Resource Not Found
런타임 예외가 줄었고 빌드 속도가 향상되었습니다.
이제 D8이 주석의 CLASS 보관 정책을 따름
앱을 컴파일할 때 이제 D8은 주석이 CLASS 보존 정책을 적용할 시점을 따르며 이러한 주석은 더 이상 런타임에 사용할 수 없습니다. 이러한 동작은 앱의 타겟 SDK를 API 수준 23으로 설정할 때도 실시되며 전에는 Android Gradle 플러그인 및 D8의 이전 버전을 사용하는 앱을 컴파일할 때 런타임 동안 이러한 주석에 액세스하도록 허용했습니다.
기타 동작 변경사항
aaptOptions.noCompress
는 모든 플랫폼에서 더 이상 대소문자를 구분하지 않으며(APK 및 번들 모두 해당) 대문자를 사용하는 경로를 우선으로 따릅니다.-
이제 데이터 결합이 기본적으로 증가합니다. 자세한 내용은 문제 #110061530을 참고하세요.
-
Roboelectric 단위 테스트를 포함한 모든 단위 테스트는 이제 완전히 캐시 가능합니다. 자세한 내용은 문제 #115873047을 참고하세요.
버그 수정
이 Android Gradle 플러그인 버전에서는 다음과 같은 버그가 수정되었습니다.
- 이제 데이터 결합을 사용하는 라이브러리 모듈에서 Robolectric 단위 테스트가 지원됩니다. 자세한 내용은 문제 #126775542를 참고하세요.
- 이제 Gradle의 동시 실행 모드가 사용 설정된 동안 여러 모듈에서
connectedAndroidTest
작업을 실행할 수 있습니다.
알려진 문제
이 섹션에서는 Android Gradle 플러그인 3.6.0에서 발생한 알려진 문제에 관해 설명합니다.
Android 린트 작업의 성능 속도 저하
Android 린트가 일부 프로젝트에서 완료하는 데 훨씬 오래 걸릴 수 있습니다. 이는 파싱 인프라의 회귀 때문으로 특정 코드 구성의 람다 관련 추론된 형식의 계산이 느려집니다.
이 문제는 IDEA 버그로 신고되었으며 Android Gradle 플러그인 4.0에서 해결될 예정입니다.
매니페스트 클래스 누락 {:#agp-missing-manifest}
앱이 매니페스트에 맞춤 권한을 정의하면 Android Gradle 플러그인은 일반적으로 맞춤 권한을 문자열 상수로 포함하는 Manifest.java
클래스를 생성합니다. 플러그인은 이 클래스를 앱과 패키지로 구성하므로 런타임 시 이러한 권한을 더 쉽게 참조할 수 있습니다.
Android Gradle 플러그인 3.6.0에서 매니페스트 클래스 생성이 손상됩니다.
이 플러그인 버전으로 앱을 빌드하고 매니페스트 클래스를 참조한다면 ClassNotFoundException
예외가 표시됩니다. 이 문제를 해결하려면 다음 중 한 가지를 따르세요.
-
정규화된 이름으로 맞춤 권한을 참조합니다. 예:
"com.example.myapp.permission.DEADLY_ACTIVITY"
-
아래와 같이 자체 상수를 정의합니다.
public final class CustomPermissions { public static final class permission { public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY"; } }