Android Dev Summit, October 23-24: two days of technical content, directly from the Android team. Sign-up for livestream updates.

Android 스튜디오 미리보기의 새로운 기능

Android 스튜디오 3.4가 공개 버전 채널로 출시되었습니다. 여기에서 다운로드하세요.

Android 스튜디오 3.5는 현재 베타 채널로 배포 중입니다.

Android 스튜디오 3.6은 현재 Canary 및 개발자 채널로 배포 중입니다.

이 페이지에서는 이러한 미리보기 버전의 새로운 기능과 변경사항을 간략히 설명합니다.

각 출시 버전의 주목할 만한 수정사항 목록을 비롯한 최신 출시 소식은 버전 업데이트를 참조하세요.

Android 스튜디오의 미리보기 버전을 사용하는 동안 문제가 발생하면 알려주시기 바랍니다. 버그 신고는 Android 스튜디오 개선에 도움이 됩니다.

Android 스튜디오 3.5

이 섹션에서는 Android 스튜디오 3.5의 새로운 기능과 변경사항을 간략히 설명합니다.

Project Marble 업데이트

Project Marble은 시스템 상태와 기능을 크게 개선하고 버그를 줄이기 위한 Android 스튜디오 이니셔티브입니다. Android 스튜디오 3.5에는 다음과 같이, 이 목표를 달성하기 위한 다양한 개선사항이 포함되어 있습니다.

  • 데이터 결합 라이브러리 사용시 편집기 창의 UI 지연 시간 감소 및 스마트 편집기 기능 개선
  • 증분 주석 처리를 통해 빌드 속도 향상
  • Android NDK 사용시 성능 개선
  • 여러 가지 메모리 누출을 완화하여 Lint 검사 성능 개선
  • Windows에서 바이러스 백신 소프트웨어로 인한 빌드 속도 회귀를 완화하기 위한 새로운 알림 작업
  • Android 에뮬레이터 사용시 CPU 사용량 크게 감소
  • 삭제된 빌드 캐시를 조정하여 Gradle 동기화 성능 개선
  • IDE 및 Android Gradle 플러그인을 업데이트하는 데 도움이 되는 추가 정보와 작업을 제공하기 위해 업데이트 환경 개선
  • Layout Editor의 성능 및 UX 개선

Project Marble 업데이트에 관한 내용은 Android 개발자 블로그 게시물 또는 아래 섹션을 참조하세요.

증분 주석 처리

Android Gradle 플러그인 3.5.0-beta01 이상을 사용하는 경우 데이터 결합과 같은 훨씬 더 많은 주석 프로세서가 증분 자바 컴파일링을 지원합니다. 이 최적화에 따라 증분 빌드 성능이 개선됩니다. 전체 목록은 증분 주석 프로세서 표를 참조하세요.

또한, KAPT 1.3.30 이상도 증분 주석 프로세서를 지원하며, 이 프로세서는 gradle.properties 파일에 kapt.incremental.apt=true를 포함하여 사용 설정할 수 있습니다.

메모리 관리 설정

RAM이 5GB 이상인 64비트 운영체제를 사용하는 경우, 이제 OS에서 코어 IDE, Gradle 데몬, Kotlin 데몬 등 Android 스튜디오 프로세스에 할당해야 하는 RAM의 최대 크기를 구성할 수 있습니다. Android 스튜디오 성능을 높이기 위해 각 프로세스에 최적의 메모리 양을 제공하려면 이 설정을 사용하세요.

Android 스튜디오 프로세스의 최대 RAM 크기를 구성할 수 있는 메모리 설정

그림 1. Android 스튜디오의 메모리 설정

File > Settings(macOS의 경우 Android Studio(Android 스튜디오) > Preferences(환경설정))를 선택한 다음 Appearance & Behavior > System Settings 아래에서 Memory Settings 섹션을 찾아 이 새 설정에 액세스할 수 있습니다.

