동작 변경사항: 모든 앱

Android 10에는 앱에 영향을 줄 수 있는 동작 변경사항이 포함되어 있습니다. 이 페이지에 나열된 변경사항은 실행 시 앱에 적용됩니다. 앱의 targetSdkVersion와 관계없이 Android 10에서 실행됩니다. 테스트해야 하는 이러한 변경사항을 적절히 지원하도록 필요에 따라 수정하세요.

앱의 targetSdkVersion이 29 이상인 경우에도 다음 작업을 해야 합니다. 추가 변경을 지원할 수 있습니다. 앱 동작 변경사항 확인 타겟팅 29를 참조하세요.

참고: Android 10에는 이 페이지에 나열된 변경사항 외에도 다음을 비롯한 많은 개인 정보 보호 기반 변경사항과 제한사항이 도입되었습니다.

  • 기기 위치에 대한 백그라운드 액세스
  • 백그라운드 활동 시작
  • 관심 연락처 정보
  • 무작위 MAC 주소
  • 카메라 메타데이터
  • 권한 모델

이러한 변경사항은 모든 앱에 영향을 미치며 사용자 개인 정보 보호를 강화합니다. 자세히 알아보려면 자세한 내용은 공개 범위 설정 변경사항 페이지

비 SDK 인터페이스 제한사항

플랫폼에서는 앱 안정성과 호환성을 보장하기 위해 비 SDK 인터페이스 앱이 Android 9 (API 수준 28)에서 사용할 수 있어야 합니다. Android 10에 업데이트된 목록 포함 Android 개발자와의 공동작업에 따라 제한된 비 SDK 인터페이스 최신 내부 테스트가 포함됩니다 Google의 목표는 모든 사용자가 Google에서 비 SDK 인터페이스를 제한하기 전에 대안을 사용할 수 있습니다.

Android 10 (API 수준 29)을 타겟팅하지 않는 경우 이러한 변경사항 중 일부는 즉시 영향을 받지 않을 수 있습니다 그러나 앱의 대상 API 수준에 따라 현재 일부 비 SDK 인터페이스를 사용할 수 있지만 비 SDK 메서드 또는 필드를 사용하면 언제든지 앱이 중단될 위험이 있습니다.

앱에서 비 SDK 인터페이스를 사용하는지 확실하지 않은 경우 앱을 테스트하여 알 수 있습니다. 앱에서 비 SDK 인터페이스를 사용하는 경우 대체 SDK로 이전을 계획해야 합니다. 일부 앱의 경우 비 SDK 인터페이스 사용에 관한 유효한 사용 사례가 있음을 알고 있습니다. 대안을 찾을 수 없는 경우 비 SDK 인터페이스를 사용하여 앱의 기능을 구현하려는 경우 새 공개 API를 요청할 수 있습니다.

자세한 내용은 Android 10의 비 SDK 인터페이스 제한사항 업데이트비 SDK 인터페이스 제한사항을 참고하세요.

동작 탐색

Android 10부터 사용자는 있습니다. 사용자가 동작 탐색을 사용 설정하면 앱이 API 수준 29를 타겟팅하는지와 관계없이 기기의 모든 앱이 영향을 받습니다. 예를 들어 사용자가 화면 가장자리에서 안쪽으로 스와이프하면 앱이 화면의 일부에 관해 해당 동작을 특별히 재정의하는 경우가 아니면 시스템이 해당 동작을 뒤로 탐색으로 해석합니다.

앱이 동작 탐색과 호환되도록 하려면 앱 콘텐츠를 더 넓은 화면에 표시하고 충돌하는 동작을 적절하게 처리합니다. 자세한 내용은 동작 탐색을 참고하세요. 문서를 참조하세요.

NDK

Android 10에는 다음과 같은 NDK 변경사항이 있습니다.

공유 객체에는 텍스트 재배치가 포함될 수 없습니다.

Android 6.0 (API 수준 23) 허용되지 않는 사용 텍스트 재배치를 예로 들 수 있습니다 코드를 있는 그대로 로드해야 하며 수정할 수 있습니다 이러한 변경으로 인해 앱 로드 시간이 단축되고 보안이 향상됩니다.

SELinux는 Android 10 이상을 타겟팅하는 앱에 이 제한을 적용합니다. 이러한 앱에서 텍스트가 포함된 공유 객체를 계속 사용하는 경우 고장날 위험이 큽니다.

Bionic 라이브러리 및 동적 링커 경로 변경사항

