Android OS 9 Pie (Developer)

참고 : https://developer.android.com/about/versions/pie/android-9.0-changes-28

동작 변경사항: API 레벨 28+를 대상으로 하는 앱

요약


포그라운드 서비스시 반드시 권한 요청

빌드 일련번호 지원 중단 및 DNS 개인정보 보호 추가

프레임워크 보안 변경사항

  • 기본적으로 네트워크 TLS 사용
  • 프로세스별 WebView 데이터 디렉토리
  • 앱별 SELinux 도메인

다중 네트워크 트래픽 처리 및 Apache HTTP 클라이언트 지원 중단

뷰 포커스, CSS RGBA 값 처리, document 스크롤 처리, 일시 정지된 앱의 알림 등의 UI 변경


포그라운드 서비스

Android 9 이상 대상 앱에서 포그라운드 서비스를 사용하는 앱은 FOREGROUND_SERVICE 권한을 요청해야 함.

Android 9 이상에서 권한 요청 없이 포그라운드 서비스 생성 시도시 시스템이 SecurityException 발생함.

개인정보 보호 정책 변경사항

빌드 일련번호 지원 중단

Android 9에서는 Build.SERIAL 이 항상 "UNKNOWN"으로 설정됨.

기기 하드웨어 일련번호 액세스시 READ_PHONE_STATE 권한 요청 후 getSerial() 을 호출해야 함.

DNS 개인정보 보호

비공개 DNS API를 준수해야 함.

시스템 확인자가 TLS를 통한 DNS를 수행할 경우 내장 DNS 클라이언트가 동일한 호스트 이름에 대해 암호화된 DNS를 시스템으로 사용하거나 시스템 확인자를 위해 비활성화됨.

프레임워크 보안 변경사항

기본적으로 네트워크 TLS 사용

Android 9에서는 isCleartextTrafficPermitted() 메서드는 기본적으로 false를 반환함.

특정 도메인을 위해 일반 텍스트 사용할 필요 있을 경우 cleartextTrafficPermitted 앱의 네트워크 보안 구성에서 해당 도메인을 true로 명시적으로 설정해야 함.

프로세스 별로 구분되는 웹 기반 데이터 디렉토리

앱은 여러 프로세스 사이에서 단일 WebView 데이터 디렉토리를 공유할 수 없음.

이러한 데이터 디렉토리는 쿠키, HTTP 캐시 그리고 웹 검색과 관련된 다른 영구 저장소와 임시 저장소를 저장함.

대부분의 앱은 한 프로세스에서만 WebView와 CookieManager 같은 android.webkit 패키지의 클래스를 사용함.

앱이 두 개 이상의 프로세스에서 WebView 인스턴스를 사용해야 하는 경우 각 프로세스에서 WebView 의 인스턴스를 사용하기 전에 WebView.setDataDiretorySuffix() 메서드를 사용하여 해당 프로세스에 대한 고유한 데이터 디렉토리 접미사를 지정해야 함.

이 메서드는 각 프로세스의 웹 데이터를 앱의 데이터 디렉토리 내에 있는 자체 디렉토리에 넣음.

앱별 SELinux 도메인

Android 9 이상 앱은 어디서든 액세스 가능한 Unix 권한을 사용하는 다른 앱과 데이터를 공유할 수 없음.

다른 앱과 파일을 공유하려면 콘텐츠 프로바이더를 사용해야 함.

연결 변경사항

연결 데이터 카운트 및 다중 경로

시스템은 현재 기본값이 아닌 네트워크 상의 네트워크 트래픽을 측정하고 NetworkStatsManager 클래스에 메서드를 제공하여 해당 트래픽에 대해 쿼리함.

getMultipathPreference()도 네트워크 트래픽에 기반하여 값을 반환함. Android 9부터 이 메서드는 이동통신 데이터에 대해 true를 반환하지만 하루 일정 수준 이상 트래픽이 누적되면 false를 반환함.

ConnectivityManager.NetworkCallback 클래스는 VPN에 대한 정보를 앱에 전송함.

Apache HTTP 클라이언트 지원 중단

Android 6.0에서 Apache HTTP 클라이언트에 대한 지원이 제거됨.

Android 9부터는 이 라이브러리가 bootclasspath에서 제거되고 기본적으로 사용할 수 없음.

Android 9이상에서 앱이 Apache HTTP 클라이언트를 계속 사용하려면 AndroidManifes.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 유틸리티 등의 라이브러리로 리패키징 해야 함.

UI 변경사항

뷰 포커스

너비나 높이가 0인 뷰는 포커스가 불가능함.

터치모드에서는 액티비티가 초기 포커스를 암시적으로 할당하지 않으므로, 원할 경우 명시적으로 요청해야 함.

CSS RGBA 16진수 값 처리

Android 9 이상에서는 4자리 및 8자리 16진수 CSS 색상을 처리 지원함. (CSS 색상 모듈 레벨 4)

CSS 색상 모듈 레벨 4는 릴리즈 52 이후로 Chrome에서 지원되었지만 현재는 WebView에서 기능이 비활성화 되어있음.

