Android 9(API 레벨 28)에서는 Android 시스템에 많은 변경사항이 도입됩니다. 다음과 같은 동작 변경사항은 API 레벨 28 이상을 대상으로 하는 앱에만 적용됩니다. targetSdkVersion
이 API 레벨 28 이상으로 설정된 앱은 이러한 동작을 적절히 지원하도록 앱을 수정해야 합니다.
Android 9에서 실행되는 모든 앱에 영향을 미치는 변경사항의 경우, 대상으로 하는 API 레벨에 상관없이 동작 변경사항: 모든 앱을 참조하세요.
포그라운드 서비스
Android 9 이상을 대상으로 하고 포그라운드 서비스를 사용하는 앱은 FOREGROUND_SERVICE
권한을 요청해야 합니다. 이 권한은 정상 권한이므로, 시스템은 요청 앱에 자동으로 권한을 부여합니다.
Android 9을 대상으로 하는 앱이 FOREGROUND_SERVICE
를 요청하지 않고 포그라운드 서비스를 생성하려고 시도하면, 시스템이 SecurityException
을 발생시킵니다.
개인정보 보호정책 변경사항
앱이 Android 9을 대상으로 할 경우 다음의 동작 변경사항을 고려해야 합니다. 이러한 기기 일련번호 및 DNS 정보 업데이트로 사용자 개인정보 보호가 강화됩니다.
빌드 일련번호 지원 중단
Android 9에서는 Build.SERIAL
이 사용자 개인정보를 보호하기 위해 항상 "UNKNOWN"
으로 설정됩니다.
대신, 앱이 기기의 하드웨어 일련번호에 액세스해야 하는 경우에는 READ_PHONE_STATE
권한을 요청한 다음,getSerial()
을 호출해야 합니다.
DNS 개인정보 보호
Android 9을 대상으로 하는 앱은 비공개 DNS API를 준수해야 합니다. 특히, 시스템 확인자가 TLS를 통한 DNS를 수행할 경우 내장 DNS 클라이언트가 동일한 호스트 이름에 대해 암호화된 DNS를 시스템으로 사용하거나 시스템 확인자를 위해 비활성화됩니다.
프레임워크 보안 변경사항
Android 9에는 앱의 보안을 개선하는 여러 가지 변경사항이 포함되어 있지만 이러한 변경사항은 API 레벨 28 이상을 대상으로 하는 앱에만 적용됩니다.
기본적으로 네트워크 TLS 사용
앱이 Android 9 이상을 대상으로 하는 경우 isCleartextTrafficPermitted()
메서드는 기본적으로 false
를 반환합니다. 앱이 특정 도메인을 위해 일반 텍스트를 사용할 필요가 있을 경우 cleartextTrafficPermitted
앱의 네트워크 보안 구성에서 해당 도메인을 true
로 명시적으로 설정해야 합니다.
프로세스별로 구분되는 웹 기반 데이터 디렉토리
Android 9에서 앱 안정성과 데이터 무결성을 개선하기 위해, 앱은 여러 프로세스 사이에서 단일 WebView
데이터 디렉토리를 공유할 수 없습니다. 일반적으로, 이러한 데이터 디렉토리는 쿠키, HTTP 캐시 그리고 웹 검색과 관련된 다른 영구 저장소와 임시 저장소를 저장합니다.
대부분의 경우, 앱은 한 프로세스에서만 WebView
와 CookieManager
같은 android.webkit
패키지의 클래스를 사용해야 합니다. 예를 들어, WebView
를 사용하는 모든 Activity
객체를 같은 프로세스로 이동해야 합니다. 앱의 다른 프로세스에서 disableWebView()
를 호출하여 '한 프로세스만'이라는 규칙을 더욱 엄격하게 적용할 수 있습니다. 이 호출은 종속 라이브러리에서 호출되더라도 WebView
가 실수로 다른 프로세스에서 초기화되지 않도록 해줍니다.
앱이 두 개 이상의 프로세스에서 WebView
의 인스턴스를 사용해야 하는 경우 각 프로세스에서 WebView
의 주어진 인스턴스를 사용하기 전에 WebView.setDataDirectorySuffix()
메서드를 사용하여 해당 프로세스에 대해 고유한 데이터 디렉토리 접미사를 지정해야 합니다. 이 메서드느 각 프로세스의 웹 데이터를 앱의 데이터 디렉토리 내에 있는 자체 디렉토리에 넣습니다.
참고: setDataDirectorySuffix()
를 사용하더라도 시스템은 앱의 프로세스 경계를 가로질러 쿠키와 기타 웹 데이터를 공유하지 않습니다. 앱에서 여러 프로세스가 같은 웹 데이터에 액세스할 필요가 있을 경우 해당 프로세스 간에 이 웹 데이터를 직접 복사해야 합니다. 예를 들어, getCookie()
와 setCookie()
를 호출하여 프로세스 간에 쿠키 데이터를 수동으로 전송할 수 있습니다.
앱별 SELinux 도메인
Android 9 이상을 대상으로 하는 앱은 어디서든 액세스 가능한 Unix 권한을 사용하는 다른 앱과 데이터를 공유할 수 없습니다. 이 변경사항으로 Android Application Sandbox의 무결성, 특히 어떤 앱에서만 그 앱의 개인 데이터에 액세스할 수 있어야 한다는 요구사항이 개선됩니다.
다른 앱과 파일을 공유하려면 콘텐츠 제공자를 사용하세요.
연결 변경사항
연결 데이터 카운트 및 다중 경로
Android 9 이상을 대상으로 하는 앱에서 시스템은 현재 기본값이 아닌 네트워크상의 네트워크 트래픽 (예: 기기가 Wi-Fi에 연결되어 있을 때 이동통신 트래픽)을 측정하고 NetworkStatsManager
클래스에 메서드를 제공하여 해당 트래픽에 대해 쿼리합니다.
특히, 이제 getMultipathPreference()
는 앞서 언급한 네트워크 트래픽에 기반하여 값을 반환합니다. Android 9부터 이 메서드는 이동통신 데이터에 대해 true
를 반환하지만 하루에 일정 수준 이상 트래픽이 누적되면 false
를 반환하기 시작합니다. Android 9에서 실행되는 앱은 이 메서드를 호출하고 이 힌트를 고려해야 합니다.
이제 ConnectivityManager.NetworkCallback
클래스는 VPN에 대한 정보를 앱에 전송합니다. 이 변경으로 앱이 동기 및 비동기 호출을 혼용하거나 제한된 API를 사용하지 않고도 연결 이벤트를 수신할 수 있게 되었습니다. 또한, 이는 기기가 여러 Wi-Fi 네트워크나 여러 이동통신 네트워크에 동시에 연결되어 있으면 정보 전송이 예상대로 작동한다는 것을 의미합니다.
Apache HTTP 클라이언트 지원 중단
Android 6.0에서는 Apache HTTP 클라이언트에 대한 지원이 제거되었습니다. Android 9부터는 이 라이브러리가 bootclasspath에서 제거되고 기본적으로 앱에서 사용할 수 없습니다.
Android 9 이상을 대상으로 하는 앱이 Apache HTTP 클라이언트를 계속 사용하려면 다음을 AndroidManifest.xml
에 추가해야 합니다.
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
참고: android:required="false"
특성은 23 이하의 최소 SDK가 있는 앱에 필요합니다. API 레벨이 24보다 낮은 기기에서는 org.apache.http.legacy
라이브러리가 제공되지 않기 때문입니다. (이 기기에서는 Apache HTTP 클래스가 bootclasspath에서 제공됩니다.)
앱에서 런타임 Apache 라이브러리를 사용하는 대신 APK에 org.apache.http
라이브러리의 자체 버전을 번들링할 수 있습니다. 이 방법을 사용하려면 런타임에서 제공되는 클래스와의 클래스 호환성 문제를 피하기 위해 ( Jar Jar 등의 유틸리티로) 라이브러리를 다시 패키징해야 합니다.
UI 변경사항
뷰 포커스
0 영역(너비나 높이가 0)이 있는 뷰는 포커스가 불가능합니다.
또한 터치 모드에서는 액티비티가 더 이상 초기 포커스를 암시적으로 할당하지 않습니다. 그 대신, 원할 경우 초기 포커스를 명시적으로 요청해야 합니다.
CSS RGBA 16진수 값 처리
Android 9 이상을 대상으로 하는 앱에서는 4자리 및 8자리 16진수 CSS 색상을 처리하기 위한 초안 CSS 색상 모듈 레벨 4 동작을 지원합니다.
CSS 색상 모듈 레벨 4는 릴리스 52 이후로 Chrome에서 지원되었지만, 현재는 WebView에서 이 기능이 비활성화되었습니다. 그 이유는 기존의 Android 애플리케이션이 32비트 16진수 색상을 Android 순서지정(ARGB)에 포함했고 이로 인해 렌더링 오류가 발생할 수 있기 때문입니다.
예를 들어, API 레벨 27 이하를 대상으로 하는 앱의 경우, 현재 #80ff8080
색상은 WebView에서 불투명 연적색(#ff8080
)으로 렌더링됩니다. 선행 구성 요소(Android에서는 알파 구성 요소로 해석될 수 있음)는 현재 무시됩니다. 앱이 API 레벨 28 이상을 대상으로 하면 #80ff8080
은 50% 투명한 연녹색(#80ff80
)으로 해석됩니다.
문서 스크롤 요소
Android 9은 문서의 루트 요소가 스크롤 요소일 경우 이를 적절히 처리합니다. 이전 버전에서는 스크롤 위치가 본문 요소에만 설정되었으며, 루트 요소에는 0 스크롤 값이 있었습니다. Android 9에서는 스크롤 요소가 루트 요소가 되는 표준 호환 동작을 활성화합니다.
또한 document.body.scrollTop
, document.body.scrollLeft
, document.documentElement.scrollTop
또는 document.documentElement.scrollLeft
에 직접 액세스하는 동작이 대상 SDK에 따라 달라집니다. 뷰포트 스크롤 값에 액세스하려면 document.scrollingElement
를 사용하세요(사용 가능한 경우).
일시 정지된 앱의 알림
Android 9 이전에는 정지된 앱의 알림이 취소되었습니다. Android 9부터는 앱이 다시 시작될 때까지 정지된 앱의 알림이 숨겨집니다.