Android 10부터 여러 경로가 일반 파일도 업로드할 수 있습니다. 일반 파일인 경로를 사용했던 앱 오류가 발생할 수 있습니다.

  • /system/lib/libc.so -> /apex/com.android.runtime/lib/bionic/libc.so
  • /system/lib/libm.so -> /apex/com.android.runtime/lib/bionic/libm.so
  • /system/lib/libdl.so -> /apex/com.android.runtime/lib/bionic/libdl.so
  • /system/bin/linker -> /apex/com.android.runtime/bin/linker

이러한 변경 사항은 파일의 64비트 변형에도 적용됩니다. lib/lib64/로 대체되었습니다.

호환성을 위해 이전 경로에서 심볼릭 링크가 제공됩니다. 예를 들어 /system/lib/libc.so은(는) 다음에 대한 심볼릭 링크입니다. /apex/com.android.runtime/lib/bionic/libc.so입니다. 그래서 dlopen(“/system/lib/libc.so”)은(는) 계속 작동하지만 앱에서 다음을 찾을 수 있습니다. 실제로 로드된 라이브러리를 검사하려고 시도할 때의 차이점을 /proc/self/maps 또는 이와 유사한 정보를 보여 줍니다. 이는 일반적이지는 않지만 다음 사항이 확인되었습니다. 일부 앱은 해킹 방지 프로세스의 일부로 이러한 작업을 수행합니다. 설정된 경우 /apex/… 경로를 Bionic 파일의 유효한 경로로 추가해야 합니다.

실행 전용 메모리에 매핑된 시스템 바이너리/라이브러리

