Skip to content

Most visited

Recently visited

navigation

Android 7.0 동작 변경 사항

Android 7.0에는 새로운 기능 및 특징과 더불어 다양한 시스템 변경 사항 및 API 동작 변경이 포함되어 있습니다. 이 문서에서는 여러분이 앱에서 숙지하고 고려해야 하는 몇 가지 주요 변경 사항을 소개하겠습니다.

이전에 Android용 앱을 게시한 적이 있는 경우, 이와 같은 플랫폼 변경으로 인해 앱이 영향을 받을 수 있다는 점을 유의하세요.

배터리와 메모리

Android 7.0에는 기기의 배터리 수명을 연장하고 RAM 사용량을 감소시키기 위한 시스템 동작 변경 사항이 포함됩니다. 이러한 변경 사항은, 앱이 특정한 암시적 인텐트를 통해 다른 앱과 상호작용하는 방식과 함께, 시스템 리소스에 대한 앱의 액세스에 영향을 미칠 수 있습니다.

잠자기 모드

Android 6.0(API 레벨 23)에 도입된 잠자기 모드는 사용자가 기기의 플러그를 뽑고 정지 상태에서 화면이 꺼져 있을 때 CPU 및 네트워크 액티비티를 지연시켜서 배터리 수명을 개선해 줍니다. Android 7.0에서는 기기의 플러그를 뽑고 화면이 꺼져 있는 동안 CPU 및 네트워크 제한의 하위 세트를 적용하여 잠자기 모드를 더욱 향상시켜 주지만, 반드시 정지 상태일 필요는 없습니다(예: 핸드셋을 사용자의 주머니에 넣고 다니는 경우).

그림 1. 잠자기 모드에서 배터리 수명을 개선하기 위해 첫 번째 레벨의 시스템 액티비티 제한을 적용하는 방법에 대한 그림.

기기가 배터리 전원에 연결되고 일정 시간 동안 화면이 꺼져 있는 경우 기기가 잠자기 모드로 전환되고 첫 번째 하위 세트의 제한을 적용합니다. 기기는 앱 네트워크 액세스를 차단하고, 작업과 동기화를 지연시킵니다. 기기가 잠자기 모드로 전환된 후 일정 시간 동안 정지 상태에 있으면, 시스템은 잠자기 모드의 나머지 제한 사항을 PowerManager.WakeLock, AlarmManager 알람, GPS 및 Wi-Fi 스캔에 적용합니다. 일부 잠자기 모드 제한이 적용되든 모든 잠자기 모드 제한이 적용되든 상관없이, 시스템은 잠시 동안의 유지 관리 기간 중에 기기를 깨우며, 이 기간 중에는 애플리케이션의 네트워크 액세스가 허용되고 지연된 작업/동기화가 실행됩니다.

그림 2. 기기가 일정 시간 동안 정지 상태에 있은 후에 잠자기 모드에서 두 번째 레벨의 시스템 액티비티 제한을 적용하는 방법에 대한 그림.

화면을 활성화하거나 기기의 플러그를 꽂으면 잠자기 모드가 종료되고 이러한 처리 제한이 제거됩니다. 잠자기 및 앱 대기모드 최적화에서 설명한 대로, Android 6.0(API 레벨 23)에 도입된 이전 버전의 잠자기 모드에 맞춰 앱을 조정할 경우에는 이러한 추가적인 동작이 권장 사항 및 모범 사례에 영향을 미치지 않습니다. 하지만 여전히 해당 권장 사항을 따라야 합니다. 예를 들어, GCM(Google Cloud Messaging)을 사용하여 메시지를 송수신하고 추가적인 잠자기 모드 동작을 수용하기 위한 업데이트 계획을 시작해야 합니다.

Project Svelte: 백그라운드 최적화

Android 7.0에서는 메모리 사용량 및 전원 소비량을 최적화하기 위해 세 가지 암시적 브로드캐스트를 제거합니다. 이렇게 변경해야 하는 이유는, 암시적 브로드캐스트는 백그라운드에서 브로드캐스트를 수신하도록 등록된 앱을 자주 시작하기 때문입니다. 이들 브로드캐스트를 제거하면 기기 성능과 사용자 환경이 상당히 향상될 수 있습니다.

