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)에 도입된 잠자기 버전(API 레벨 23)의 <ph type="x-smartling-placeholder"></ph> 잠자기 및 앱 대기 최적화를 참조하세요. 여전히 FCM (Firebase 클라우드 메시징) 사용과 같은 권장사항을 따르면 메시지를 주고받고, 사용자의 요구사항을 수용하도록 추가적인 잠자기 동작이 추가되었습니다.

Project Svelte: 백그라운드 최적화

Android 7.0에서는 두 가지 모두를 최적화할 수 있도록 세 개의 암시적 브로드캐스트를 제거함 메모리 사용량 및 전력 소비량을 줄일 수 있습니다 이 변경이 필요한 이유는 다음과 같습니다. 브로드캐스트는 수신 대기하도록 등록된 앱을 만들 수 있습니다. 이러한 브로드캐스트를 삭제하면 기기에 상당한 도움이 될 수 있음 살펴봤습니다

이동 시와 같이 휴대기기의 연결 변경이 자주 발생합니다. 인터넷 연결을 할 수 있습니다 현재는 앱에서 암시적 CONNECTIVITY_ACTION 브로드캐스트의 수신기를 등록하여 합니다. 많은 앱이 이 브로드캐스트를 수신하도록 등록하므로 네트워크 스위치는 그들 모두가 깨어나서 다른 위치에서 브로드캐스트를 합니다.

마찬가지로 이전 버전의 Android에서는 앱이 다음과 같은 다른 앱에서 암시적 ACTION_NEW_PICTUREACTION_NEW_VIDEO 브로드캐스트를 수신하도록 등록할 수 있었습니다. 카메라 사용자가 카메라 앱으로 사진을 찍으면 다음 앱이 절전 모드에서 해제됩니다. 요청을 받습니다.

이러한 문제를 완화하기 위해 Android 7.0에서는 다음을 적용합니다. 최적화:

  • Android 7.0(API 수준 24) 이상을 타겟팅하는 앱은 매니페스트에서 broadcast receiver를 선언하면 CONNECTIVITY_ACTION 브로드캐스트를 수신하지 않습니다. Context.registerReceiver()BroadcastReceiver를 등록한 상태에서 그 컨텍스트가 여전히 유효하면 앱은 계속 CONNECTIVITY_ACTION 브로드캐스트를 수신합니다.
  • 시스템은 더 이상 ACTION_NEW_PICTURE 또는 ACTION_NEW_VIDEO 브로드캐스트를 전송하지 않습니다. 이 최적화는 Android 7.0을 타겟팅하는 앱뿐 아니라 모든 앱에 영향을 줍니다.