Android 10부터 시스템 바이너리의 실행 가능 세그먼트 라이브러리는 강화를 위해 메모리 실행 전용 (읽을 수 없음)에 테크닉을 탐지할 수 있습니다. 앱이 실행 전용으로 표시된 메모리 세그먼트(버그, 취약점 또는 의도적인 메모리 검사: 시스템에서 SIGSEGV 신호를 앱에 보냅니다.

관련 /data/tombstones/의 Tombstone 파일. 실행 전용 관련 비정상 종료 에는 다음과 같은 취소 메시지가 있습니다.

Cause: execute-only (no-read) memory access error; likely due to data in .text.

이 문제를 해결하여 메모리 검사와 같은 작업을 수행하려면 다음을 호출하여 실행 전용 세그먼트를 읽기+실행으로 표시할 수 있습니다. mprotect() 하지만 이 액세스 권한 설정이 더 나은 성능을 보호해야 합니다

보안

Android 10의 보안 변경사항은 다음과 같습니다.

TLS 1.3 기본 사용 설정

Android 10 이상에서는 모든 기기에 TLS 1.3이 기본적으로 사용 설정됩니다. TLS 연결. 다음은 TLS 1.3에 관한 몇 가지 중요한 세부정보입니다. 구현:

  • TLS 1.3 암호화 스위트는 맞춤설정할 수 없습니다. 지원되는 TLS 1.3 암호화 TLS 1.3이 사용 설정된 경우 도구 모음이 항상 사용 설정됩니다. 사용 중지 시도 kubectl 명령어 setEnabledCipherSuites() 드림 무시됩니다.
  • TLS 1.3이 협상될 때, HandshakeCompletedListener 드림 객체는 세션이 세션 캐시에 추가되기 전에 호출됩니다. (TLS 1.2에서는 및 기타 이전 버전에서는 세션이 추가된 후에 이러한 객체가 호출됩니다. 세션 캐시에 저장됩니다.)
  • SSLEngine 인스턴스에서 SSLHandshakeException 켜짐 이러한 인스턴스는 대신 SSLProtocolException Android 10 이상에서 지원됩니다.
  • 0-RTT 모드는 지원되지 않습니다.

원하는 경우 다음을 호출하여 TLS 1.3이 사용 중지된 SSLContext를 가져올 수 있습니다. SSLContext.getInstance("TLSv1.2") 또한 다음을 수행하여 연결별로 프로토콜 버전을 사용 설정 또는 사용 중지할 수 있습니다. setEnabledProtocols() 호출 생성합니다.

SHA-1로 서명된 인증서가 TLS에서 신뢰되지 않음

Android 10에서 SHA-1 해시 알고리즘을 사용하는 인증서 신뢰할 수 없음 루트 CA에서 해당 인증서를 발급하지 않았습니다. 더 이상 Chrome이나 다른 주요 브라우저에서 신뢰되지 않습니다.

SHA-1을 사용하여 인증서를 제공하는 사이트에 연결하려는 경우 연결 시도가 실패합니다.

KeyChain 동작 변경사항 및 개선사항

Chrome과 같은 일부 브라우저에서는 사용자가 인증서를 선택할 수 있도록 TLS 서버는 TLS 핸드셰이크의 일부로 인증서 요청 메시지를 보냅니다. 기준 시간: Android 10 KeyChain 객체는 발급기관과 KeyChain.choosePrivateKeyAlias()를 호출하여 주요 사양 매개변수를 사용자에게 인증서 선택 메시지를 표시합니다 특히 이 프롬프트는 서버 사양을 준수하지 않는 선택사항이 포함된 경우.

사용자가 선택할 수 있는 사용 가능한 인증서가 없는 경우 인증서가 서버 사양과 일치하거나 기기에 인증서 선택 프롬프트가 전혀 표시되지 않습니다.

또한 Android 10 이상에서는 기기 화면 잠금을 사용하여 키 또는 CA 인증서를 KeyChain 객체로 가져옵니다.

기타 TLS 및 암호화 변경사항

TLS 및 암호화 라이브러리에서 사소한 몇 가지 변경사항이 있었습니다. 은 Android 10에 적용됩니다.

  • AES/GCM/NoPadding 및 ChaCha20/Poly1305/NoPadding 암호화는 더 많은 것을 반환합니다. getOutputSize()의 정확한 버퍼 크기
  • TLS_FALLBACK_SCSV 암호화 스위트는 다음을 사용한 연결 시도에서 생략됩니다. 최대 프로토콜은 TLS 1.2 이상이어야 합니다. TLS 서버 개선으로 인해 TLS 외부 대체를 시도하지 않는 것이 좋습니다. 대신 TLS 버전 협상에 의존하는 것이 좋습니다.
  • ChaCha20-Poly1305는 ChaCha20/Poly1305/NoPadding의 별칭입니다.
  • 끝에 점이 있는 호스트 이름은 유효한 SNI 호스트 이름으로 간주되지 않습니다.
  • CertificateRequest의 supported_signature_algorithms 확장 고수준 값이 적용됩니다.
  • 불투명한 서명 키(예: Android 키 저장소의 서명 키)는 TLS의 RSA-PSS 서명

Wi-Fi Direct 방송

Android 10에서는 Wi-Fi와 관련하여 다음 방송이 전송됩니다. Direct는 고정적이지 않습니다.

앱이 등록 시 이러한 브로드캐스트를 수신하는 데 의존했다면 고정되어 있다면 초기화 시 적절한 get() 메서드를 사용하여 정보를 얻을 수 있습니다.

Wi-Fi Aware 기능

Android 10은 Wi-Fi Aware를 사용하여 TCP/UDP 소켓을 쉽게 생성할 수 있도록 지원 추가 사용할 수 있습니다 클라이언트가 ServerSocket에 연결하는 TCP/UDP 소켓을 만들려면 장치는 서버의 IPv6 주소와 포트를 알아야 합니다. 이전에는 BT 또는 Wi-Fi Aware 계층을 사용하는 등 대역 외에서 통신해야 함 2개 메시징 또는 mDNS 등의 다른 프로토콜을 사용하여 대역 내에서 검색됩니다. 다음으로 바꿉니다. Android 10에서는 네트워크 설정의 일부로 이 정보를 전달할 수 있습니다.

서버는 다음 중 하나를 할 수 있습니다.

  • ServerSocket를 초기화하고 사용할 포트를 설정하거나 가져옵니다.
  • Wi-Fi Aware 네트워크 요청의 일부로 포트 정보를 지정합니다.

다음 코드 샘플은 네트워크 요청:

Kotlin

val ss = ServerSocket()
val ns = WifiAwareNetworkSpecifier.Builder(discoverySession, peerHandle)
  .setPskPassphrase("some-password")
  .setPort(ss.localPort)
  .build()

val myNetworkRequest = NetworkRequest.Builder()
  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
  .setNetworkSpecifier(ns)
  .build()

자바

ServerSocket ss = new ServerSocket();
WifiAwareNetworkSpecifier ns = new WifiAwareNetworkSpecifier
  .Builder(discoverySession, peerHandle)
  .setPskPassphrase(some-password)
  .setPort(ss.getLocalPort())
  .build();

NetworkRequest myNetworkRequest = new NetworkRequest.Builder()
  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI_AWARE)
  .setNetworkSpecifier(ns)
  .build();