모바일 기기의 경우 연결 변경이 자주 나타납니다(예: Wi-Fi와 모바일 데이터 간의 이동 시). 현재는 암시적 CONNECTIVITY_ACTION 브로드캐스트의 수신기를 매니페스트에 등록하여 앱이 이러한 연결 변경을 모니터링할 수 있습니다. 많은 앱들이 이 브로드캐스트를 수신하도록 등록하기 때문에, 단일 네트워크 스위치가 모든 앱을 깨우고 이들 앱이 해당 브로드캐스트를 동시에 처리하도록 할 수 있습니다.

마찬가지로, 이전 버전의 Android에서는 앱이 다른 앱(예: 카메라)에서 암시적 ACTION_NEW_PICTUREACTION_NEW_VIDEO 브로드캐스트를 수신하도록 등록할 수 있었습니다. 사용자가 카메라 앱으로 사진을 찍으면, 이들 앱이 깨어나서 해당 브로드캐스트를 처리합니다.

이런 문제를 완화하기 위해, Android 7.0은 다음과 같은 최적화를 적용합니다.

앱이 이들 인텐트 중 하나라도 사용하는 경우에는, Android 7.0 기기를 올바로 대상으로 삼을 수 있도록 이들 인텐트에 대한 종속성을 최대한 빨리 제거해야 합니다. Android 프레임워크는 이러한 암시적 브로드캐스트의 필요성을 줄이기 위한 여러 가지 해결책을 제공합니다. 예를 들어, JobScheduler API는 지정된 조건(예: 고정 요금제 네트워크에 연결)이 충족될 경우 네트워크 운영을 예약할 수 있는 강력한 메커니즘을 제공합니다. 심지어 JobScheduler를 사용하여 콘텐츠 제공자의 변경 사항에 대응할 수도 있습니다.

N에서 백그라운드 최적화와 앱을 조정하는 방법에 대한 자세한 내용은 백그라운드 최적화를 참조하세요.

권한 변경

Android 7.0에는 앱에 영향을 미칠 수도 있는 권한 변경이 포함되어 있습니다.

파일 시스템 권한 변경

개인 파일의 보안을 강화하기 위해, Android 7.0 이상을 대상으로 하는 앱의 개인 디렉터리는 액세스가 제한됩니다(0700). 이 설정은 크기 또는 존재 여부와 같은 개인 파일의 메타데이터 유출을 막아줍니다. 이러한 권한 변경은 여러 가지 부작용이 있습니다.

앱 사이의 파일 공유

Android 7.0을 대상으로 하는 앱의 경우, Android 프레임워크는 앱 외부에서 file:// URI의 노출을 금지하는 StrictMode API 정책을 적용합니다. 파일 URI를 포함하는 인텐트가 앱을 떠나면 FileUriExposedException 예외와 함께 앱에 오류가 발생합니다.

애플리케이션 간에 파일을 공유하려면 content:// URI를 보내고 이 URI에 대해 임시 액세스 권한을 부여해야 합니다. 이 권한을 가장 쉽게 부여하는 방법은 FileProvider 클래스를 사용하는 방법입니다. 권한과 파일 공유에 대한 자세한 내용은 파일 공유를 참조하세요.

접근성 향상

Android 7.0에는 시력이 나쁘거나 손상된 사용자를 위해 플랫폼의 사용성을 개선하기 위한 변경 사항이 포함되어 있습니다. 이러한 변경 사항에서는 일반적으로 앱의 코드를 변경할 필요가 없지만, 사용자 환경에 미치는 잠재적인 영향을 평가하기 위해 이들 기능을 검토하고 앱으로 테스트해야 합니다.

화면 확대/축소

Android 7.0에서는 사용자가 Display size를 설정할 수 있으며, 이 설정에서 화면의 모든 요소를 확대하거나 축소할 수 있으므로, 시력이 나쁜 사용자의 기기 접근성이 향상됩니다. 최소 화면 너비인 sw320dp를 초과하는 화면은 사용자가 확대/축소할 수 없으며, 이 너비는 일반적인 중간 크기 휴대폰인 Nexus 4의 너비입니다.

