Android 스튜디오 Dolphin | 2021.3.1 (2022년 9월)

다음은 Android 스튜디오 Dolphin의 새로운 기능입니다.

Compose의 새로운 기능

다음은 Android 스튜디오의 Jetpack Compose 관련 새로운 기능과 개선사항입니다.

Compose 애니메이션 조정

애니메이션이 컴포저블 미리보기에 설명된 경우 이제 애니메이션 미리보기를 사용하여 모든 애니메이션을 한 번에 검사하고 조정할 수 있습니다. 특정 애니메이션을 정지할 수도 있습니다.

모든 애니메이션 UI를 사용한 검사가 표시된 GIF

Compose 다중 미리보기 주석

이제 여러 미리보기 정의가 포함된 주석 클래스를 정의하고 새 주석을 사용하여 이러한 미리보기를 한 번에 생성할 수 있습니다. 이 새 주석을 사용하면 모든 단일 컴포저블에서 이러한 정의를 반복하지 않고도 여러 기기, 글꼴, 테마를 동시에 미리 볼 수 있습니다.

다중 미리보기 주석 UI

Layout Inspector의 Compose 리컴포지션 횟수

Compose 레이아웃을 디버깅할 때는 컴포저블이 재구성되거나 재구성되지 않는 시점을 아는 것이 UI가 올바르게 구현되었는지 이해하는 데 중요합니다. 예를 들어 너무 많이 재구성되는 경우 앱이 필요한 것보다 더 많은 작업을 실행하고 있을 수 있습니다. 반면에 예상대로 재구성되지 않는 구성요소는 예기치 않은 동작을 유발할 수 있습니다.

이제 Layout Inspector를 사용하면 레이아웃 계층 구조의 개별 컴포저블이 재구성되거나 건너뛴 시점을 확인할 수 있습니다. 이 정보는 앱과 상호작용하는 동안 실시간으로 표시됩니다. 시작하려면 앱에서 Compose 1.2.0-alpha03 이상을 사용하고 있는지 확인하세요. 그런 다음 평소처럼 앱을 배포합니다.

Layout Inspector의 새 컴포지션 및 건너뛰기 카운터

Layout Inspector 창을 열고 앱 프로세스에 연결합니다. Component Tree에서 레이아웃 계층 구조 옆에 새 열 두 개가 표시됩니다. 첫 번째 열에는 각 노드의 컴포지션 수가 표시됩니다. 두 번째 열에는 각 노드의 건너뛰기 수가 표시됩니다. Component Tree 또는 Layout Display에서 컴포저블을 선택하면 Attributes 창에서도 비슷한 정보를 확인할 수 있습니다.

개수를 재설정하려면 Component Tree 패널 상단에서 Reset을 클릭합니다. 개수를 재설정하면 앱과의 특정 상호작용 중에 리컴포지션 또는 건너뛰기를 이해하는 데 도움이 됩니다.

Layout Inspector에서 컴포지션 및 건너뛰기 카운터 사용 설정

업데이트된 Wear OS 에뮬레이터 페어링 어시스턴트

Android 스튜디오 Dolphin Canary 3부터 Wear OS 에뮬레이터 페어링 어시스턴트에서는 Wear 에뮬레이터를 더 쉽게 관리하고 연결할 수 있는 개선된 기능을 제공합니다. 이제 다음 작업을 할 수 있습니다.

  • 기기 관리도구에서 Wear 기기를 확인합니다.
  • 여러 Wear 기기를 하나의 가상 또는 실제 휴대전화와 페어링합니다.
  • 이전에 페어링된 기기가 실행되면 이를 자동으로 다시 연결합니다. 이제 Android 스튜디오가 마지막 페어링 설정을 기억하고 다시 페어링합니다.

이러한 새 기능을 사용하려면 휴대전화 에뮬레이터가 API 수준 30 이상이고 Google Play 스토어가 설치되어 있어야 합니다. 또한 Wear 에뮬레이터가 API 수준 28 이상이어야 합니다. 에뮬레이션된 기기의 최신 시스템 이미지로 업그레이드하려면 Tools > SDK Manager로 이동하세요.

자세한 내용은 Wear OS 에뮬레이터 페어링 어시스턴트 사용을 참고하세요.