그런 다음 클라이언트는 Wi-Fi Aware 네트워크 요청을 수행하여 IPv6와 서버에서 제공한 포트:

Kotlin

val callback = object : ConnectivityManager.NetworkCallback() {
  override fun onAvailable(network: Network) {
    ...
  }
  
  override fun onLinkPropertiesChanged(network: Network,
      linkProperties: LinkProperties) {
    ...
  }

  override fun onCapabilitiesChanged(network: Network,
      networkCapabilities: NetworkCapabilities) {
    ...
    val ti = networkCapabilities.transportInfo
    if (ti is WifiAwareNetworkInfo) {
       val peerAddress = ti.peerIpv6Addr
       val peerPort = ti.port
    }
  }
  override fun onLost(network: Network) {
    ...
  }
};

connMgr.requestNetwork(networkRequest, callback)

자바

callback = new ConnectivityManager.NetworkCallback() {
  @Override
  public void onAvailable(Network network) {
    ...
  }
  @Override
  public void onLinkPropertiesChanged(Network network,
      LinkProperties linkProperties) {
    ...
  }
  @Override
  public void onCapabilitiesChanged(Network network,
      NetworkCapabilities networkCapabilities) {
    ...
    TransportInfo ti = networkCapabilities.getTransportInfo();
    if (ti instanceof WifiAwareNetworkInfo) {
       WifiAwareNetworkInfo info = (WifiAwareNetworkInfo) ti;
       Inet6Address peerAddress = info.getPeerIpv6Addr();
       int peerPort = info.getPort();
    }
  }
  @Override
  public void onLost(Network network) {
    ...
  }
};

connMgr.requestNetwork(networkRequest, callback);

Go 기기의 SYSTEM_ALERT_WINDOW

Android 10 (Go 버전) 기기에서 실행되는 앱은 SYSTEM_ALERT_WINDOW 드림 권한을 부여했는지 확인합니다. 그리기 오버레이 창에서는 과도한 메모리를 사용하므로 이는 저용량 메모리 Android의 성능에 특히 해로운 기기에서 사용할 수 있습니다.

Android 9 이하를 실행하는 Go 버전 기기에서 실행되는 앱이 SYSTEM_ALERT_WINDOW 권한이 있는 경우에도 Android 10으로 업그레이드됩니다. 하지만 이 기능이 없는 앱에는 기기가 업그레이드된 후에는 권한을 부여할 수 없습니다.

Go 기기의 앱이 작업이 포함된 인텐트를 전송하는 경우 ACTION_MANAGE_OVERLAY_PERMISSION님, 시스템이 자동으로 요청을 거부하고 사용자를 설정 화면에 기기가 느려집니다. Go 기기의 앱이 Settings.canDrawOverlays()를 호출하는 경우 이 메서드는 항상 false를 반환합니다. 다시 말씀드리지만 이러한 제한사항은 이는 기기가 초기화되기 전에 SYSTEM_ALERT_WINDOW 권한을 수신한 것입니다. Android 10으로 업그레이드되었습니다.

이전 Android 버전을 대상으로 하는 앱에 대한 경고

Android 10 이상을 실행하는 기기에서는 사용자에게 처음 경고를 표시함 Android 5.1 (API 수준 22) 이하를 타겟팅하는 모든 앱을 실행합니다. 앱이 사용자가 권한을 부여해야 하는 경우 사용자에게도 기회가 제공됩니다. 앱이 처음으로 실행될 수 있도록 허용하기 전에 앱 권한을 조정할 수 있습니다. 있습니다.

Google Play의 대상 API로 인해 요구사항, 사용자가 업데이트되지 않은 앱을 실행할 때만 이 경고가 표시됩니다. 최근 다른 스토어를 통해 배포되는 앱의 경우 유사한 대상 API 는 2019년부터 적용됩니다. 이러한 기능에 대해 자세한 내용은 2019

SHA-2 CBC 암호화 제품군 제거

다음 SHA-2 CBC 암호화 제품군이 플랫폼에서 제거되었습니다.

  • TLS_RSA_WITH_AES_128_CBC_SHA256
  • TLS_RSA_WITH_AES_256_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384
  • TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
  • TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384

이러한 암호화 스위트는 GCM을 사용하는 유사한 암호화 스위트보다 보안 수준이 낮으므로 대부분의 서버는 이러한 암호화의 GCM 및 CBC 변형을 모두 지원합니다. 둘 다 지원하지 않을 수 있습니다.

앱 사용