그림 3. 오른쪽 화면은 Android 7.0 시스템 이미지가 실행 중인 기기의 디스플레이 크기를 늘릴 때의 효과를 보여줍니다.

기기 밀도가 변경되면 시스템은 다음과 같은 방식으로 실행 중인 앱에게 알립니다.

앱이 Android 모범 사례를 따르기만 한다면, 대부분의 앱은 이 기능을 지원하기 위해 어떠한 변경도 수행할 필요가 없습니다. 확인할 사항은 구체적으로 다음과 같습니다.

설정 마법사의 Vision Settings

Android 7.0에는 Welcome 화면에 Vision Settings가 포함되어 있으며, 여기서 사용자는 확대 제스처, 글꼴 크기, 디스플레이 크기음성 안내 지원의 접근성 설정을 새 기기에 구성할 수 있습니다. 이러한 변경은 다른 화면 설정에 관련된 버그의 가시성을 증대시킵니다. 이 기능의 영향을 평가하려면, 이들 설정을 활성화하여 앱을 테스트해야 합니다. 이 설정은 Settings > Accessibility 아래에 있습니다.

플랫폼 라이브러리에 연결되는 NDK 앱

Android 7.0부터는 시스템에서 앱이 비 NDK 라이브러리에 동적으로 링크되어 앱 작동이 중단되지 않도록 방지합니다. 이러한 동작 변경은 플랫폼 업데이트와 여러 기기에 걸쳐 일관성 있는 앱 환경을 생성하는 것을 목표로 합니다. 여러분의 코드를 비공개 라이브러리에 링크하지 않더라도 여러분의 앱에 있는 타사 정적 라이브러리가 링크할 수 있습니다. 따라서 모든 개발자는 Android 7.0을 실행하는 기기에서 앱 작동이 중단되지 않도록 확인해야 합니다. 네이티브 코드를 사용하는 앱을 위해 공개 NDK API만 사용해야 합니다.

여러분의 앱이 비공개 플랫폼 API에 액세스할 때 시도할 만한 세 가지 방법이 있습니다.

다른 버전의 Android 간에 앱이 변경되거나 제거될 수 있으므로 앱이 NDK에 포함되지 않는 네이티브 라이브러리를 사용해서는 안 됩니다. OpenSSL에서 BoringSSL로의 전환은 이러한 변경의 한 예입니다. 또한, NDK에 포함되지 않은 플랫폼 라이브러리에는 호환성 요구사항이 없기 때문에, 다른 기기에서는 호환성 레벨이 다를 수도 있습니다.

이러한 제한이 현재 출시된 앱에 미칠 수 있는 영향을 줄이기 위해 libandroid_runtime.so, libcutils.so, libcrypto.solibssl.so 같이 중요한 용도로 사용되는 라이브러리 세트는 API 레벨 23 이하를 대상으로 하는 앱에 대해 N에서 임시로 액세스할 수 있습니다. 앱이 이러한 라이브러리 중 하나를 로드하는 경우, logcat은 경고를 생성하고 대상 기기에 알림 메시지가 표시되어 알려줍니다. 이러한 경고가 나타나면, 그러한 라이브러리의 사본을 포함하거나 공개 NDK API를 포함하도록 앱을 업데이트해야 합니다. 앞으로 출시되는 Android 플랫폼에서는 비공개 라이브러리의 사용이 완전히 제한되고 앱의 작동이 중단될 수 있습니다.

모든 앱은 공개 또는 임시로 액세스할 수 없는 API를 호출할 때 런타임 오류를 발생합니다. 그 결과 System.loadLibrarydlopen(3)이 모두 NULL을 반환하고 앱 작동이 중단될 수 있습니다. 여러분의 앱 코드를 검토하여 비공개 플랫폼 API의 사용을 제거해야 하며, 프리뷰 기기 또는 에뮬레이터를 사용하여 앱을 철저히 테스트해야 합니다. 앱이 비공개 라이브러리를 사용하는지 확실하지 않은 경우 logcat을 확인하여 런타임 오류를 식별할 수 있습니다.

다음 표에서는 비공개 네이티브 라이브러리 및 대상 API 레벨(android:targetSdkVersion)의 사용에 따라 앱에서 나타날 것으로 예상되는 동작을 설명합니다.