ex) API 27이하 앱의 경우 #80ff8080 색상이 WebView에서 불투명 연적색(#ff8080)이지만 API 28 이상으로 타겟을 바꾸면 #80ff8080은 50% 투명한 연녹색(#80ff80)으로 해석됨.

문서 스크롤 요소

문서의 루트 요소가 스크롤 요소일 경우 적절히 처리함.

이전 버전에서는 스크롤 위치가 본문 요소에만 설정되었으며, 루트 요소는 스크롤 값 0이었음.

document.body.scrollTopdocument.body.scrollLeftdocument.documentElement.scrollTop 또는 document.documentElement.scrollLeft에 직접 액세스하는 동작이 대상 SDK에 따라 달라짐.

뷰포트 스크롤 값에 액세스하려면 document.scrollingElement를 사용해야 함.

일시 정지된 앱의 알림

Android 9 이전에는 정지된 앱의 알림이 취소되었음.

Android 9 부터는 앱이 다시 시작될 때까지 정지된 앱의 알림이 숨겨짐.

앱을 Android 9으로 마이그레이션

Android 9과의 호환성 보장

일부 플랫폼 변경사항은 앱의 작동방식에 영향을 미칠 수 있어 일부 조정은 필요함.

꼭 새로운 API를 사용하거나 targetSdkVersion을 변경할 필요는 없음.

호환성 테스트 수행

아래의 주요 변경사항을 검토하고 필요한 수정사항을 테스트.

변경사항요약
비 SDK 인터페이스에 대한 제한직접 액세스, JNI를 통한 액세스 또는 리플렉션을 통한 액세스 등 특정 비 SDK 인터페이스에 대한 액세스가 차단됨. 
제한된 인터페이스에 액세스하려고 시도하면 NoSuchFieldException 및 NoSuchMethodException과 같은 오류가 발생함.
Crypto 제공자 제거Android 9부터 Crypto JCA 제공자가 제거됨.
SecureRandom.getInstance("SHA1PRNG","Crypto")를 호출하면 NoSuchProviderException이 발생함.
엄격해진 UTF-8 디코더Android 9에서는 Java 언어의 UTF-8 디코더가 더욱 엄격하며 Unicode 표준을 따름.
유휴 앱의 경우 카메라, 마이크 및 센서에 대한 액세스 차단앱이 유휴 상태인 경우 카메라, 마이크 또는 SensorManager 센서에 더 이상 액세스할 수 없음.

대상 버전 업데이트 및 Android P 기능 사용

targetSdkVersion 을 28로 업데이트하고 Android 9의 새 기능을 추가하여 지원하는 방법.

Android 9 SDK 가져오기

Android Studio 3.1 이상을 사용시 Android 9 앱 빌드를 위한 SDK 패키지를 받을 수 있고 새 기능은 필요없고 컴파일만 수행하려는 경우 사용 가능함.

Android Studio 3.2에서는 Android 9 기능을 완벽하게 지원함.

Android 9 앱 테스트

targetSdkVersion 이 28로 설정된 경우 앱에 영향을 미치는 아래 내용들을 검토함.

변경사항요약
포그라운드 서비스 권한포그라운드 서비스를 사용시 FOREGROUND_SERVICE 권한을 요청해야 함. 
이 권한 없이 포그라운드 서비스를 시작하면 SecurityException이 발생.
Bouncy Castle 암호화 지원 중단Android 9에서는 Bouncy Castle 제공자가 제공하는 여러 암호화가 지원 중단되고 Conscrypt 제공자가 제공하는 암호화가 대신 사용됨.
Bouncy Castle 제공자를 요청하는 getInstance() 호출은 NoSuchAlgorithmException 오류를 생성함.
이 오류를 해결하려면 getInstance()에서 제공자를 지정하지 말아야 함.(즉, 기본 구현 요청).
Build.serial에 대한 직접 액세스 제거Build.serial 식별자가 필요한 앱은 이제 READ_PHONE_STATE 권한을 요청한 다음 Android 9에 추가된 새 Build.getSerial() 메서드를 사용해야 함.
WebView 데이터 디렉토리의 공유 불가앱이 더 이상 여러 프로세스에서 단일 WebView 데이터 디렉토리를 공유할 수 없음.
앱에 android.webkit 패키지의 WebView, CookieManager 또는 기타 API를 사용하는 프로세스가 2개 이상 있는 경우, 두 번째 프로세스에서 WebView 메서드를 호출하면 앱이 중단됨.
앱의 데이터 디렉토리에 대한 액세스가 SELinux에 의해 차단됨시스템은 각 앱의 비공개 데이터 디렉토리에 대한 앱별 SELinux 제한과 함께 앱별 SELinux 샌드박스를 적용.
이제 경로를 통해 다른 앱의 데이터 디렉토리에 직접 액세스하는 것은 허용되지 않음. 
앱이 FD 전달을 포함한 IPC 메커니즘을 사용하여 데이터를 계속 공유할 수도 있음.


+ Recent posts