메모리 사용량 보고서

Android 스튜디오의 메모리 문제는 때때로 재현하고 보고하기 어렵습니다. 이 문제를 해결하는 데 도움이 되도록 Android 스튜디오에는 이제 메모리 사용량 보고서가 포함되어 있으며, 이 보고서를 Android 스튜디오팀에 보내 메모리 문제의 원인을 식별하는 데 도움을 줄 수 있습니다. Canary, 베타, 출시 후보 등 미리보기 버전의 경우 Android 스튜디오에서 자동으로 메모리 사용량을 모니터링하고 메모리 부족 임계값에 자주 도달한 것이 감지되면 메모리 힙 분석을 트리거합니다.

힙 분석이 트리거된 후 Android 스튜디오에서 힙 덤프를 로컬로 캡처하고 다음에 Android 스튜디오를 실행할 때 힙 덤프를 분석합니다. 분석하는 동안 Android 스튜디오에서 모든 개인 데이터를 삭제하고 메모리 상태의 요약을 만듭니다. 이 요약에는 클래스와 객체 인스턴스 및 비정상적으로 큰 메모리 할당의 참조 경로가 포함됩니다.

분석이 완료된 후 Android 스튜디오에서 검토를 위한 보고서를 생성하고 그림 2와 같이 알림을 표시합니다. 메모리 사용량 보고서의 콘텐츠를 보려면 Review Report를 클릭하세요.

메모리 사용량 보고서를 검토할 준비가 되었다고 나타내는 알림

그림 2. 메모리 사용량 보고서를 검토할 수 있는 준비가 되었음을 나타내는 알림

보고서를 보내기 전에, 그림 3과 같이 포함된 모든 정보를 검토할 수 있습니다. 검토를 완료한 후 보내기를 클릭하세요. Android 스튜디오팀에서 보고서를 검토하여 발생한 문제를 해결하는 데 도움을 줍니다.

메모리 사용량 보고서

그림 3. 메모리 사용량 보고서

메모리 사용량 보고서를 수동으로 실행하려면 메뉴 바에서 Help > Analyze Memory Usage를 선택하세요. 이 옵션을 선택하면 Android 스튜디오에서 힙을 덤프하고 IDE를 다시 시작하라는 메시지를 표시합니다. IDE를 시작하면 힙 덤프 분석이 즉시 시작됩니다. 그러지 않으면, 다음에 Android 스튜디오를 실행할 때 힙 덤프 분석이 시작됩니다. 두 경우 모두 메모리 사용량 보고서를 검토할 준비가 되면 IDE에서 알려줍니다.

동적 기능 모듈을 위한 조건부 제공

조건부 제공을 사용하면 앱 설치 중에 동적 기능 모듈을 자동으로 다운로드하기 위한 특정한 기기 설정 요구사항을 지정할 수 있습니다. 예를 들어, AR을 지원하는 기기에서만 앱 설치 시 사용할 수 있도록 증강 현실(AR) 기능이 포함된 동적 기능 모듈을 구성할 수 있습니다.

이 제공 메커니즘을 통해 현재 다음과 같은 기기 구성을 기반으로 앱 설치 시 모듈의 다운로드를 관리할 수 있습니다.

기기가 지정된 모든 요구사항을 충족하지 않으면 모듈이 앱 설치 시에 다운로드되지 않습니다. 하지만, 앱에서 나중에 Play Core 라이브러리를 사용하여 모듈을 다운로드하도록 요청할 수 있습니다.

시작하기 전에 Android 스튜디오 3.5 Canary 11 이상을 사용 중인지 확인하세요.

다음 섹션에서는 동적 기능 모듈에 조건부 제공 지원 기능을 추가하는 방법을 보여줍니다. 하지만, Google Play에 동적 모듈 기능이 포함된 앱을 게시하기 위한 베타 프로그램에 가입해야 합니다.

조건부 제공 옵션을 사용하여 새 모듈 추가