업데이트된 Wear OS 에뮬레이터 툴바

Android 스튜디오 Dolphin Canary 2부터 API 수준 28 이상이 적용된 Wear 에뮬레이터의 경우 에뮬레이터 툴바에 이제 기기의 실제 버튼과 일반적인 작업을 시뮬레이션하는 버튼이 있습니다. 새 버튼은 버튼 1과 버튼 2(버튼 2는 API 수준 30 이상에만 제공됨), 손바닥 버튼, 기울이기 버튼입니다. 다음은 Wear 에뮬레이터에서 새 버튼을 사용하여 할 수 있는 작업입니다.

  • 기기를 대기 모드로 설정하려면 손바닥 버튼을 클릭합니다.
  • 대기 모드 전 마지막 화면으로 기기를 되돌리려면 기울이기 버튼을 클릭합니다.

자세한 내용은 에뮬레이터에서 일반적인 작업 실행을 참고하세요.

Wear 전용 버튼이 있는 Wear 에뮬레이터

새 Wear OS 실행 구성

시계 화면, 카드, 정보 표시와 같은 Wear OS와 관련된 노출 영역을 빠르게 실행하고 디버그할 수 있도록 새로운 실행 구성을 추가했습니다. 애플리케이션을 실행할 때 Run/Debug Configurations 대화상자에서 이러한 새 구성을 만들 수 있습니다.

자세한 내용은 Wear OS 실행/디버그 구성을 참고하세요.

WearOS 새 실행 구성

새 Logcat

로그를 더 쉽게 파싱, 쿼리, 추적할 수 있도록 Logcat을 업데이트했습니다.

새 형식 지정 도구

이제 Logcat에서 태그, 메시지 등 유용한 정보를 더 쉽게 검사하고 경고, 오류와 같은 다양한 유형의 로그를 더 쉽게 식별할 수 있도록 로그 형식을 지정합니다.

Logcat의 새로운 로그 형식 지정

여러 Logcat 창 만들기

이제 Logcat 내에서 여러 탭을 만들어 여러 기기나 쿼리 간에 쉽게 전환할 수 있습니다. 탭을 마우스 오른쪽 버튼으로 클릭하면 탭 이름을 바꿀 수 있으며 탭을 클릭한 후 드래그하여 재정렬할 수 있습니다.

또한 좀 더 쉽게 두 로그 세트를 비교할 수 있도록 이제 로그 뷰에서 마우스 오른쪽 버튼을 클릭하고 Split Right 또는 Split Down을 선택하여 탭 내 뷰를 분할할 수 있습니다. 분할을 닫으려면 마우스 오른쪽 버튼을 클릭하고 Close를 선택합니다. 각 분할을 통해 자체 기기 연결, 뷰 옵션, 쿼리를 설정할 수 있습니다.

분할을 사용하여 여러 logcat 창 만들기

뷰 미리 설정 간 전환

Logcat을 사용하면 이제 뷰 모드 선택기를 클릭하여 여러 뷰 모드(Standard, Compact, Custom) 간에 빠르게 전환할 수 있습니다. 각 뷰 모드는 타임스탬프, 태그, 프로세스 ID(PID)와 같은 정보를 더 많이 표시하거나 더 적게 표시하는 다양한 기본 설정을 제공합니다. Modify View를 선택하여 이러한 각 기본 뷰 모드는 물론 맞춤 뷰 모드도 맞춤설정할 수 있습니다.

다양한 뷰 모드 간 전환을 보여주는 스크린샷

이전 버전의 Logcat에서는 문자열 검색을 사용하거나(정규 표현식 지원), Logcat UI를 사용해 다양한 필드를 채워 새 필터를 만드는 옵션이 있었습니다. 첫 번째 옵션은 검색을 더 복잡하게 만들었고 두 번째 옵션은 쿼리 공유 및 설정을 더 어렵게 만들었습니다. 이제 기본 쿼리 필드에서 바로 키-값 검색을 할 수 있으므로 환경이 간소화되었습니다.

자동 완성 기능이 있는 새 쿼리 문법 스크린샷