Android 10에서는 앱 사용과 관련하여 다음과 같은 동작이 변경되었습니다.

  • UsageStats 앱 사용 개선 - Android 10은 UsageStats 화면 분할 또는 PIP 모드에서 사용됩니다. 또한 Android 10은 인스턴트 앱 사용을 올바르게 추적합니다.

  • 앱별 그레이 스케일 - Android 10은 앱 단위로 그레이 스케일 표시 모드를 설정할 수 있습니다.

  • 앱별 주의 분산 행동 상태 - Android 10에서는 선택적으로 앱을 '주의 분산 행동'으로 설정할 수 있음 각 항목의 의미는 다음과 같습니다. 알림이 표시되지 않고 추천 앱으로 표시되지 않습니다.

  • 정지 및 재생 - Android 10에서 정지된 앱은 오디오를 재생할 수 없습니다.

HTTPS 연결 변경

Android 10을 실행하는 앱이 nullsetSSLSocketFactory()에 전달하면 IllegalArgumentException이 발생합니다. 이전 버전에서는 setSSLSocketFactory()null 전달 현재 기본 기본값을 전달하는 것과 있습니다.

android.preference 라이브러리 지원 중단

android.preference 라이브러리는 Android 10부터 지원 중단됩니다. 개발자는 Android의 일부인 AndroidX 환경설정 라이브러리를 대신 사용해야 합니다. Jetpack의 구성요소로 구성됩니다. 마이그레이션 및 마이그레이션에 도움이 되는 추가 리소스는 업데이트된 설정을 확인하세요. 가이드공개 샘플 앱참조 문서를 확인하세요.

ZIP 파일 유틸리티 라이브러리 변경사항

Android 10에서는 java.util.zip의 클래스에 다음과 같은 변경사항이 도입되었습니다. ZIP 파일을 처리하는 패키지입니다. 이러한 변경으로 인해 라이브러리의 동작이 Android와 java.util.zip를 사용하는 다른 플랫폼 간에 일관성이 있어야 합니다.

Inflater

이전 버전에서는 Inflater 클래스의 일부 메서드가 end() 호출 후에 호출되면 IllegalStateException을 발생시켰습니다. Android 10에서 이러한 메서드는 대신 NullPointerException를 사용하세요.

ZipFile

Android 10 이상에서는 ZipFile 유형 File, int, Charset의 인수를 받는 경우 ZipException: 제공된 ZIP 파일이 에 파일이 포함되어 있지 않습니다.

ZipOutputStream

Android 10 이상에서는 ZipOutputStreamfinish() 메서드가 파일이 포함되지 않은 ZIP 파일의 출력 스트림을 쓰려고 시도해도 ZipException을 발생시키지 않습니다.

카메라 변경사항

카메라를 사용하는 많은 앱은 기기가 세로 모드라면 물리적 기기도 세로 방향입니다. 카메라 방향. 예전에는 안전한 가정이었지만 폴더블과 같은 사용 가능한 폼 팩터의 확장에 따라 변화했습니다. 그 것이 잘못 회전하거나 확장 (또는 모두) 카메라 뷰파인더 디스플레이에 적용됩니다.

API 수준 24 이상을 타겟팅하는 애플리케이션은 android:resizeableActivity를 명시적으로 설정하고 멀티 윈도우 작업을 처리하는 데 필요한 기능을 제공해야 합니다.

배터리 사용량 추적

Android 10부터 SystemHealthManager 재설정 중요한 이벤트 발생 후 기기의 플러그를 뽑을 때마다 배터리 사용 통계가 충전 이벤트를 참고하세요. 일반적으로 주요 충전 이벤트란 기기가 완전히 충전되었거나 기기의 배터리가 거의 소모된 상태에서 대부분 충전된 상태가 된 것을 말합니다.

Android 10 이전에는 기기가 초기화될 때마다 배터리 사용량 통계가 재설정되었습니다. 배터리 수준이 아무리 변화해도 전원이 연결되지 않은 상태였습니다.

Android Beam 지원 중단

Android 10에서는 Android Beam, 즉 Android의 이전 기능인 근거리 무선통신 (NFC)을 통해 기기 간 데이터 공유 시작 또한 몇몇 관련 NFC API도 지원 중단됩니다. Android Beam 유지 원하는 기기 제조업체 파트너가 선택적으로 사용할 수 있지만 더 오래 지속됩니다. Android는 다른 NFC를 계속 지원합니다. API, 태그 및 API에서 읽기와 같은 정상적으로 지급이 이루어집니다.

java.math.BigDecimal.stripTrailingZeros() 동작 변경

