Android 8.0 동작 변경사항

Android 8.0 (API 수준 26) 에는 다양한 시스템 및 API 동작 변경사항이 포함되어 있습니다. 이 문서 여러분이 이해하고 고려해야 하는 몇 가지 주요 변경사항을 살펴보겠습니다. 확인할 수 있습니다.

이러한 변경사항은 대부분 앱의 버전과 관계없이 모든 앱에 타겟으로 하는 Android입니다. 그러나 일부 변경사항은 앱 타겟팅에만 영향을 미칩니다. Android 8.0 명확성을 극대화하려면 페이지는 모든 앱에 적용되는 변경사항앱 타겟팅 변경사항의 두 섹션으로 나뉩니다. Android 8.0

모든 앱의 변경사항

이러한 동작 변경사항은 다음과 같은 경우 모든 앱에 적용됩니다. 상관없이 Android 8.0 (API 레벨 26) 플랫폼에서 실행됩니다. 대상으로 하는 API 수준입니다. 모든 개발자는 적절하게 지원하도록 앱을 수정하고 (앱에 해당하는 경우)

백그라운드 실행 제한

Android 8.0 (API 수준 26)에 도입된 변경사항 중 하나는 배터리 수명을 개선할 수 있습니다. 캐시됨 활성 상태이며 구성요소, 시스템이 앱이 유지하고 있는 모든 wakelock을 해제합니다.

또한 기기 성능을 개선하기 위해 시스템에서는 특정 포그라운드에서 실행되지 않는 앱에 의한 동작 구체적으로는 다음과 같습니다.

  • 이제 백그라운드에서 실행 중인 앱에는 백그라운드 서비스에 액세스할 수 있습니다
  • 앱이 자체 매니페스트를 사용하여 대부분의 암시적 브로드캐스트에 등록할 수 없음 (즉, 앱을 특별히 타겟팅하지 않은 브로드캐스트)

기본적으로, 이들 제한은 O를 대상으로 하는 앱에만 적용됩니다. 하지만 사용자는 설정 화면에서 모든 앱에 이러한 제한을 사용 설정할 수 있습니다. 비록 앱이 O를 타겟팅하지 않았더라도 말이죠

Android 8.0 (API 수준 26)에는 특정 메서드에 대한 다음과 같은 변경사항도 포함되어 있습니다.

  • 이제 startService() 메서드에서 다음이 발생합니다. IllegalStateException 앱인 경우 Android 8.0을 타겟팅하는 경우 이 메서드를 사용하려고 합니다 백그라운드 서비스 생성이 허용되지 않는 상황
  • Context.startForegroundService() 메서드는 포그라운드 서비스가 될 수 있습니다 시스템에서 앱 허용 앱이 켜져 있을 때도 Context.startForegroundService()를 호출할 수 있습니다. 실행됩니다. 그러나 앱은 5분 이내에 서비스의 startForeground() 메서드를 호출해야 합니다. 서비스 생성 후 경과 시간(초)이 경과하지 않았습니다.

자세한 내용은 백그라운드 실행 제한.

Android 백그라운드 위치 제한

배터리, 사용자 환경 및 시스템 상태를 유지하기 위해 백그라운드 앱은 기기에서 사용할 때 위치 업데이트를 수신하는 빈도가 낮습니다. Android 8.0 실행 중임 이 동작 변경사항은 모든 앱에 영향을 미칩니다. Google Play 서비스를 포함하여 위치 업데이트를 수신하는 앱.

이런 변경 사항은 다음 API에 영향을 미칩니다.

  • FLP(Fused Location Provider)
  • 지오펜싱
  • GNSS Measurements
  • Location Manager
  • Wi-Fi Manager

앱이 예상대로 실행되도록 보장하려면 다음 단계를 완료하세요.

  • 앱의 로직을 검토하고 최신 위치를 사용 중인지 확인 API에 액세스할 수 있습니다
  • 앱이 각 사용에서 예상되는 동작을 보이는지 테스트합니다. 있습니다.
  • 다음과 같은 방법을 사용해 보세요. 융합 위치 제공자 (FLP) 또는 지오펜싱 사용자의 현재 위치

이러한 변경사항에 대한 자세한 내용은 다음을 참고하세요. 배경 위치 제한사항.

앱 바로가기

Android 8.0 (API 수준 26)에서는 앱 바로가기에 다음과 같은 변경 사항이 있습니다.

  • com.android.launcher.action.INSTALL_SHORTCUT 브로드캐스트 이제 앱이 비공개적이고 암시적인 있습니다. 대신 requestPinShortcut() ShortcutManager 클래스에서 상속됩니다.
  • ACTION_CREATE_SHORTCUT 인텐트는 이제 ShortcutManager 클래스. 이 인텐트는 또한 ShortcutManager 이전에는 이 인텐트가 기존 런처 바로가기만 만듭니다
  • 다음을 사용하여 생성된 바로가기 requestPinShortcut() 및 단축키를 지원하는 활동에서 만들어진 ACTION_CREATE_SHORTCUT 인텐트는 이제 완전한 앱 바로 가기입니다. 따라서 이제 앱에서 ShortcutManager의 메서드 사용
  • 기존 단축키는 이전 버전의 기능을 그대로 유지합니다. 하지만 앱에서 직접 앱 바로가기로 변환해야 합니다.