조건부 제공 옵션을 사용하여 새 동적 기능 모듈을 만드는 가장 쉬운 방법은 다음과 같이 New Module 마법사를 사용하는 것입니다.

  1. New Module 대화상자를 열려면 메뉴 바에서 File > New > New Module을 선택합니다.
  2. New Module 대화상자에서 Dynamic Feature Module을 선택하고 Next를 클릭합니다.
  3. 평소처럼 모듈을 구성하고 Next를 클릭합니다.
  4. 대화상자의 Module Download Options 섹션에 있는 다음 옵션에서 Only include module at app install for devices with specified features를 선택합니다.
    • Do not include include module at app install (on-demand): 앱에서 지원하는 API 레벨 21 이상을 실행하는 모든 기기 구성의 요청 시 다운로드 옵션으로 사용할 수 있는 모듈을 만듭니다.
    • Include module at install-time: 설치 시에 앱과 함께 포함되는 모듈을 만듭니다.
    • Only include module at install-time for devices with specified features: 기기 기능 또는 국가 등 사용자가 지정할 수 있는 특정한 구성의 기기에만 앱 설치 시에 앱과 함께 포함되는 모듈을 만듭니다.
  5. 특정 국가 또는 최소 API 레벨로 모듈의 자동 다운로드를 제한하려면 Finish를 클릭하여 모듈 만들기를 완료한 다음, 국가 또는 최소 API 레벨을 기반으로 조건을 지정하는 방법에 관한 섹션을 읽어보세요.

    그렇지 않으면 + device feature를 클릭하여 기기에서 설치 시에 모듈을 다운로드하는 데 필요한 기능을 추가하세요.

  6. device-feature 옆의 드롭다운 메뉴에서 다음 옵션 중 하나를 선택하고 값을 지정합니다.

    • Name: 기기에서 설치 시에 모듈을 다운로드하는 데 필요한 하드웨어 또는 소프트웨어 기능을 지정할 수 있습니다. 조건부 제공 옵션에서 지원하는 기능은 PackageManager에 의해 FEATURE_* 상수로 나열된 기능과 같습니다.

      이 옵션을 선택한 경우 드롭다운 옆의 필드에 기능의 상수 값(예: 'bluetooth')의 일부를 입력하기 시작하고 표시되는 제안 중 하나를 선택합니다.

    • OpenGL ES Version: 기기에서 설치 시에 모듈을 다운로드하는 데 필요한 OpenGL ES의 버전을 지정할 수 있습니다. 이 옵션을 선택한 경우 드롭다운 옆의 필드에 기능의 버전(예: '0x00030001')을 입력하기 시작하고 표시되는 제안 중 하나를 선택합니다.

  7. 사용 가능한 기기 기능을 기반으로 여러 조건을 추가하려면 지정하려는 각 기기 기능 조건위 + device feature를 클릭합니다.

  8. 모듈 다운로드 옵션 구성이 완료되면 Finish를 클릭합니다.

Android 스튜디오에서 동적 기능 모듈 만들기를 완료한 후 모듈의 매니페스트를 검사하고 <dist:delivery> 노드에 지정된 조건을 확인할 수 있습니다. 아래의 예를 참조하세요.

<manifest ...>
      <dist:module ...>
        <dist:delivery>
          <dist:install-time>
            <dist:conditions>
              <!-- Requires that the device support AR to download the module at
              app install-time.  -->
              <dist:device-feature dist:name="android.hardware.camera.ar"/>
            </dist:conditions>
          </dist:install-time>
        </dist:delivery>
        ...
      </dist:module>
    </manifest>
    

기존의 동적 기능 모듈에 조건부 제공 옵션 추가

모듈의 매니페스트를 통해 기존의 동적 기능 모듈에 쉽게 조건부 제공 옵션을 추가할 수 있습니다. 하지만, 먼저 이미 사용 설정한 다른 제공 옵션과 조건부 제공 옵션의 호환성을 읽어봐야 합니다.