BigDecimal.stripTrailingZeros()는 더 이상 후행 0을 특별한 경우는 입력 값이 0인 경우입니다.

java.util.regex.Matcher 및 패턴 동작 변경사항

split()의 결과가 더 이상 빈 String로 시작하지 않도록 변경되었습니다. 입력 시작 부분에 너비가 0인 경우 일치하는 항목('')을 반환합니다. 또한 String.split()에 영향을 미칩니다. 예를 들어 "x".split("")는 이제 {"x"}를 반환합니다. 반면 이전 버전의 Android에서는 {"", "x"}을 반환했습니다. "aardvark".split("(?=a)"는 이제 다음 대신 {"a", "ardv", "ark"}를 반환합니다. {"", "a", "ardv", "ark"}입니다.

잘못된 인수에 대한 예외 동작도 개선되었습니다.

  • 이제 appendReplacement(StringBuffer, String)에서 다음과 같은 경우 IndexOutOfBoundsException 대신 IllegalArgumentException 교체 String이 론 백슬래시로 끝나는데, 이는 불법입니다. 이제 교체 String$로 끝나는 경우 동일한 예외가 발생합니다. 이전에는 이 시나리오에서 예외가 발생하지 않았습니다.
  • replaceFirst(null)는 다음과 같은 경우 Matcher에서 더 이상 reset()를 호출하지 않습니다. NullPointerException입니다. 이제 NullPointerException은 있을 때 발생합니다. 일치하지 않습니다. 이전에는 일치하는 항목이 있는 경우에만 발생했습니다.
  • 이제 start(int group), end(int group), group(int group)가 더 많이 발생합니다. 그룹 색인이 범위를 벗어나는 경우 일반 IndexOutOfBoundsException입니다. 이전에는 이러한 메서드에서 ArrayIndexOutOfBoundsException이 발생했습니다.

GradientDrawable의 기본 각도는 이제 TOP_BOTTOM입니다.

Android 10에서 GradientDrawable 드림 XML 형식으로 변환되며 각도 측정, 그라데이션 방향은 제공하지 않습니다. 기본값은 TOP_BOTTOM 이는 기본 Android 버전인 이전 Android 버전과는 달라진 점입니다. LEFT_RIGHT

최신 버전의 AAPT2로 업데이트하면 문제를 해결할 수 있습니다. 도구는 각도가 없는 경우 기존 앱의 각도 측정값을 0으로 설정합니다. 사용됩니다.

기본 SUID를 사용하여 직렬화된 객체 로깅

Android 7.0 (API 수준 24)부터 플랫폼에서는 직렬화 가능한 기본 serialVersionUID로 설정 객체. 이 수정사항은 API 수준 23 이하를 타겟팅하는 앱에는 영향을 미치지 않았습니다.

앱이 API 수준 23 이하를 타겟팅하는 경우 Android 10부터 이전되고 잘못된 기본 serialVersionUID를 기반으로 하는 시스템 로그 코드 수정을 제안합니다.

특히 다음 사항이 모두 참인 경우 시스템에서 경고를 기록합니다.

  • 앱이 API 수준 23 이하를 타겟팅합니다.
  • 클래스가 직렬화됩니다.
  • 직렬화된 클래스는 대신 기본 serialVersionUID를 사용합니다. 명시적으로 serialVersionUID를 설정해야 합니다.
  • 기본 serialVersionUIDserialVersionUID와 다릅니다. 앱이 API 수준 24 이상을 타겟팅한 경우입니다.

이 경고는 영향을 받는 각 클래스에 대해 한 번씩 로깅됩니다. 경고 메시지에는 serialVersionUID를 다음 경우에 계산되는 기본값으로 설정합니다. 앱이 API 수준 24 이상을 타겟팅함 해당 수정사항을 사용하면 해당 클래스의 객체가 API 수준을 대상으로 하는 앱에서 직렬화되는 경우 23 이하이면 24 이상을 타겟팅하는 앱에서 객체를 올바르게 읽습니다. 그 반대의 경우도 마찬가지입니다.

java.io.FileChannel.map() 변경사항

Android 10부터 FileChannel.map()는 다음에서 지원되지 않습니다. 다음을 사용하여 크기를 변경할 수 없는 비표준 파일(예: /dev/zero) truncate() 이전 Android 버전이 18비트에서 반환한 오류를 truncate()이지만 Android 10에서는 IOException이 발생합니다. 이전 동작이 필요한 경우 네이티브 코드를 사용해야 합니다.