라이브러리 대상 API 레벨 동적 링커를 통한 런타임 액세스 N Developer Preview 동작 최종 N 릴리스 동작 미래의 Android 플랫폼 동작
NDK 공개 모두 액세스 가능 예상대로 작동 예상대로 작동 예상대로 작동
비공개(임시로 액세스 가능한 비공개 라이브러리) 23 이하 임시로 액세스 가능 예상대로 작동하지만 대상 기기에서 logcat 경고 및 메시지를 수신합니다. 예상대로 작동하지만 logcat 경고를 수신합니다. 런타임 오류
비공개(임시로 액세스 가능한 비공개 라이브러리) 24 이상 제한됨 런타임 오류 런타임 오류 런타임 오류
비공개(기타) 모두 제한됨 런타임 오류 런타임 오류 런타임 오류

앱이 비공개 라이브러리를 사용하는지 확인

비공개 라이브러리를 로드하는 문제를 식별하는데 도움을 주기 위해 logcat이 경고 또는 런타임 오류를 생성할 수 있습니다. 예를 들어 앱이 API 레벨 23 이하를 대상으로 하고, Android 7.0을 실행하는 기기에서 비공개 라이브러리에 액세스하려고 하는 경우, 다음과 유사한 경고가 나타날 수 있습니다.

03-21 17:07:51.502 31234 31234 W linker  : library "libandroid_runtime.so"
("/system/lib/libandroid_runtime.so") needed or dlopened by
"/data/app/com.popular-app.android-2/lib/arm/libapplib.so" is not accessible
for the namespace "classloader-namespace" - the access is temporarily granted
as a workaround for http://b/26394120

이러한 logcat 경고는 어떤 라이브러리가 비공개 플랫폼 API에 액세스하려고 하는지 알려주지만 앱 작동을 중단하지는 않습니다. 하지만 앱이 API 레벨 24 이상을 대상으로 하는 경우, logcat이 다음과 같은 런타임 오류를 생성하고 앱 작동이 중단될 수 있습니다.

java.lang.UnsatisfiedLinkError: dlopen failed: library "libcutils.so"
("/system/lib/libcutils.so") needed or dlopened by
"/system/lib/libnativeloader.so" is not accessible for the namespace
"classloader-namespace"
  at java.lang.Runtime.loadLibrary0(Runtime.java:977)
  at java.lang.System.loadLibrary(System.java:1602)

앱이 동적으로 비공개 플랫폼 API에 링크하는 타사 라이브러리를 사용하는 경우에도 이러한 logcat 출력이 나타날 수 있습니다. Android 7.0DK의 readelf 도구를 사용하면 다음의 명령을 실행하여 지정된 .so 파일의 동적으로 링크된 모든 공유 라이브러리의 목록을 생성할 수 있습니다.

aarch64-linux-android-readelf -dW libMyLibrary.so

앱 업데이트

다음은 이러한 유형의 오류를 수정하고 향후 플랫폼 업데이트에서 앱 작동이 중단되는지 확인하기 위해 취할 수 있는 조치입니다.

Android for Work

Android 7.0에는 Android for Work를 대상으로 하는 앱에 대한 변경 사항이 포함되어 있습니다. 인증서 설치, 비밀번호 재설정, 보조 사용자 관리 및 기기 식별자 액세스에 대한 변경 사항이 이에 포함됩니다. Android for Work 환경용 앱을 빌드하는 경우에는 이러한 변경 사항을 검토하고 그에 따라 앱을 수정해야 합니다.

Android 7.0에서 Android for Work의 변경 사항에 대한 자세한 내용은 Android for Work Updates를 참조하세요.

주석 보존

Android 7.0에서는 주석의 표시 여부가 무시되던 버그가 수정되었습니다. 이 문제로 인해 런타임이 액세스할 수 없어야 하는 주석에 액세스할 수 있었습니다. 이러한 주석으로는 다음이 포함됩니다.

앱이 이 동작에 의존했다면, 런타임에 사용할 수 있어야 하는 주석에 보존 정책을 추가하세요. @Retention(RetentionPolicy.RUNTIME)을 사용하여 추가하면 됩니다.

기타 중요한 사항

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a one-minute survey?
Help us improve Android tools and documentation.