이 새로운 쿼리 시스템은 정규 표현식에 의존하지 않으면서 기록에서 이전 쿼리를 기억하고 이러한 쿼리를 다른 사용자와 공유하는 기능을 통해 쿼리하려는 항목의 정확성을 제공합니다. 또한 여전히 정규식을 사용할 수 있으며 키-값을 기반으로 로그도 제외할 수 있습니다. 다음은 새 쿼리 시스템의 사용 방법을 보여주는 예입니다. 하지만 간단히 쿼리 필드에 입력을 시작하여 추천을 볼 수도 있습니다.

  • 로컬 앱 프로젝트의 PID: package:mine
  • 특정 값:
    • package:<package-ID>
    • tag:<tag>
    • level:[VERBOSE | INFO | ASSERT |DEBUG | WARN | ERROR ]
  • 키 앞에 -를 추가하여 특정 값을 제외합니다.
    • -tag:<exclude-tag>
  • 키 뒤에 ~를 배치하여 주어진 키로 정규 표현식을 사용합니다.
    • tag~:<regular-expression-tag>
    • exclude 태그와 결합: -tag~:<exclude-regular-expression-tag>

쿼리 필드에서 쿼리 기록 선택기를 클릭하고 드롭다운에서 선택하여 쿼리 기록을 확인할 수도 있습니다. 모든 스튜디오 프로젝트에서 목록 상단에 유지되도록 쿼리를 즐겨찾기에 추가하려면 쿼리 필드 끝에 있는 즐겨찾는 쿼리를 클릭합니다.

즐겨찾기가 포함된 쿼리 기록 스크린샷

앱 비정상 종료/다시 시작 시 로그 추적

이제 새로운 Logcat을 사용하면 앱 비정상 종료 및 다시 시작 시 앱의 로그를 더 쉽게 추적할 수 있으므로 이러한 이벤트가 발생할 때 중요한 로그가 누락되지 않습니다. Logcat이 앱 프로세스가 중지되고 다시 시작된 것을 확인하면 다음과 같이 출력에 PROCESS ENDEDPROCESS STARTED와 같은 메시지가 표시됩니다.

logcat의 프로세스 다시 시작 스크린샷

또한 Logcat을 다시 시작하면 탭 분할, 필터, 뷰 옵션과 같은 세션 구성이 유지되므로 쉽게 세션을 계속할 수 있습니다.

Gradle 관리 기기

자동화된 계측 테스트에 Android Virtual Device를 사용할 때 일관성과 성능, 안정성을 개선하기 위해 Google에서는 Gradle 관리 기기를 도입합니다. API 수준 27 이상에 제공되는 이 기능을 사용하면 프로젝트의 Gradle 파일에서 가상 테스트 기기를 구성할 수 있습니다. 빌드 시스템은 자동 테스트를 실행할 때 이 구성을 사용하여 이러한 기기를 완전히 관리(생성, 배포, 해체)합니다.

이 기능을 사용하면 실행 중인 테스트뿐만 아니라 기기의 수명 주기까지 Gradle이 파악할 수 있으므로 다음과 같은 방식으로 테스트 환경의 품질이 개선됩니다.

  • 테스트가 실행될 수 있도록 기기 관련 문제를 처리합니다.
  • 에뮬레이터 스냅샷을 활용하여 기기 시작 시간과 메모리 사용량을 개선하고 테스트 사이에 기기를 깔끔한 상태로 복원합니다.
  • 테스트 결과를 캐시하고 다른 결과를 제공할 가능성이 높은 테스트만 다시 실행합니다.
  • 로컬 테스트 실행과 원격 테스트 실행 간에 일관된 테스트 실행 환경을 제공합니다.

또한 Gradle 관리 기기에는 계측 테스트를 실행할 때 성능을 개선하는 데 최적화된 새로운 유형의 에뮬레이터 기기인 자동 테스트 기기(ATD)가 도입되었습니다. 테스트 샤딩 지원과 함께 사용하면 전체 테스트 실행 시간을 줄이기 위해 테스트 모음을 여러 ATD 인스턴스에 분할하는 실험을 할 수 있습니다. Gradle 관리 기기 및 관련 기능에 관한 자세한 내용은 Gradle 관리 기기로 테스트 확장을 참고하세요.

DEX 명령 오프셋에 기반한 매핑 파일을 사용하는 R8 지원