시작하려면 먼저 매니페스트를 새 <dist:delivery> 요소로 마이그레이션해야 합니다. 아래의 코드 스니펫은 이전 구문의 예입니다.

<dist:module
      dist:title="@string/title_dynamic_feature" dist:onDemand="true">
      <dist:fusing dist:include="true"/>
    </dist:module>
    

위의 제공 옵션은 이제 다음과 같이 지정됩니다.

<dist:module
      dist:title="@string/title_dynamic_feature">
      <dist:delivery>
          <dist:on-demand/>
      </dist:delivery>
      <dist:fusing dist:include="true"/>
    </dist:module>
    

그런 다음 아래와 같이 기기 기능을 기반으로 조건부 제공 옵션을 포함할 수 있습니다.

<dist:module
        dist:title="@string/title_dynamic_feature">
        <dist:delivery>
          <dist:on-demand/>
          <dist:install-time>
            <dist:conditions>
              <!-- Requires that the device support AR to download the module at
              app install-time.  -->
              <dist:device-feature dist:name="android.hardware.camera.ar"/>
            </dist:conditions>
          </dist:install-time>
        </dist:delivery>
        <dist:fusing dist:include="true"/>
    </dist:module>
    

아래 섹션에서는 국가별 또는 최소 API 레벨과 같은 조건부 제공 옵션을 설명합니다.

다른 모듈 다운로드 옵션과의 호환성

동적 기능 모듈은 각 기능이 사용자의 기기에 제공되는 방식을 구성하는 여러 가지 옵션을 제공하므로, 조건부 제공 옵션이 다른 설정에 어떤 영향을 받는지 이해하는 것이 중요합니다. 다음 표에는 조건부 제공과 다른 모듈 다운로드 옵션의 호환성이 요약되어 있습니다.

모듈 다운로드 옵션 조건부 제공과의 호환성
융합(<dist:fusing dist:include="true"/>) 모듈에서 이 옵션을 true로 설정하면 Google Play에서 API 레벨 19 이하를 실행하는 기기에 앱을 배포할 때 지정된 조건부 제공 옵션을 사용하지 않습니다. 즉, API 레벨 19 이하를 실행하는 기기의 경우 설치 시에 융합을 사용 설정하는 동적 기능 모듈이 항상 포함됩니다.
인스턴트 지원(<dist:module dist:instant="true"/>) 인스턴트 지원 동적 기능 모듈의 경우 조건부 제공 옵션이 지원되지 않습니다.
요청 시(<dist:on-demand/>) 기본적으로, 조건부 제공 옵션을 지정하면 요청 시에도 모듈을 사용할 수 있습니다.

국가를 기반으로 조건 지정

조건부 제공 옵션을 사용하면 앱 설치 시에 모듈 다운로드에서 제외(또는 포함)할 국가를 지정할 수도 있습니다. 예를 들어, 모듈에서 특정 지역에서 사용할 수 없는 결제 수단을 구현하는 경우 이 조건을 지정하면 유용할 수도 있습니다.

이 컨텍스트에서 기기 국가는 일반적으로 Google Play 계정에 등록된 사용자의 청구서 수신 주소에 따라 결정됩니다.

모듈의 국가를 지정하려면 동적 기능 모듈의 매니페스트에 다음을 포함하세요.

<dist:conditions>
       <!-- Specify "true" to specify countries to exclude from downloading
       this module at app install-time, or "false" to specify countries that should
       download the module. By default, this is set to “false”. -->
      <dist:user-countries dist:exclude="true">
        <!-- Specifies the two-letter  CLDR country code for regions that should
        not download the module at app install-time. -->
        <dist:country dist:code="CN"/>
        <dist:country dist:code="HK"/>
      </dist:user-countries>
    </dist:conditions>
    

최소 API 레벨에 관한 조건 지정