앱 바로가기 변경사항에 대한 자세한 내용은 다음을 참고하세요. 바로가기 및 위젯 기능 가이드를 참조하세요.

언어와 국제화

Android 7.0 (API 수준 24)은 기본 Category Locale을 지정하지만 일부 API는 일반 Locale.getDefault() 메서드를 대체해야 할 때 인수 없이 기본 DISPLAY 카테고리 언어를 대신 사용해야 할 때 사용합니다. Android 8.0 (API 수준 26)에서는 이제 다음 메서드가 Locale.getDefault(Category.DISPLAY)를 사용합니다. Locale.getDefault() 대신 다음과 같이 입력합니다.

추가로 Locale.getDisplayScript(Locale) Locale.getDefault()로 대체됩니다. Locale에 지정된 displayScript 값 인수를 사용할 수 없습니다.

추가적인 언어 및 국제화 관련 변경사항은 다음과 같습니다.

  • Currency.getDisplayName(null)를 호출하면 NullPointerException이 발생합니다. 문서화된 동작과 일치해야 합니다
  • 시간대 이름 파싱이 바뀌었습니다. 이전에는 Android 기기가 부팅 시 샘플링된 시스템 클록 값을 사용함 날짜 파싱에 사용된 시간대 이름을 캐시할 시간 표시됩니다. 결과적으로 시스템이 클록 오류가 발생했습니다.

    일반적으로 파싱 로직은 ICU를 사용하고 시간대 이름을 파싱할 때 현재 시스템 시계 값입니다. 이 보다 정확한 결과를 제공하기 때문에 이전과 다를 수 있습니다. 앱에서 다음과 같은 클래스를 사용할 때 Android 버전 SimpleDateFormat

  • Android 8.0 (API 수준 26)은 ICU의 버전을 버전 58로 업데이트합니다.

경고 창

앱에서 SYSTEM_ALERT_WINDOW를 사용하는 경우 다음 창 유형 중 하나를 사용하여 다른 앱 및 시스템 창 위의 경고 창:

이러한 창은 항상 TYPE_APPLICATION_OVERLAY 창 있습니다. 앱이 Android 8.0 (API 수준 26)을 타겟팅하는 경우 TYPE_APPLICATION_OVERLAY 창 유형을 사용하여 알림 창을 표시합니다.

자세한 내용은 일반적인 창 유형 앱에 대한 동작 변경사항 내 알림 창 섹션 Android 8.0을 타겟팅합니다.

입력 및 탐색

ChromeOS 및 기타 대형 폼 팩터에서 Android 앱이 출현하면서 태블릿에서 키보드 탐색을 사용하는 경우가 Android 앱 Android 8.0 (API 수준 26) 내에서는 키보드가 탐색 입력 장치로 쓰이기 때문에 훨씬 안정적이고 탐색에 사용할 수 있는 예측 가능한 모델입니다.

특히 요소 포커스에 다음과 같은 변경사항을 적용했습니다. 있습니다.

  • 광고에 포커스 상태 색상을 정의하지 않은 경우 View 객체 (포그라운드 또는 백그라운드) 드로어블)을 가져올 수 있으므로, 이제 프레임워크는 요소에 대한 기본 포커스 하이라이트 색상을 설정합니다. View입니다. 이 포커스 하이라이트는 리플 드로어블로 학습됩니다.

    View 객체가 이 기본값을 사용하지 않도록 하려면 포커스를 받으면 android:defaultFocusHighlightEnabled 속성이 false가 포함된 레이아웃 XML 파일의 View 또는 false를 다음으로 전달합니다. setDefaultFocusHighlightEnabled()를 사용해야 합니다.

  • 키보드 입력이 UI 요소 포커스에 미치는 영향을 테스트하려면 그리기 > 레이아웃 경계 표시 개발자 옵션. Android의 경우 8.0에서 이 옵션은 'X'를 표시합니다. 아이콘 위에 표시됩니다. 집중하세요.

또한 Android 8.0의 모든 툴바 요소는 자동으로 키보드 탐색 클러스터와 사용자가 각 툴바를 탐색할 때 하나의 도구로 있습니다.

내에서 키보드 탐색 지원을 개선하는 방법을 자세히 알아보세요. 자세한 내용은 지원 키보드 탐색 가이드를 참조하세요.

웹 양식 자동완성

이제 Android 자동 완성 기능이 프레임워크는 자동 완성 기능을 기본적으로 지원합니다. WebView 객체와 관련된 다음 메서드가 변경되었습니다. Android 8.0 (API 레벨 26)을 실행하는 기기에 설치된 앱의 경우:

WebSettings
  • getSaveFormData() 메서드가 이제 false를 반환합니다. 이전에 이 메서드는 대신 true하세요.
  • 전화 거는 중 setSaveFormData()명 참석 안함 효과가 더 이상 없습니다.