줄 정보를 최적화할 때 이제 R8이 명령 오프셋에 기반한 줄 표를 사용하여 공유 디버그 정보 객체의 정보를 인코딩할 수 있습니다. 이렇게 하면 줄 정보의 오버헤드가 크게 줄어듭니다. 그 결과, 메서드의 줄이 더 이상 연속되지 않고 명령의 크기에 따라 다른 간격으로 건너뛸 수 있습니다. 일부 도구에서는 이 공유 인코딩을 고려하지 않습니다.

또한 O(API 수준 26)부터 Android VM은 메서드에 줄 번호 정보가 없는 경우 스택 트레이스의 명령 오프셋 출력을 지원합니다. minSdk 26 이상으로 컴파일하고 소스 파일 정보가 없는 경우 R8은 줄 번호 정보를 완전히 제거합니다.

스테이트리스(Stateless) 람다는 더 이상 싱글톤으로 디슈가링되지 않음

디슈가링 시 스테이트리스(Stateless) 람다는 더 이상 싱글톤으로 할당되지 않습니다. 싱글톤으로 표현하면, 추가된 필드 및 클래스 이니셜라이저로 인해 코드 크기 오버헤드가 추가되고 정적 클래스 초기화로 인해 시작 오버헤드도 추가됩니다. 이제 스테이트리스(Stateless) 람다가 스테이트풀(Stateful) 람다(캡처가 있는 람다)와 동일한 방식으로 사용 사이트에 할당됩니다.

R8을 사용하면 Android 런타임에서 인증 속도가 느려지지 않음

Android 런타임(Dalvik 및 ART)에서 성능 문제를 제거하기 위해 이제 R8(D8 아님)이 런타임에 존재하지 않을 수 있는 라이브러리 클래스 및 메서드를 위해 라이브러리 스텁 및 개요 호출을 라이브러리 메서드에 도입합니다. 이렇게 하면 많은 인증 문제가 제거되며 런타임 성능이 개선됩니다. 이 기능은 항상 사용 설정되어 있습니다.

자바 8+ API 디슈가링이 포함된 JDK-11 API 지원

coreLibraryDesugaring 종속 항목을 사용할 때 이제 JDK-11 기반의 구현 라이브러리를 지원합니다. 자세한 내용은 desugar_jdk_libs 변경 로그를 참고하세요.

패치 출시

다음은 Android 스튜디오 Dolphin 패치 출시 목록입니다.

Android 스튜디오 Dolphin | 2021.3.1 패치 1 (2022년 10월)

Android 스튜디오 Dolphin 패치 1에서는 이제 Kotlin 플러그인 1.7.20을 지원합니다. 이번 소규모 업데이트는 다음과 같은 버그 수정도 포함합니다.

해결된 문제
Android Gradle 플러그인
Gradle을 통해 계측된 Android 테스트를 실행하면 디슈가링이 제대로 적용되지 않음
AGP 7.3.0이 gradle 플랫폼 프로젝트의 gradle 동기화를 중단함
Dexer(D8)
DEX 병합 시 충돌 해결을 위한 공개 API 추가(Bazel에서 중복 클래스를 허용하도록)
가져오기/동기화
Chipmunk 패치 2(2021.2.1)에서 업그레이드한 후 Gradle 프로젝트 가져오기가 실패함
리소스
AarResourceRepositoryCache.createCachingData(AS Dolphin+)의 NPE
축소기(R8)
필드 유형을 대체할 때 Kotlin 메타데이터가 복사되지 않음
예기치 못한 부정확한 유형 전환: TOP(전체)
Gradle 7.3.0으로 인해 APK 빌드 오류 com.android.tools.r8.CompilationFailedException
compat 모드에서 비활성 기본 생성자 제거
JetBrains 마크다운과 충돌
ThreadLocal.withInitial(java.util.function.Vendor 지원)
AGP 7.3이 생성자가 손상된 클래스 dex를 생성
CF가 아닌 코드에 디슈가링이 필요한지 확인하는 예기치 않은 시도
ktor VerifyError
okio-jvm 3.2.0을 처리할 때 컴파일 중에 정의되지 않은 값이 발생함
사용자의 간접적인 인스턴스를 사용하여 객체를 인라인하는 클래스의 컴파일 실패
R8 3.3.75의 java.lang.IllegalAccessError