Android 플랫폼의 특정 버전에서만 사용할 수 있는 API에 의존하는 동적 기능 모듈이 있는 경우 기기의 API 레벨을 기반으로 조건을 지정하면 유용합니다.

최소 기기 API 레벨을 조건을 설정하려면 동적 기능 모듈의 매니페스트에 다음을 포함하세요. 조건으로 지정하는 API 레벨은 모듈 자체의 minSdkVersion보다 크거나 같아야 합니다.

<dist:conditions>
        <!-- Specifies the minimum API level that the device must satisfy
              in order to download your module at app app install-time. -->
       <dist:min-sdk dist:value="24"/>
    </dist:conditions>
    

Apply Changes

Apply Changes를 사용하면 앱을 다시 시작하지 않고, 경우에 따라 현재 활동을 다시 시작하지 않고 코드 및 리소스 변경사항을 실행 중인 앱에 푸시할 수 있습니다. Apply Changes는 앱의 상태를 보존하는 완전히 새로운 방법을 구현합니다. APK의 바이트코드를 다시 작성한 Instant Run과 달리 Apply Changes는 Android 8.0(API 레벨 26) 이상에서 지원되는 런타임 계측을 활용하여 클래스를 즉시 재정의합니다.

Apply Changes를 사용하려면 다음 작업을 처리하세요.

  • 현재 활동을 다시 시작하지 않고 코드 변경사항만 적용하려면 Apply Code Changes Apply Code Changes 아이콘를 클릭하거나 Ctrl+Alt+F10(macOS의 경우 Command+Shift+Ctrl+R)을 클릭하세요.

    일반적으로, 메서드의 본문에서 코드를 수정했지만 리소스는 수정하지 않은 경우 Apply Code Changes를 사용해야 합니다. 리소스도 수정한 경우에는 대신 Apply Changes and Restart Activity를 사용하세요.

  • 앱을 다시 시작하지 않고 리소스 및 코드 변경사항을 적용하려면 Apply Changes and Restart Activity Apply Changes 아이콘를 클릭하거나 Ctrl+F10(macOS의 경우 Command+Ctrl+R)을 클릭하세요.

    이 옵션을 사용하면 앱을 다시 시작하지 않고 현재 활동을 다시 시작하여 리소스 및 코드 변경사항을 적용할 수 있습니다.

Apply Changes에 관한 실행 폴백 사용 설정

변경한 사항을 앱을 다시 시작하지 않고 적용할 수 없는 경우 Android 스튜디오에서 대신 앱을 실행 Run 아이콘하라는 메시지를 표시합니다. 하지만, 이러한 일이 발생할 때마다 메시지가 표시되지 않도록 하려면 변경사항을 적용할 수 없을 때마다 자동으로 앱을 실행하도록 Android 스튜디오를 구성할 수 있습니다.

이 동작을 사용 설정하려면 다음 단계를 따르세요.

  1. Settings 또는 Preferences 대화상자를 엽니다.

    • Windows 또는 Linux의 경우 메뉴 바에서 File > Settings를 선택합니다.
    • macOS의 경우 메뉴 바에서 Android Studio > Preferences를 선택합니다.
  2. Build, Execution, Deployment > Deployment로 이동합니다.

  3. 체크박스를 선택하여 Apply Changes 작업 중 하나에 관한 자동 실행 폴백을 사용 설정합니다.

  4. OK를 클릭합니다.

제한사항

Apply Changes에는 다음과 같은 제한 사항이 있습니다.

  • Apply Changes는 Android 8.0(API 레벨 26) 이상을 실행하는 기기와만 호환됩니다.
  • Instant Run과 마찬가지로 다음을 비롯한 특정한 코드 변경사항은 앱이 다시 시작될 때까지 적용할 수 없습니다.
    • 클래스, 메서드 또는 필드 추가 또는 삭제
    • 매니페스트 변경
    • 메서드 서명 변경
    • 메서드 또는 클래스의 수식어 변경
    • 클래스 이름 바꾸기
    • 클래스 상속 변경
    • 리소스 추가 또는 삭제
    • 네이티브 라이브러리(.so 파일) 변경
    • Enum의 값 변경