WebViewDatabase
  • 전화 거는 중 clearFormData()명 참석 안함 효과가 더 이상 없습니다.
  • 이 메서드 hasFormData()개 이제 false를 반환합니다. 이전에 이 메서드는 true: 양식에 데이터가 포함된 경우

접근성

Android 8.0 (API 수준 26)에는 접근성에 다음과 같은 변경 사항이 포함되어 있습니다.

  • 이제 접근성 프레임워크가 모든 두 번 탭 동작을 ACTION_CLICK 있습니다. 이렇게 변경하면 TalkBack이 액세스할 수 있습니다

    앱의 View 객체가 맞춤 터치를 사용하는 경우 TalkBack에서 계속 작동하는지 확인해야 합니다. 이 View가 객체입니다. TalkBack이 기기에서 수행된 동작을 인식하지 못하는 경우 View 객체, 재정의 performAccessibilityAction()입니다.

  • 이제 접근성 서비스에서 모든 앱 내 인스턴스 ClickableSpanTextView 객체.

앱의 접근성을 높이는 방법을 자세히 알아보려면 다음을 참고하세요. 접근성.

네트워킹 및 HTTP(S) 연결

Android 8.0 (API 수준 26)에는 다음과 같은 동작 변경사항이 포함되어 있습니다. 네트워킹 및 HTTP(S) 연결성입니다

  • 본문이 없는 OPTIONS 요청에 Content-Length: 0가 있음 헤더를 클릭하세요. 이전에는 Content-Length 헤더가 없었습니다.
  • HttpURLConnection은 호스트 또는 기관 이름 뒤에 슬래시가 있어야 합니다. 예를 들어 http://example.com을(를) 다음으로 변환 http://example.com/입니다.
  • ProxySelector.setDefault()를 통해 설정된 맞춤 프록시 선택기 요청된 URL의 주소 (스키마, 호스트, 포트)만 타겟팅합니다. 따라서 이런 값만 기준으로 프록시를 선택할 수 있습니다. URL 에 전달된 URL에는 요청된 URL의 쿼리 매개변수 또는 프래그먼트를 사용할 수 있습니다
  • URI는 빈 레이블을 포함할 수 없습니다.

    이전에는 플랫폼에서 빈 라벨을 허용하는 해결 방법을 지원했지만 잘못된 호스트 이름을 사용하는 것입니다. 이 해결 방법은 이전 libcore 릴리스와의 호환성 API를 사용하는 개발자 'URI example..com에 빈 라벨이 있음'이라는 ADB 메시지가 잘못 표시됨 호스트 이름입니다 형식이 잘못되었으며 향후 Android에서 허용되지 않습니다. 참조하세요. Android 8.0에서는 이 해결 방법이 삭제됩니다. 시스템은 잘못된 형식의 URI인 경우 null입니다.

  • Android 8.0의 HttpsURLConnection 구현 안전하지 않은 TLS/SSL 프로토콜 버전 대체를 수행하지 않습니다.
  • HTTP(S) 연결의 터널링 처리는 다음과 같이 변경되었습니다. <ph type="x-smartling-placeholder">
      </ph>
    • 연결을 통해 HTTPS 연결을 터널링할 때 시스템은 는 전송 시 호스트 행에 포트 번호 (:443)를 올바르게 배치합니다. 중간 서버로 전송합니다. 이전에는 포트가 CONNECT 라인에서만 번호가 발생했습니다.
    • 시스템에서 더 이상 사용자 에이전트 및 프록시 승인을 전송하지 않습니다. 외부 IP 주소를 사용하여 프록시 서버로 전송할 수 있습니다.

      시스템은 더 이상 설정 시 터널링된 Http(s)URLConnection을 터널입니다 대신 시스템은 프록시-승인 헤더를 생성합니다. 해당 프록시가 초기 요청에 대한 응답으로 HTTP 407입니다.

      마찬가지로 시스템은 더 이상 user-agent 헤더를 복사하지 않습니다. 터널입니다 대신 라이브러리는 이를 위한 user-agent 헤더를 생성합니다. 합니다.

  • send(java.net.DatagramPacket) 이전에 실행된 connect()가 실행되면 SocketException이 발생함 메서드가 실패했습니다.
    • 오류가 있는 경우 DatagramSocket.connect()는 pendingSocketException을 내부 오류 발생 Android 8.0 이전에는 후속 recv() send() 호출이 성공했더라도 호출 시 SocketException이 발생함 지금은 일관성을 위해 두 호출에서 모두 SocketException이 발생합니다.
  • InetAddress.isReachable()은 ICMP를 시도한 후에 TCP 에코로 대체합니다. 사용할 수 있습니다
    • google.com과 같은 포트 7 (TCP Echo)을 차단하는 일부 호스트는 이제 ICMP 에코 프로토콜을 수락하면 연결될 수 있습니다.
    • 실제로 연결할 수 없는 호스트의 경우, 이러한 변경은 호출이 반환되기 전에 소비됩니다.