앱에서 이러한 인텐트 중 하나라도 사용하는 경우 종속 항목을 삭제해야 합니다. Android 7.0 기기를 올바르게 타겟팅할 수 있도록 하는 것이 좋습니다. Android 프레임워크는 기본 하드웨어의 이러한 암시적 브로드캐스트 예를 들어 JobScheduler API는 일정을 예약할 수 있는 강력한 메커니즘을 제공합니다. 지정된 조건에 따라 네트워크 작업을 수행할 수 있습니다(예: 충족됩니다 JobScheduler를 사용하여 콘텐츠 제공자의 변경사항에도 반응할 수 있습니다.

Android 7.0 (API 수준)의 백그라운드 최적화에 관한 자세한 내용은 앱을 조정하는 방법은 배경 최적화.

권한 변경

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에서는 사용자가 확대 디스플레이 크기를 설정할 수 있음 또는 화면의 모든 요소를 축소하여 기기의 접근성 향상 사용할 수 있습니다 사용자가 최소 화면 이상으로 화면을 확대/축소할 수 없음 의 너비 sw320dp: 일반적인 중형 휴대전화인 Nexus 4의 너비입니다.

Android 7.0 시스템 이미지를 실행하는 기기의 확대/축소되지 않은 디스플레이 크기를 보여주는 화면
Android 7.0 시스템 이미지를 실행하는 기기의 디스플레이 크기를 늘리는 효과를 보여주는 화면

그림 3. 오른쪽 화면은 Android 7.0 시스템 이미지를 실행하는 기기의 디스플레이 크기 늘리기

기기 밀도가 변경되면 시스템은 방법은 다음과 같습니다.

  • 앱이 API 수준 23 이하를 대상으로 하는 경우 시스템은 자동으로 모든 백그라운드 프로세스를 지원합니다 즉, 사용자가 설정 화면을 열고 디스플레이 크기 설정을 지정하면 시스템은 동일한 시점에 앱을 종료합니다. 메모리 부족 상황에서와 같은 방식으로 작동합니다. 앱에 포그라운드가 있는 경우 시스템은 해당 프로세스에 구성 변경을 처리 런타임 변경에 대해 자세히 알아보세요.
  • 앱이 Android 7.0을 타겟팅하는 경우 앱의 모든 프로세스 (포그라운드 및 백그라운드)에 로드되면 다시 구성 변경 알림을 처리 런타임 변경사항.

이 기능을 지원하는 경우 대부분의 앱은 변경할 필요가 없습니다. 앱이 Android 권장사항을 따라야 합니다. 확인할 사항은 구체적으로 다음과 같습니다.

  • 화면 너비가 sw320dp인 기기에서 앱을 테스트합니다. 그리고 적절하게 작동하는지 확인해야 합니다
  • 기기 구성이 변경되면 밀도에 종속된 모든 버전 업데이트 캐시된 비트맵 또는 네트워크에 속합니다. 앱이 일시중지된 상태에서 다시 시작할 때 구성 변경사항을 확인합니다. 있습니다.

    참고: 구성에 종속된 데이터를 캐시하는 경우 적절한 화면과 같은 관련 메타데이터를 포함하는 것이 좋습니다. 크기 또는 픽셀 밀도를 지정할 수 있습니다. 이 메타데이터를 저장하면 다음 작업을 할 수 있습니다. 구성 후 캐시된 데이터를 새로고침해야 하는지 여부 결정 있습니다.

  • 픽셀은 픽셀 단위로 크기가 조정되지 않으므로 픽셀 단위로 크기를 지정하지 마세요. 화면 밀도 대신 밀도 독립형으로 크기를 지정하세요. 픽셀 (dp) 단위로 표시합니다.

설정 마법사의 Vision Settings

Android 7.0에는 시작 화면에 비전 설정이 포함되어 있으며, 사용자는 여기서 새 기기에서 다음 접근성 설정 지정: 확대 동작, 글꼴 크기 디스플레이 크기TalkBack. 이 변경사항 다양한 화면 설정과 관련된 버그의 가시성이 높아집니다. 받는사람 평가하려면 이러한 기능을 사용하여 앱을 테스트해야 합니다 설정을 사용 설정했습니다. 해당 설정은 설정 > 접근성.

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

Android 7.0부터는 시스템에서 앱이 동적으로 연결되지 않습니다. 앱의 비정상 종료를 야기할 수 있는 비 NDK 라이브러리에 대한 검사입니다. 이러한 변화는 플랫폼 업데이트 전반에 걸쳐 일관된 앱 환경을 만드는 것을 목표로 하는 동작 다양한 기기를 사용할 수 있습니다. 코드가 타사 정적 라이브러리가 그렇게 할 수 있습니다. 따라서 모든 개발자는 앱이 비정상 종료되지 않는다는 것을 확신할 수 있습니다. 앱에서 공개 NDK API만 사용해야 합니다.

앱이 비공개 플랫폼에 액세스를 시도하는 방법에는 세 가지가 있습니다. API:

  • 앱이 직접 비공개 플랫폼 라이브러리에 액세스합니다. 업데이트해야 합니다. 앱에 이러한 라이브러리의 사본을 포함하거나 공개 NDK API를 사용하도록 해야 합니다.
  • 앱에서 비공개 플랫폼에 액세스하는 서드 파티 라이브러리를 사용합니다. 제공합니다 앱이 비공개 라이브러리에 액세스하지 않는다는 확신이 있더라도 직접 이 시나리오에 대해 앱을 테스트해야 합니다.
  • 앱이 APK에 포함되지 않은 라이브러리를 참조합니다. 대상 예를 들어 자체 OpenSSL 사본을 사용하려고 했지만 앱의 APK와 번들로 묶는 것을 잊은 경우입니다. 앱이 여러 버전에서 정상적으로 실행될 수 있음 libcrypto.so가 포함된 Android 플랫폼의 Android 플랫폼 버전입니다. 하지만 이 라이브러리가 포함되지 않은 최신 버전의 Android에서 비정상 종료가 발생할 수 있음 (예: Android 6.0 이상) 이 문제를 해결하려면 비 NDK 라이브러리를 APK와 연결할 수 있습니다.

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

이 제한이 현재 캠페인에 미칠 수 있는 영향을 줄이기 위해 출시한 앱, 특히 많이 사용되는 라이브러리 집합(예: libandroid_runtime.so, libcutils.so, libcrypto.solibssl.so은(는) 일시적으로 API 레벨 23을 타겟팅하는 앱의 경우 Android 7.0 (API 레벨 24)에서 액세스 가능 낮음 앱이 이러한 라이브러리 중 하나를 로드하면 logcat이 경고를 생성함 대상 기기에 토스트 메시지가 표시되어 알려줍니다. 만약 앱의 자체 사본을 포함하거나 공개 NDK API만 사용할 수 있습니다. Android의 향후 출시 비공개 라이브러리 사용을 완전히 제한하여 다운될 수도 있습니다.

모든 앱은 둘 다 아닌 API를 호출할 때 런타임 오류를 발생시킵니다. 일시적으로 액세스할 수 없습니다 그 결과 System.loadLibrarydlopen(3) 모두 반환 NULL가 되며 앱이 비정상 종료될 수 있습니다. 먼저 비공개 플랫폼 API 사용을 없애고 앱을 철저하게 테스트하기 위한 앱 코드 Android 7.0 (API 수준 24)을 실행하는 기기나 에뮬레이터 사용 만약 앱이 비공개 라이브러리를 사용하는지 확실하지 않은 경우 logcat을 확인하여 런타임 오류를 식별할 수 있습니다.

다음 표에서는 비공개 네이티브 라이브러리 및 대상 API 사용 여부에 따라 등급 (android:targetSdkVersion)입니다.

라이브러리 대상 API 수준 동적 링커를 통한 런타임 액세스 Android 7.0 (API 수준 24) 동작 미래의 Android 플랫폼 동작
NDK 공개 모두 액세스 가능 예상대로 작동 예상대로 작동
비공개(임시로 액세스 가능한 비공개 라이브러리) 23 이하 임시로 액세스 가능 예상대로 작동하지만 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)

앱에서 서드 파티 라이브러리를 사용하는 경우에도 다음과 같은 Logcat 출력이 표시될 수 있습니다. 비공개 플랫폼 API에 동적으로 링크됩니다. 아래의 readelf 도구는 Android 7.0DK에서는 동적으로 링크된 모든 공유 특정 .so 파일의 라이브러리를 삭제합니다.

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

앱 업데이트

이러한 유형의 오류를 수정하고 향후 플랫폼 업데이트에서 앱이 비정상 종료되지 않는지 확인합니다.

  • 앱이 비공개 플랫폼 라이브러리를 사용하는 경우 자체 사본을 만들거나 공개 NDK API를 사용하세요.
  • 앱이 비공개 기호에 액세스하는 서드 파티 라이브러리를 사용하는 경우 라이브러리 작성자를 호출하여 라이브러리를 업데이트합니다.
  • 모든 비 NDK 라이브러리를 APK와 패키징해야 하는지 확인하세요.
  • getJavaVMlibandroid_runtime.sogetJNIEnv:
    AndroidRuntime::getJavaVM -> GetJavaVM from <jni.h>
    AndroidRuntime::getJNIEnv -> JavaVM::GetEnv or
    JavaVM::AttachCurrentThread from <jni.h>.
    
  • 비공개 property_get 대신 __system_property_get 사용 libcutils.so의 기호 이렇게 하려면 __system_property_get를 사용합니다. 다음과 같습니다.
    #include <sys/system_properties.h>
    

    참고: 시스템 속성의 사용 가능 여부 및 콘텐츠는 CTS를 통해 테스트되지 않았습니다. 더 나은 해결책은 이러한 속성을 모두 사용할 수 있습니다.

  • libcrypto.soSSL_ctrl 기호 로컬 버전을 사용합니다. 예를 들어 libcyrpto.a.so 파일에 포함하거나 BoringSSL/OpenSSL에서 동적으로 연결된 버전의 libcrypto.so을 포함하여 APK에 패키징합니다.

Android for Work

Android 7.0에는 다음을 비롯하여 Android for Work를 대상으로 하는 앱에 대한 변경사항이 포함되어 있습니다. 인증서 설치 변경, 비밀번호 재설정, 보조 사용자 관리, 액세스 등이 포함됩니다 Google Cloud에서 제공하는 이러한 변경사항을 검토하고 앱을 적절히 조정할 수 있습니다.

  • DPC를 설정하려면 먼저 위임된 인증서 설치 프로그램을 설치해야 합니다. 있습니다. Android 7.0 (API 수준 24)을 타겟팅하는 프로필 및 기기 소유자 앱의 경우 기기 정책을 실행하기 전에 위임된 인증서 설치 프로그램을 컨트롤러 (DPC) 통화 DevicePolicyManager.setCertInstallerPackage() 설치 프로그램이 설치되지 않은 경우 시스템에서 IllegalArgumentException
  • 이제 기기 관리자의 비밀번호 재설정 제한이 프로필에 적용됩니다. 있습니다. 기기 관리자가 더 이상 비밀번호를 삭제하거나 변경하려면 DevicePolicyManager.resetPassword()하세요 이미 설정된 규칙을 적용할 수 있습니다 기기 관리자는 비밀번호를 설정할 수 있지만 기기에 비밀번호나 PIN, 패턴이 없는 경우
  • 제한이 있더라도 기기 및 프로필 소유자는 계정을 관리할 수 있습니다. 설정합니다. 기기 소유자 및 프로필 소유자는 Account Management API를 호출할 수 있습니다. DISALLOW_MODIFY_ACCOUNTS 사용자 제한이 있더라도
  • 기기 소유자는 보조 사용자를 보다 쉽게 관리할 수 있습니다. 기기가 다음에 해당하는 경우 기기 소유자 모드로 실행 중인 경우 DISALLOW_ADD_USER 제한 자동으로 설정됩니다 이렇게 하면 사용자가 비관리 보조 보조 계정을 만들 수 없습니다. 있습니다. 또한 CreateUser()createAndInitializeUser() 메서드가 지원 중단되었습니다. 새로운 DevicePolicyManager.createAndManageUser() 메서드가 이를 대체합니다.
  • 기기 소유자는 기기 식별자에 액세스할 수 있습니다. 기기 소유자는 사용 중인 기기의 Wi-Fi MAC 주소 DevicePolicyManager.getWifiMacAddress() Wi-Fi에 기기에서 사용 설정된 경우 이 메서드는 null 값을 반환합니다.
  • Work Mode 설정은 업무용 앱에 대한 액세스를 제어합니다. 작업 모드가 사용 중지되어 있으면 시스템 런처는 직장 앱을 회색으로 표시하여 사용할 수 없음을 나타냅니다. 사용 설정 중 다시 작동하면 정상적인 동작을 복원합니다.
  • 클라이언트 인증서 체인이 포함된 PKCS #12 파일을 설치할 때 설정 UI의 해당 비공개 키, 더 이상 신뢰할 수 있는 자격 증명 저장소에 설치되지 않습니다. 이렇게 하면 앱이 클라이언트를 검색하려고 할 때 KeyChain.getCertificateChain()의 결과에 영향을 미치지 않음 인증서 체인을 사용할 수도 있습니다. 필요한 경우 CA 인증서를 설치해야 합니다. 설정 UI를 통해 신뢰할 수 있는 자격 증명 저장소에 별도로 .crt 또는 .cer 파일 확장자로 DER 인코딩 형식
  • Android 7.0부터 지문 등록 및 저장소가 관리됨 사용자당 평균 수익입니다 프로필 소유자의 DPC (Device Policy Client)가 API 수준을 대상으로 하는 경우 Android 7.0(API 수준 24)을 실행하는 기기에서 기기에서 지문을 설정할 수 있지만 직장 애플리케이션에서는 기기 지문에 액세스합니다. DPC가 API 수준 24 이상을 대상으로 하는 경우 사용자는 설정 > 보안 > 직장 프로필 보안.
  • 새 암호화 상태(ENCRYPTION_STATUS_ACTIVE_PER_USER)는 다음과 같습니다. 반환: DevicePolicyManager.getStorageEncryptionStatus(), 반환: 암호화가 활성 상태이고 암호화 키가 있습니다. 새로운 상태는 DPC가 API 레벨 24 이상을 대상으로 하는 경우에만 반환됩니다. 이전 API 수준을 타겟팅하는 앱의 경우 ENCRYPTION_STATUS_ACTIVE 가 반환됩니다.
  • Android 7.0에서는 일반적으로 전체 API에 영향을 미치는 여러 메서드가 기기에 직장 프로필이 설치되어 있고 별도의 직장 챌린지를 완성해야 합니다 이러한 문제는 전체 기기에 영향을 주기보다는 방식이 직장 프로필에만 적용됩니다. (이러한 메서드의 전체 목록은 DevicePolicyManager.getParentProfileInstance() 문서를 참조하세요.) 예를 들어 DevicePolicyManager.lockNow()를 설정하면 기기가 잠기지 않고 직장 프로필만 잠깁니다. 전체 기기가 잠깁니다. 이러한 각 방법에 대해 이전 상위 인스턴스에서 메서드를 호출하여 동작을 DevicePolicyManager DevicePolicyManager.getParentProfileInstance() 호출 예를 들어 상위 인스턴스의 lockNow() 사용하면 전체 기기가 잠깁니다.

주석 보존

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

  • VISIBILITY_BUILD: 빌드 시간에만 표시합니다.
  • VISIBILITY_SYSTEM: 런타임에 표시되어야 하지만 다음 대상에게만 표시됩니다. 기본 시스템입니다

앱이 이 동작에 의존했다면 반드시 필요한 기간 동안 주석에 보관 정책을 런타임 시 사용할 수 있습니다 @Retention(RetentionPolicy.RUNTIME)를 사용하면 됩니다.

TLS/SSL 기본 구성 변경

Android 7.0은 기본 TLS/SSL 구성을 다음과 같이 변경합니다. HTTPS 및 기타 TLS/SSL 트래픽에 대해 앱에서 사용하는 비율:

  • 이제 RC4 암호화 스위트가 사용 중지됩니다.
  • 이제 CHACHA20-POLY1305 암호화 스위트가 사용 설정되었습니다.

RC4가 기본적으로 사용 중지되어 있으면 HTTPS 또는 TLS/SSL이 손상될 수 있습니다. 최신 암호화 스위트를 협상하지 않을 때 연결을 사용할 수 없습니다. 해결 방법은 서버 구성을 개선하여 최신 암호화 스위트 및 프로토콜이 있습니다. 이상적인 것은 TLSv1.2 및 AES-GCM입니다. 활성화되고 Forward Secrecy 암호화 스위트 (ECDHE)가 선호합니다.

대안은 맞춤 SSLSocketFactory를 사용하여 서버와 통신하도록 앱을 수정하는 것입니다. 이 팩토리는 SSLSocket를 생성하도록 설계되어야 합니다. 서버에 필요한 암호화 스위트가 일부 있는 인스턴스 사용 설정되어 있습니다.

참고: 이러한 변경사항은 WebView과 관련이 없습니다.

Android 7.0을 타겟팅하는 앱

이러한 동작 변경사항은 Android 7.0 (API 수준 24) 이상 Android 7.0에서 컴파일되는 앱 또는 targetSdkVersion를 Android 7.0 이상으로 설정하면 앱이 이러한 동작을 적절히 지원하도록 고안되었습니다(앱에 적용되는 경우).

직렬화 변경사항

Android 7.0 (API 수준 24)에서는 기본 serialVersionUID를 입력합니다.

Serializable를 구현하는 클래스 명시적인 serialVersionUID 필드를 지정하지 않으면 기본 serialVersionUID가 변경되어 예외가 발생하는 경우 오류가 발생한 클래스의 인스턴스를 역직렬화하려고 할 때 이전 버전에서 직렬화되거나 이전 버전을 타겟팅하는 앱에 의해 직렬화됨 있습니다. 오류 메시지는 다음과 유사합니다.

local class incompatible: stream classdesc serialVersionUID = 1234, local class serialVersionUID = 4567

이 문제를 해결하려면 serialVersionUID 필드를 추가해야 합니다. 오류 메시지의 stream classdesc serialVersionUID 값이 있는 영향을 받는 클래스(예: 1234인치 확인할 수 있습니다 이 변경사항은 작성하며 모든 Android 버전에서 작동합니다.

수정된 특정 버그는 이니셜라이저 메서드(예: <clinit>) 출처: 정적 이니셜라이저 메서드의 존재 여부를 지정합니다( 클래스는 해당 클래스에 대해 계산된 기본 serialVersionUID에 영향을 미칩니다. 버그가 수정되기 전에 계산은 슈퍼 클래스에서도 클래스에 정적 이니셜라이저가 없는 경우.

명확히 하자면, 이 변경사항은 API 수준 23 또는 serialVersionUID 필드가 있는 하위 클래스 또는 하위 클래스 정적 이니셜라이저 메서드가 있어야 합니다.

기타 중요한 사항

  • 앱이 Android 7.0에서 실행 중이지만 더 낮은 API 레벨을 대상으로 하는 경우 사용자가 디스플레이 크기를 변경하면 앱 프로세스가 종료됩니다. 앱 이 시나리오를 매끄럽게 처리할 수 있어야 합니다 그렇지 않으면 비정상 종료됩니다. 사용자가 최근 항목에서 복원할 때

    앱을 테스트하여 이 동작이 발생하지 않는다는 것을 의미합니다. 이렇게 하려면 동일한 비정상 종료를 발생시켜 를 호출할 때 발생합니다.

    Android 7.0 (API 수준 24) 이상을 타겟팅하는 앱은 자동으로 설정되지 않습니다. 종료되며, 그러나 이러한 공격자들은 여전히 구성을 변경할 수 있습니다

  • Android 7.0 상의 앱은 구성 변경을 매끄럽게 처리할 수 있어야 합니다. 이후에 시작할 때 다운되지 않아야 합니다. 앱 동작 확인 가능 글꼴 크기를 변경합니다 (설정 > 디스플레이 > 글꼴 크기)를 복원한 다음 앱을 표시할 수 있습니다.
  • 이전 버전의 Android에서는 버그로 인해 시스템에서 작성을 플래그하지 못했습니다. TCP 소켓에 연결할 수 있습니다 Android 7.0에서는 이 버그가 수정되었습니다. 이 동작을 보이는 앱에서 이제 android.os.NetworkOnMainThreadException이 발생합니다. 일반적으로 기본 스레드에서 네트워크 작업을 실행하는 것은 좋지 않습니다. 이러한 작업은 일반적으로 지연 시간이 길어서 ANR 및 버벅거림이 발생합니다.
  • 이제 Debug.startMethodTracing() 계열의 메서드는 기본적으로 다음과 같습니다. 공유 저장공간의 패키지별 디렉터리에 출력을 저장하고 최상위 수준의 저장할 수 있습니다. 즉, 이러한 API를 사용하기 위해 앱에서 더 이상 WRITE_EXTERNAL_STORAGE 권한을 요청할 필요가 없습니다.
  • 많은 플랫폼 API에서 대용량 페이로드가 전송되는지 확인하기 시작함 Binder개 거래에서 이제 시스템에서 TransactionTooLargeExceptions을 다시 발생시킵니다. 이를 자동으로 로깅하거나 억제하는 대신 RuntimeExceptions로 설정합니다. 1개 가장 일반적인 예는 Activity.onSaveInstanceState(), 이로 인해 ActivityThread.StopInfo이 앱이 Android 7.0을 타겟팅하는 경우 RuntimeException입니다.
  • 앱이 Runnable 작업을 View에 게시하는 경우 View 창문에 부착되어 있지 않으면 시스템은 Runnable 작업을 View로 큐에 추가합니다. Runnable 작업은 View이(가) 첨부됨 창에 추가합니다 이 동작은 다음 버그를 수정합니다. <ph type="x-smartling-placeholder">
      </ph>
    • 앱이 의도한 스레드가 아닌 다른 스레드에서 View에 게시된 경우 창의 UI 스레드가 있는 경우 그 결과 Runnable가 잘못된 스레드에서 실행될 수 있습니다.
    • Runnable 작업이 루퍼 스레드가 있으면 앱이 Runnable 작업을 노출할 수 있습니다.
  • Android 7.0에서 실행 중인 앱이 DELETE_PACKAGES 권한이 패키지를 삭제하려고 하지만 다른 앱에서 해당 패키지를 설치했습니다. 사용자 확인이 필요합니다. 이 시나리오에서 앱은 STATUS_PENDING_USER_ACTION 상태를 반환 상태로 유지 PackageInstaller.uninstall()입니다.
  • Crypto라는 JCA 제공자는 이 제공자의 유일한 폴더이므로 지원 중단되었습니다. SHA1PRNG 알고리즘은 암호화 측면에서 취약합니다. 앱에서 더 이상 SHA1PRNG에서 (안전하지 않은) 키를 파생합니다. 이 제공자가 더 이상 사용되지 않기 때문입니다. 있습니다. 자세한 내용은 블로그 post 보안 '암호화' Android에서 지원 중단된 제공업체 N입니다.