원문 : https://developer.android.com/preview/behavior-changes.html
안드로이드 버전이 올라가면 여러가지 시스템 및 API 동작 변경 사항이 발생합니다. 이러한 변경사항은 크게 모든 API레벨을 대상으로 하는 앱과 P를 타겟으로 하는 앱 두 가지로 구분 할 수 있습니다.
앱의 타겟팅 API레벨과 무관하게 이 변경 사항은 Android P 플랫폼에서 구동되는 모든 어플리케이션에 영향을 미칩니다.
백그라운드 앱의 사용자 입력, 센서 데이터 접근 기능을 제한하여 개인 정보를 강화하였습니다. Android P 단말의 백그라운드에서 실행 중인 앱은 다음의 제약사항이 적용됩니다.
이벤트를 수신하려면 foreground service를 사용하여야 합니다.
SensorManager의 flush()를 호출하는 앱은 이 변경사항에 영향을 받지 않습니다.
여기에 상세 내용이 있습니다.
Conscrypt(구글에서 만든 암호화 라이브러리) 의 알고리즘 파라메터의 구현을 추가 제공합니다. : AES, DESEDE, OAEP, EC
Bouncy Castle 버전은 deprecated 되었습니다.
targetsdk 가 27이하인 경우 deprecated된 알고리즘을 사용하는 경우 경고가 발생합니다. targetsdk가 P인 경우 NoSuchAlgorithmException이 발생합니다..
앱의 안정성과 호환성을 보장하기 위해 non-SDK 메서드와 필드의 접근이 제한됩니다. 이 제한은 직접 접근, 리플렉션을 통한 접근, JNI를 통한 접근과 관계없이 적용 됩니다. preview1 버전에서는 접근이 가능하나 토스트와 로그가 표시됩니다. 앱에서 이러한 토스트나 로그를 보는 경우 제한된 인터페이스를 사용하지 않고 구현하는 것이 중요합니다. 적절한 대안이 없는 경우 경우 버그 리포트를 통해 제한 사항 재검토를 요청할 수 있습니다.
더 상세한 내용은 Restrictions on non-SDK interfaces에 있습니다. (이것도 나중에 보자… 길다..)
ICU 라이브러리가 ICU 58(Android 8.0, 8.1)에서 ICU 60으로 업데이트 되었습니다. (ICU라이브러리는 Android 7.0에서 추가됨-링크)
TestSuiteBuild 클래스는 deprecated되었고, addRequirements() 메서드는 제거되었습니다.
ActivityInstrumentationTestCase2와 같은 클래스는 테스트를 편리하게 할 수 있게 하지만 android.jar가 제공하는 JUnit 버전으로 테스트 해야 하므로 다른 버전의 JUnit에 의존하는 종속성을 빌드하고 테스트하기 어렵습니다.
좀더 유연성을 주기위해 프레임워크에서 테스트 클래스들을 제거하였습니다. Legacy testing libraries의 방법으로 예전 방식의 테스트 클래스는 사용 가능 합니다.
안드로이드 앱을 어떻게 테스트하는지 더 알아보려면 Testing Apps on Android를 참고하세요.
UTF8은 Android의 기본 charset 입니다. UTF8 byte stream은 String(byte[] bytes)와 같은 생성자에 의해 디코드 될 수 있습니다. Android P에서 UTF-8 디코더는 더 엄격해졌습니다. 이것은 Unicode 표준을 따릅니다.
U+FFFD. For example, in the byte sequence "41 C0 AF 41 F4 80 80 41," the maximal subparts are "C0," "AF," and "F4 80 80." "F4 80 80" can be the initial subsequence of "F4 80 80 80", but "C0" can't be the initial subsequence of any well-formed code unit sequence. Thus, the output should be "A\ufffd\ufffdA\ufffdA."(~~maximal subpart를 모르니 해석이 안된다..~~~)RFC2818은 도메인 이름과, 인증서를 비교하는 두가지 방법을 설명합니다. - subjectAltName(SAN)과 commonName(CN)
CN fallback이 deprecated되어 안드로이드에서도 CN fallback을 더 이상 지원하지 않습니다. hostname 검증을 위해 서버는 SAN과 매칭되는 인증서를 준비해야 합니다.
IP주소를 확인하는 작업은 네트워크 I/O를 발생시키므로 blocking operations으로 간주됩니다. 메인 쓰레드에서 blocking operation을 실행하는 경우 중지될 수 있습니다. 숫자 기반의 IP를 사용하는 경우에는 blocking operation으로 간주되지 않습니다.
StrictMode를 통해 위 제약사항을 테스트 할 수 있습니다. - NetworkOnMainThreadException, detectNetwork(), detectAll()
Android P 미만 버전에서 setThreadStatsTag() 메서드를 사용하여 소켓에 태그를 지정하면 ParcelFileDescriptor container와 함께 binder IPC를 사용하는 다른 프로세스로 전송될 때 소켓에 태크가 지정되지 않습니다.
Android P에서는 소켓 태그는 binder IPC를 사용하여 다른 프로세스로 전송 될 때 유지 됩니다. 이 변경은 네트워크 트래픽 통계에 영향을 미칠 수 있습니다. 예를 들면 queryDetailForUidTag() 메서드를 사용할때... 소켓을 다른 프로세스에 보내기 전에 unTagSocket()을 호출하여 이전과 동일하게 동작하게 할 수 있습니다.
available() 메서드는 shutdownInput() 메서드를 호출한 후에 호출되면 0을 반환합니다.
P 이전 플랫폼 버전에서 NetworkCapavilities 클래스는 NET_CAPABILITY_NOT_VPN은 제외된 TRANSPORT_VPN과 같은 제한된 정보를 전달했습니다. 이러한 상황 때문에 개발자는 VPN을 사용하면 요금이 부과 될 수 있는지 판단하기 어려웠습니다. 예를 들면 NET_CAPABILITY_NOT_METERED를 체크해도 기본 네트워크가 측정이 되는지 확신할 수 없었습니다.
P 부터 VPN의 setUnderlyingNetworks() 메서드를 호출하면 Android System은 모든 기본 네트워크의 transports와 capabilities를 머지하여 VPN network 의 효율적인 네트워크 capabilities로 결과를 리턴합니다.
/proc/net/xt_qtaguid 폴더에 있는 파일에 대한 직접 접근은 더이상 허용되지 않습니다. 이러한 파일이 없는 몇몇 Android P 단말과의 일관성을 보장하기 위함 입니다.
이 파일과 관련이 있는 TrafficStats, NetworkStatsManager의 public API는 여전히 잘 동작합니다. 그러나 qtaguid_tagSocket()과 같은 cutils 메서드는 동작하지 않을 수 있습니다.
non-activity context에서 Activity를 실행하는 경우 FLAG_ACTIVITY_NEW_TASK flag는 강제됩니다. 해당 플래그 없이 실행하는 경우 activity는 실행되지 않습니다. 그리고 시스템은 로그를 남깁니다.
위 동작은 이전에도 의도된 동작이었으나, Android N에서는 버그로 동작하지 않았습니다.
Foreground service를 사용하는 앱은 FOREGROUND_SERVICE 퍼미션이 있어야 합니다. 이 퍼미션은 노말 퍼미션으로 시스템은 자동적으로 권한을 부여합니다.
만약 FOREGROUND_SERVICE권한 없이 foreground service를 생성하는 경우 SecurityException이 발생합니다.
()
Build.SERIAL 필드는 Android 8.0(API 26)에서 deprecate되었습니다. P 에서 Build.SERIAL은 항상 UNKNOWN으로 설정 됩니다. 이 변경은 사용자의 프라이버시를 보호합니다. 만약 앱이 디바이스의 하드웨어 시리얼 넘버에 접근할 필요가 있는 경우 READ_PHONE_STATE 퍼미션을 획득하고 getSerial() 함수를 호출해야 합니다.
P 이상의 타겟팅 버전에서 시스템은 더 엄격한 Network와 File System 보안을 시행합니다. 더 상세한 내용은 Security Behavior Changes를 확인하세요.
높이나 너비가 0인 view는 더이상 포커스를 가질 수 없습니다.
또한 Activity는 더 이상 터치 모드에서 초기 포커스를 암시적으로 부여하지 않습니다. 필요하다면 명시적으로 포커스를 요청해야 합니다.
Android P 앱은 4 and 8 hex digit CSS 컬러를 다루기 위해 CSS Color Module Level 4를 활성화 할 수 있습니다.
CSS Color Module Level 4는 Chrome release 52부터 지원 됩니다. 기존 안드로이드 어플리케이션은 ARGB에서 32bit hex color를 지원하고 있어 오류가 발생하므로 Webview에서 이 기능을 비활성화 하였습니다.
예를들어 #80ff8080은 현재 웹뷰에서 #ff8080으로 렌더링 됩니다. P이상으로 타겟팅하는 경우 50%투명도의 #ff8080으로 해석됩니다.
기존에는 document.body가 scroll value 0이었으나 Android P부터는 스크롤 요소를 루트 요소로 변경하였습니다. 따라서 viewport의 스크롤 값에 접근하려면 document.scrollingElement를 사용하세요.
Android O 사용자는 디스플레이 설정에서 자동 회전과 세로 회전 모드를 사용할 수 있었습니다. Android P 에서는 세로 회전 모드가 크게 변경되었습니다. 세로 회전 모드는 회전 잠금 모드로 이름이 변경되었습니다. 회전 잠금 모드는 자동 회전 모드가 off되면 활성화 됩니다. 자동 회전 모드의 변경사항은 없습니다.
디바이스가 회전 잠금 모드일때, 사용자는 보이는 Activity를 어느 방향으로든 top으로 고정할 수 있습니다. Activity는 항상 세로로 렌더링 될 것이라고 가정해서는 안됩니다. 만약 최상위 Activity가 자동 회전 모드에서 여러 방향으로 렌더링 될 수 있는 경우, 회전 잠금 모드에서도 동일 한 옵션으로 렌더링이 가능합니다. 몇몇 예외 사항은 activity의 screenOrientation 설정을 따릅니다.
특별한 방향을 요청하는 Activity(예를 들면 screenOrientation=landscape)는 사용자의 lock 설정을 무시하고, Android O와 동일한 방식으로 동작합니다.
Screen Orientation 설정은 Android Manifest 또는 setRequestedOrientation()으로 설정 가능합니다.
회전 잠금 모드는 Activity 회전을 처리할 때 WindowManager가 사용하는 사용자 회전 환경 설정으로 동작합니다. 사용자 회전 설정은 다음 케이스에서 변경 될 수 있습니다.
| Screen Orientation | Behavior |
|---|---|
| unspecified, user | 세로 또는 가로 모드로 렌더링 할 수 있습니다. 세로와 가로 모드의 레이아웃을 지원해야 합니다. |
| userLandscape | 가로 또는 reverse 가로 모드로 렌더링 할 수 있습니다. 가로 모드의 레이아웃을 지원해야 합니다. |
| userPortrait | 세로 reverse 세로 모드로 렌더링 할 수 있습니다. 세로 모드 레이아웃을 지원해야 합니다. |
| fullUser | 세로 또는 가로 모드로 렌더링 할 수 있습니다. 세로와 가로 모드의 레이아웃을 지원해야 합니다. 회전 잠금 사용자에게는 reverse 세로 모드로 잠금 수 있는 옵션이 제공 됩니다. |
| sensor, fullSensor, sensorPortrait, sensorLandscape | 회전 잠금 모드는 무시 됩니다. 자동 회전 모드가 활성화 된 것처럼 동작 합니다. UX 적인 매우 이례적인 경우에만 이 옵션의 사용을 사용하세요. |