블루투스

Android 8.0 (API 수준 26)은 ScanRecord.getBytes() 메서드가 검색됩니다.

  • getBytes() 메서드는 수신된 바이트 수입니다. 따라서 앱은 반환되는 최소 또는 최대 바이트 수입니다. 대신 그들은 결과 배열의 길이입니다.
  • 블루투스 5 호환 기기는 다음의 데이터 길이를 반환할 수 있습니다. 이전 최대 ~60바이트였습니다.
  • 원격 기기가 스캔 응답을 제공하지 않는 경우 60바이트 미만이어야 합니다. 반환될 수 있습니다.

원활한 연결

Android 8.0 (API 수준 26)에서는 Wi-Fi 설정을 다양하게 개선하여 더 쉽게 선택할 수 있도록 했습니다. 최상의 사용자 환경을 제공하는 Wi-Fi 네트워크입니다. 구체적인 변경 사항은 다음과 같습니다.

  • 안정성 및 신뢰성 개선
  • 더욱 직관적으로 읽을 수 있는 UI
  • 하나로 통합된 Wi-Fi Preferences 메뉴
  • 호환 기기에서 저장된 고품질 네트워크가 있을 때 Wi-Fi 자동 활성화 이(가) 근처에 있습니다.

보안

Android 8.0에는 다음과 같은 보안 관련 기능이 포함되어 있습니다. 변경사항:

  • 플랫폼에 더 이상 SSLv3를 지원하지 않습니다.
  • 잘못 설정된 서버에 대한 HTTPS 연결을 설정할 때 TLS 프로토콜 버전 협상 구현 HttpsURLConnection에서 더 이상 해결 방법을 시도하지 않음 이전 TLS 프로토콜 버전으로 대체하고 재시도할 수 있습니다
  • Android 8.0 (API 수준 26)은 보안 컴퓨팅 (SECCOMP)을 적용합니다. 모든 앱에 필터를 적용합니다. 허용되는 syscall의 목록은 바이오닉을 통해 노출될 수 있습니다. 다른 여러 syscall이 제공되지만 사용하지 않는 것이 좋습니다.
  • 이제 앱의 WebView 객체가 멀티 프로세스에서 실행됨 있습니다. 웹 콘텐츠는 보안 강화를 위한 앱 프로세스를 포함합니다.
  • APK가 이름이 끝나는 디렉터리에 있다고 더 이상 가정할 수 없음 -1 또는 -2로 변환합니다. 앱은 다음 항목을 받으려면 sourceDir하세요. 디렉터리 형식에 직접 의존하지 마세요.
  • 기본 도메인 네이티브 라이브러리를 참고하세요.

또한, Android 8.0 (API 레벨 26)에는 설치 시 다음과 같은 변경 사항이 도입되었습니다. 알 수 없는 소스의 알 수 없는 앱:

알 수 없는 앱 설치에 관한 추가 세부정보는 다음을 참고하세요. 알 수 없는 앱 설치 권한 가이드를 참조하세요.

앱 보안 강화에 관한 추가 가이드라인은 다음을 참고하세요. Android 개발자를 위한 보안.

개인정보 보호