알려진 문제

Apply Changes에는 다음과 같은 알려진 문제가 있습니다.

  • Apply Changes의 속도가 Instant Run보다 느릴 때가 있습니다. 초기에는 안정성을 높이는 데 우선순위를 두었으며 앞으로 몇 개월 동안 성능을 지속적으로 개선할 예정입니다.
  • 시스템 및 애플리케이션 스레드 컨텍스트 이외의 맞춤 클래스로더를 사용하는 경우 예기치 않은 동작이 발생할 수 있습니다.

IntelliJ IDEA 2019.1

핵심 Android 스튜디오 IDE가 2019.1 출시를 통해 테마 맞춤설정 등 개선 사항을 포함하여 IntelliJ IDEA에서 개선되었습니다.

여기에는 다음과 같은 버그 수정 업데이트의 개선 사항도 포함됩니다.

Android 스튜디오 3.6

이 섹션에서는 Android 스튜디오 3.6의 새로운 기능과 변경사항을 간략히 설명합니다.

Apply Changes

이제 클래스를 추가한 다음 Apply Code Changes Apply Code Changes 아이콘 또는 Apply Changes and Restart Activity Apply Changes 아이콘를 클릭하여 해당 변경사항을 실행 중인 앱에 배포할 수 있습니다.

이 두 작업의 차이를 자세히 알아보려면 변경사항 적용을 참조하세요.

NDK 업데이트

다음 업데이트는 Android 스튜디오에서 네이티브(C/C++) 개발을 지원합니다.

Kotlin 지원

이전에 자바로 지원되었던 Android 스튜디오의 다음과 같은 NDK 기능이 이제 Kotlin으로도 지원됩니다.

  • JNI 선언에서 해당하는 C/C++ 구현 함수로 이동합니다. 관리되는 소스 코드 파일의 행 번호 근처에 있는 C 또는 C++ 항목 아이콘 위로 마우스를 가져가 이 매핑을 확인하세요.
  • JNI 선언의 스터브 구현 함수를 자동으로 생성합니다. 먼저 JNI 선언을 정의한 다음 C/C++ 파일에 'jni' 또는 메서드 이름을 입력하여 활성화하세요.

  • 사용되지 않은 네이티브 구현 함수는 소스 코드에 경고로 강조표시됩니다. 구현이 누락된 JNI 선언도 오류로 강조표시됩니다.

  • 네이티브 구현 함수의 이름을 바꾸면(리팩터링하면) 해당하는 모든 JNI 선언이 업데이트됩니다. 네이티브 구현 함수를 업데이트하려면 JNI 선언의 이름을 바꾸세요.

  • 암시적으로 바인드된 JNI 구현의 서명 확인

다른 JNI 구현

  • 겉모습

    • 매개변수에 관한 힌트를 입력하면 반환 값이 JNI 구현 함수에 표시됩니다.
    • JNI 손상된 함수 이름은 접을 수 있습니다.

  • RegisterNatives 지원

    • 메서드 선언 이름, 매개변수 유형 및 반환 유형의 자동 완성

    • 메서드 선언 이름의 이름 바꾸기 리팩터링

    • 바인드된 JNI 함수의 서명 확인

  • 다른 JNI 함수 지원

    • 다음 문자열 리터럴의 자동 완성, 검사, 탐색 및 이름 바꾸기 리팩터링 지원:
      • FindClass
      • GetMethodIDGetStaticMethodID
      • GetFieldIDGetStaticFieldID
    • 다음에 관한 다양한 검사:
      • Call[Static]<type>Method
      • CallNonvirtual<type>Method
      • Get[Static]<type>Field
      • NewObject