Android 8.0 (API 수준 26)은 다음과 같은 개인정보 보호 관련 기능을 제공합니다. 살펴봤습니다

  • 이제 플랫폼이 식별자를 다르게 처리합니다.
    • 다음 버전에 OTA 이전에 설치된 앱의 경우 Android 8.0 (API 수준 26) (API 수준 26), ANDROID_ID이(가) 동일하게 유지됨 제거했다가 OTA 후에 다시 설치하지 않는 한 여러 인벤토리에서 값을 보존하려면 제거하기 위해 개발자가 기존 값과 새로운 값을 <ph type="x-smartling-placeholder"></ph> 키-값 백업을 참조하세요.
    • Android 8.0을 실행하는 기기에 설치된 앱의 경우 이제 ANDROID_ID에 범위가 지정됨 앱 서명 키별, 사용자별입니다. 이 ANDROID_ID이(가) 고유합니다. 키-값 쌍입니다. 따라서 같은 기기에서 서로 다른 서명 키가 실행되는 앱이 실행됩니다. 더 이상 같은 Android ID가 표시되지 않습니다 (동일한 사용자라도 해당).
    • ANDROID_ID의 값 패키지 제거 또는 재설치 시 변경되지 않아야 하며, 서명 키가 동일한지 확인합니다 (앱이 OTA 전에 (Android 8.0 버전)
    • ANDROID_ID의 값 시스템 업데이트로 인해 패키지 서명 키가 변경되더라도 변경되지 않습니다.
    • Google Play 서비스 및 광고 ID로 배송되는 기기의 경우 반드시 <ph type="x-smartling-placeholder"></ph> 광고 ID. 앱을 통한 수익 창출을 위한 간단한 표준 시스템 광고 ID는 광고를 위해 사용자가 재설정할 수 있는 고유한 ID입니다. 제공 Google Play 서비스별

      다른 기기 제조업체는 계속 진행 ANDROID_ID를 제공합니다.

  • net.hostname 시스템 속성을 쿼리하면 null이 생성됩니다. 표시됩니다.

포착되지 않는 예외 로그 기록

앱에서 다음을 실행하는 Thread.UncaughtExceptionHandler를 설치하는 경우 기본 Thread.UncaughtExceptionHandler로 호출되지 않습니다. 시스템은 포착되지 않은 예외가 발생할 때 앱을 종료하지 않습니다. 최저가: Android 8.0 (API 레벨 26)의 경우 시스템은 상황입니다. 이전 버전의 플랫폼에서는 시스템이 예외 스택 트레이스를 로깅했습니다.

맞춤 Thread.UncaughtExceptionHandler를 사용하는 것이 좋습니다. 구현은 항상 기본 핸들러 이 권장사항을 준수하는 앱은 다음 항목의 영향을 받지 않습니다. Android 8.0의 변경사항에 대해 살펴보겠습니다.

findViewById() 서명 변경

findViewById() 메서드의 모든 인스턴스는 이제 View 대신 <T extends View> T를 반환합니다. 이 변경사항 다음과 같은 영향이 있습니다.

  • 이로 인해 기존 코드의 반환 유형이 모호해질 수 있습니다. 예를 들어 someMethod(View)과 호출 결과를 가져오는 someMethod(TextView) findViewById()입니다.
  • Java 8 소스 언어를 사용할 때는 View: 반환 유형에 제약이 없는 경우 (예: assertNotNull(findViewById(...)).someViewMethod())입니다.
  • 최종이 아닌 findViewById() 메서드 재정의( 예: Activity.findViewById())의 경우 반품이 필요합니다. 유형이 업데이트되었습니다.

연락처 제공자 사용 통계 변경

이전 버전의 Android에서는 연락처 제공자 구성 요소가 개발자가 각 연락처의 사용 데이터를 가져올 수 있습니다. 이 사용 데이터 각 이메일 주소 및 연결된 각 전화번호에 대한 정보를 노출 연락한 횟수를 포함하여 연락처와 연결 마지막으로 연락한 시간 등이 포함됩니다. 앱에서 READ_CONTACTS 이 데이터를 읽을 수 있습니다.

앱에서 요청하는 경우 이 데이터를 계속 읽을 수 있습니다. READ_CONTACTS 권한을 부여했는지 확인합니다. Android 8.0 (API 수준 26) 이상에서 사용 데이터 쿼리가 반환됨 정확한 값이 아닌 근사치입니다. Android 시스템은 따라서 이 변경사항은 자동 완성 API를 사용할 수 있습니다.

이 동작 변경 사항은 다음과 같은 쿼리 매개변수에 영향을 줍니다.

컬렉션 처리

AbstractCollection.removeAll()AbstractCollection.retainAll() 이제 항상 NullPointerException이 발생합니다. 이전에 컬렉션 실행 시 NullPointerException이 발생하지 않았습니다. 비어 있습니다. 이런 변경은 동작이 문서와 일치하도록 만듭니다.

Android 엔터프라이즈

Android 8.0 (API 수준 26)은 기기 등 엔터프라이즈 앱용 일부 API 및 기능의 동작 정책 컨트롤러 (DPC) 변경 사항은 다음과 같습니다.

  • 완벽히 관리되는 기기에서 앱이 작업 프로필을 지원하도록 도와주는 새로운 동작.
  • 시스템 업데이트 처리, 앱 인증, 인증에 대한 변경사항 기기 및 시스템 무결성 향상
  • 프로비저닝, 알림, 실시간 스트리밍 등 최근 화면 및 상시 사용 설정 VPN

Android 8.0 (API 수준 26)의 모든 엔터프라이즈 변경사항을 확인하고 이러한 변경사항이 어떻게 적용되는지 자세한 내용은 Android 엔터프라이즈를 참조하세요.

Android 8.0을 타겟팅하는 앱

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

경고 창

SYSTEM_ALERT_WINDOW를 사용하는 앱 권한이 더 이상 다음 창 유형을 사용하여 알림 창을 표시할 수 없음 다른 앱 및 시스템 창 위:

대신 앱은 TYPE_APPLICATION_OVERLAY

TYPE_APPLICATION_OVERLAY 창 앱의 알림 창을 표시하고 다음 특성을 유지하도록 입력합니다. 명심하세요.

  • 앱의 경고 창은 항상 다음과 같은 중요한 시스템 창 아래에 표시됩니다. 상태 표시줄 및 IME로 설정합니다.
  • 시스템은 TYPE_APPLICATION_OVERLAY 창 유형을 사용하여 화면 표시를 개선합니다.
  • 사용자는 알림 창을 열어서 설정에 액세스하여 앱에서 TYPE_APPLICATION_OVERLAY 창 유형.

콘텐츠 변경 알림

Android 8.0 (API 수준 26)은 ContentResolver.notifyChange()registerContentObserver(Uri, boolean, ContentObserver) 작동하는 방식을 보여줍니다.

이러한 API에는 이제 유효한 ContentProvider 모든 URI의 권한에 관해 정의됩니다. 관련 권한으로 유효한 ContentProvider를 정의하면 악성 앱의 콘텐츠 변경사항으로부터 앱을 보호하고 유출을 막을 수 있습니다.

뷰 포커스

이제 클릭 가능한 View 객체는 기본값입니다. View 객체를 클릭할 수는 있지만 클릭할 수 없도록 하려는 경우 포커스 가능하게 하려면 <ph type="x-smartling-placeholder"></ph> 레이아웃에서 android:focusable 속성을 false로 설정 View가 포함된 XML 파일 또는 false를 전달합니다. 앱 UI에서 setFocusable()로 제공합니다.

브라우저 감지 내 사용자 에이전트 일치

Android 8.0 (API 수준 26) 이상에는 빌드 식별자 문자열 OPR입니다. 일부 패턴 일치는 브라우저 감지 로직이 Opera가 아닌 브라우저를 Opera로 잘못 식별하게 합니다. 이러한 패턴 일치의 예는 다음과 같습니다.

if(p.match(/OPR/)){k="Opera";c=p.match(/OPR\/(\d+.\d+)/);n=new Ext.Version(c[1])}

이러한 오인으로 인해 발생하는 문제를 방지하려면 Opera 브라우저의 패턴 일치로 OPR를 사용합니다.

보안

다음 변경사항은 Android 8.0 (API 수준 26)의 보안에 영향을 미칩니다.

  • 앱의 네트워크 보안 구성이 최적화 앱이 일반 텍스트 트래픽을 지원하는 것 외에도 WebView 객체는 HTTP를 통해 웹사이트에 액세스할 수 없습니다. 각 WebView 객체는 대신 HTTPS를 사용해야 합니다.
  • 알 수 없는 소스 허용 시스템 설정이 삭제됨 를 알 수 없는 앱 설치 권한으로 알 수 없는 앱 설치 관리 알 수 없는 소스에서 수집됩니다. 이 새로운 권한에 대해 자세히 알아보려면 다음을 참조하세요. 알 수 없는 앱 설치 권한 가이드를 참조하세요.

앱 보안 강화에 관한 추가 가이드라인은 다음을 참고하세요. Android 개발자를 위한 보안.

계정 액세스 및 검색 가능 여부

Android 8.0 (API 수준 26)에서 앱이 더 이상 액세스할 수 없음 인증자가 해당 계정을 소유하고 있거나 사용자가 해당 액세스 권한을 부여합니다. 이 GET_ACCOUNTS 권한 더 이상 충분하지 않습니다 앱이 계정 액세스 권한을 받으려면 다음 요건을 충족해야 합니다. AccountManager.newChooseAccountIntent() 사용 인증자별 메서드를 사용하여 축소하도록 요청합니다. 계정에 대한 액세스 권한을 얻은 후 앱이 AccountManager.getAccounts() 액세스할 수 있습니다

Android 8.0 지원 중단 LOGIN_ACCOUNTS_CHANGED_ACTION 앱 대신 addOnAccountsUpdatedListener() 런타임 중 계정 업데이트를 받을 수 있습니다.

계정 액세스 및 자세한 내용은 계정 액세스 검색 가능성에 대한 자세한 내용은 이 문서의 새 API 섹션에 나와 있습니다.

개인정보 보호

다음 변경사항은 Android 8.0 (API 수준 26)의 개인 정보 보호에 영향을 미칩니다.

  • 시스템 속성 net.dns1, net.dns2 net.dns3net.dns4이(가) 더 이상 아닙니다. 플랫폼의 개인 정보 보호를 개선하는 변경사항입니다.
  • DNS 서버와 같은 네트워킹 정보를 얻기 위해 ACCESS_NETWORK_STATE 권한은 NetworkRequest 또는 NetworkCallback 객체 Android 5.0(API 레벨 21) 이상에서 이런 클래스를 사용할 수 있습니다.
  • Build.SERIAL은 지원 중단됩니다. 하드웨어 일련번호를 알아야 하는 앱은 대신 새 Build.getSerial() 메서드를 사용합니다. READ_PHONE_STATE 권한을 부여했는지 확인합니다.
  • LauncherApps API에서 더 이상 직장 프로필을 허용하지 않습니다. 기본 프로필에 대한 정보를 가져옵니다. 사용자가 작업에 있을 때 LauncherApps API는 앱이 없는 것처럼 동작합니다. 동일한 프로필 그룹 내의 다른 프로필에 설치된 기기 이전과 마찬가지로 관련 없는 프로필에 액세스하려고 하면 SecurityException이 발생합니다.

권한

Android 8.0 (API 수준 26) 이전 앱에서 권한을 요청한 경우 권한이 부여된 경우, 시스템 또한 잘못 실행되었을 때 동일한 권한을 가진 나머지 권한을 앱에 부여 매니페스트에 등록된 모든 권한을 제어합니다.

Android 8.0을 타겟팅하는 앱의 경우 이 동작은 수정됩니다 앱에 명시적으로 부여된 권한만 부여 있습니다. 그러나 사용자가 앱에 권한을 부여하면 모두 해당 권한 그룹의 권한에 대한 후속 요청이 자동으로 부여됩니다.

예를 들어 앱이 READ_EXTERNAL_STORAGEWRITE_EXTERNAL_STORAGE를 포함해야 합니다. 앱이 READ_EXTERNAL_STORAGE 및 권한을 부여할 수 있습니다. 앱이 API 수준 25 이하를 타겟팅하는 경우 시스템은 동시에 WRITE_EXTERNAL_STORAGE 권한 부여 동일한 STORAGE 권한 그룹에 속하고 할 수 있습니다. 앱이 Android 8.0 (API 수준 26)을 타겟팅하는 경우 시스템은 해당 시점에 READ_EXTERNAL_STORAGE만 그러나 앱에서 나중에 WRITE_EXTERNAL_STORAGE를 요청하면 시스템은 즉시 사용자에게 메시지를 표시하지 않고 해당 권한을 부여합니다.

미디어

  • 프레임워크는 자동 오디오 볼륨 낮추기 알아내려고 합니다. 이 경우, 다른 애플리케이션이 AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK - 애플리케이션 이미지의 볼륨은 감소하지만 일반적으로 onAudioFocusChange() 이 콜백은 오디오 포커스를 잃을 수 있습니다. 이 동작을 재정의할 수 있는 새로운 API를 일시중지해야 하는 애플리케이션을 고려하는 것이 좋습니다
  • 사용자가 전화를 받으면 활성 미디어 스트림이 있습니다.
  • 모든 오디오 관련 API는 AudioAttributes를 사용해야 합니다. 오디오 스트림 유형 대신 사용하여 오디오 재생 사용 사례를 설명합니다. 볼륨 컨트롤에 대해서만 오디오 스트림 형식을 계속 사용하세요. 스트림 유형의 다른 용도는 계속 사용할 수 있음 (예: 지원 중단된 streamType 인수는 AudioTrack 생성자), 시스템은 이를 오류로 기록합니다.
  • AudioTrack 사용 시 애플리케이션이 충분히 큰 오디오 버퍼를 요청하면 가능한 경우 딥 버퍼 출력을 사용하려고 합니다.
  • Android 8.0 (API 수준 26)에서는 미디어 버튼 이벤트가 다르게 처리됩니다. <ph type="x-smartling-placeholder">
      </ph>
    1. 미디어 버튼 처리 UI 활동이 변경되지 않은 경우: 포그라운드 활동이 여전히 처리에서 우선순위를 얻음 미디어 버튼 이벤트입니다.
    2. 포그라운드 활동이 미디어 버튼 이벤트를 처리하지 않는 경우 시스템은 이벤트를 라우팅합니다. 최근에 로컬에서 오디오를 재생한 앱으로 이동합니다. 활성 상태, 플래그, 재생 어떤 앱이 미디어를 수신하는지 결정할 때 미디어 세션의 상태가 고려되지 않음 버튼 이벤트
    3. 앱의 미디어 세션이 해제된 경우 시스템은 미디어 버튼 이벤트를 앱의 MediaButtonReceiver(있는 경우).
    4. 다른 모든 경우에, 시스템이 미디어 버튼 이벤트를 삭제합니다.

네이티브 라이브러리

Android 8.0 (API 수준 26)을 타겟팅하는 앱에서는 네이티브 라이브러리가 로드 세그먼트가 쓰기 가능하고 있습니다. 일부 앱이 다음과 같은 경우 이 변경사항으로 인해 작동이 중지될 수 있습니다. 잘못된 로드 세그먼트가 있는 네이티브 라이브러리 이것은 보안 강화 조치를 취합니다

자세한 내용은 을(를) 참조하세요. 쓰기 가능 및 실행 가능 세그먼트를 참고하세요.

링커 변경 사항은 앱이 대상으로 하는 API 레벨과 연계됩니다. 만약 인코더-디코더에 있는 앱이 라이브러리를 로드할 수 없습니다. 만약 링커 변경이 발생하는 API 수준보다 낮은 API 수준 Logcat이 경고를 표시합니다.

컬렉션 처리

Android 8.0 (API 수준 26)에서 Collections.sort() 구현 날짜 List.sort()위 그 반대 은 Android 7.x (API 수준 24 및 25)에서 true였습니다. List.sort()의 기본 구현 Collections.sort()입니다.

이 변경사항으로 인해 Collections.sort() 최적화된 List.sort()를 최대한 활용하여 구현하지만 다음과 같은 제약 조건이 있습니다.

  • List.sort()의 구현 Collections.sort()를 호출하면 안 됩니다. 그렇게 하면 스택 오버플로가 구현될 수 있습니다. 대신 기본 동작을 원하는 경우 List 구현에서 sort()입니다.

    상위 클래스가 sort()를 부적절하게 구현하는 경우 일반적으로 List.sort()를 재정의해도 좋습니다. GKE를 기반으로 하는 List.toArray(), Arrays.sort()ListIterator.set()입니다. 예를 들면 다음과 같습니다.

    @Override
    public void sort(Comparator<? super E> c) {
      Object[] elements = toArray();
      Arrays.sort(elements, c);
      ListIterator<E> iterator = (ListIterator<Object>) listIterator();
      for (Object element : elements) {
        iterator.next();
        iterator.set((E) element);
      }
    }
    

    대부분의 경우 List.sort() 다음 코드로 교체합니다. 다른 기본 애플리케이션에 위임하는 API 수준에 따라 구현될 수 있습니다. 예를 들면 다음과 같습니다.

    @Override
    public void sort(Comparator<? super E> comparator) {
      if (Build.VERSION.SDK_INT <= 25) {
        Collections.sort(this);
      } else {
        super.sort(comparator);
      }
    }
    

    sort()를 원해서 후자를 실행하는 경우 메서드를 사용할 수 있는 경우 고유한 이름을 지정하는 것이 좋습니다. 예를 들어 sortCompat()와 같이 sort()

  • 이제 Collections.sort()이(가) 다음 항목으로 계산됩니다. 인코더-디코더 아키텍처를 sort()를 호출하는 구현을 나열합니다. 예를 들어 Android 8.0 (API 수준 26) 이전 플랫폼에서 ArrayListsort() 호출 반복이 진행되는 중간에 ConcurrentModificationException이(가) 발생합니다. 정렬이 완료되었는지 이를 위해 List.sort()를 호출합니다. Collections.sort() 예외가 발생하지 않습니다

    이 변경사항으로 인해 플랫폼 동작이 보다 일관성 있게 개선되었습니다. 접근하면 이제 ConcurrentModificationException이 발생합니다.

클래스 로드 동작

Android 8.0 (API 레벨 26)은 클래스 로더가 클래스 로더가 새 클래스를 로드할 때 런타임 가정을 위반하는 것입니다. 이러한 검사는 클래스가 Java( forName()) Dalvik 바이트 코드 또는 JNI입니다. 플랫폼은 Java에서 loadClass() 메서드를 호출할 때 확인할 수 있습니다. 이 동작은 정상 동작의 기능에 영향을 미치거나 클래스 로더를 사용하는 것이 좋습니다

플랫폼은 클래스 로더가 반환하는 클래스의 설명자를 확인합니다. 예상 설명어와 일치합니다. 반환된 설명자가 일치하지 않으면 플랫폼에서 NoClassDefFoundError 오류가 발생하고 예외에는 불일치를 설명하는 자세한 메시지가 포함됩니다.

플랫폼은 또한 요청된 클래스의 설명자가 올바른지 확인합니다. 이 check는 GetFieldID()와 같은 클래스를 간접적으로 로드하는 JNI 호출을 포착합니다. 잘못된 설명어를 해당 클래스에 전달 예를 들어 서명이 있는 필드는 서명이 잘못되어 java/lang/String을(를) 찾을 수 없습니다. Ljava/lang/String;이어야 합니다.

이는 FindClass()의 JNI 호출과 다릅니다. 여기서 java/lang/String은 유효한 정규화된 이름입니다.

Android 8.0 (API 수준 26)에서는 다중 클래스 로더가 클래스 정의를 시도하도록 지원하지 않음 동일한 DexFile 객체를 사용합니다. 그렇게 하려고 하면 Android 런타임에서 InternalError 'dex 파일 등록 시도 <filename>' 메시지와 함께 오류 발생 사용합니다.

이제 DexFile API는 지원 중단되었으므로 플랫폼 클래스 로더 중 하나(PathClassLoader 또는 대신 BaseDexClassLoader를 사용합니다.

참고: 다음을 참조하는 여러 클래스 로더를 만들 수 있습니다. JAR 파일 컨테이너에 있어야 합니다. 이렇게 하면 일반적으로 많은 메모리 오버헤드가 발생합니다. 컨테이너의 DEX 파일이 플랫폼에서는 해당 파일에 대해 mmap 작업을 실행할 수 있습니다. 직접 추출해 보겠습니다 그러나 플랫폼이 DEX 파일을 컨테이너에서 추출해야 하는 경우 DEX 파일을 이런 방식으로 참조하면 많은 메모리가 소비될 수 있습니다.

Android에서 모든 클래스 로더는 병렬 실행이 가능한 것으로 간주됩니다. 여러 스레드가 동일한 클래스가 포함된 동일한 클래스를 로드하려고 경합하는 경우 작업을 완료하는 첫 번째 스레드가 승계되고, 그 결과는 확인할 수 있습니다. 이 동작은 클래스 로더가 동일한 클래스를 반환했거나 다른 클래스를 반환했거나 예외가 발생한 경우. 플랫폼은 이러한 예외를 자동으로 무시합니다.

주의: 플랫폼 버전 Android 8.0 (API 수준 26)보다 낮은 경우, 이러한 가정을 깨면 동일한 클래스 혼동으로 인한 힙 손상, 클래스 혼동, 발생할 수 있습니다.