Android P Behavior Changes

in kr •  7 years ago  (edited)

Android P Behavior Changes

원문 : https://developer.android.com/preview/behavior-changes.html

안드로이드 버전이 올라가면 여러가지 시스템 및 API 동작 변경 사항이 발생합니다. 이러한 변경사항은 크게 모든 API레벨을 대상으로 하는 앱과 P를 타겟으로 하는 앱 두 가지로 구분 할 수 있습니다.

Android P 에서 구동되는 모든 앱

앱의 타겟팅 API레벨과 무관하게 이 변경 사항은 Android P 플랫폼에서 구동되는 모든 어플리케이션에 영향을 미칩니다.

Input and data privacy in background apps

백그라운드 앱의 사용자 입력, 센서 데이터 접근 기능을 제한하여 개인 정보를 강화하였습니다. Android P 단말의 백그라운드에서 실행 중인 앱은 다음의 제약사항이 적용됩니다.

  • 마이크 및 카메라에 접근 할 수 없습니다.
  • Accelerometer와 Gyroscope와 같이 continuous reporting mode를 사용하는 센서는 이벤트를 수신하지 못합니다.
  • on-change, one-shot 모드를 사용하는 센서는 이벤트를 수신하지 못합니다.

이벤트를 수신하려면 foreground service를 사용하여야 합니다.

SensorManagerflush()를 호출하는 앱은 이 변경사항에 영향을 받지 않습니다.

Device security change

여기에 상세 내용이 있습니다.

  • New API key rotation
    • Android P는 APK Signature Scheme v3를 추가하였습니다. 이 Schme은 각 인증 서명서의 인증 블록에 proof-of-rotaion 옵션을 가지고 있습니다.
    • 키를 잃어버리거나, 모든 개발자가 동일한 키로 개발하고 배포하거나 하는 경우 유용함
    • (v3 관련 문서가 나오면 좀더 자세히 확인 필요)
  • TLS implementation changes
    • SSLSocket이 create중 접속에 실패하는 경우 NPE대신 IOException이 발생합니다.
    • SSLEngine 클래스는 close_notify 경고를 깔끔하게 처리 합니다.
  • Stricter Seccomp(secure computing mode) filter
  • Support for ChaCha20 stream cipher
    • RFC 7539의 ChaCha20 암호를 지원합니다.
  • Legacy encryption support
    • Keymaster 4와 함께 제공되는 Android P 단말은 Triple Data Algorithm 또는 Triple DES를 지원합니다. 앱이 Triple DES를 요구하는 legacy system과 상호 운용되는 경우 이 암호 유형을 사용하세요.

Cryptographic changes

Conscrypt(구글에서 만든 암호화 라이브러리) 의 알고리즘 파라메터의 구현을 추가 제공합니다. : AES, DESEDE, OAEP, EC

Bouncy Castle 버전은 deprecated 되었습니다.

targetsdk 가 27이하인 경우 deprecated된 알고리즘을 사용하는 경우 경고가 발생합니다. targetsdk가 P인 경우 NoSuchAlgorithmException이 발생합니다..

Other changes

  • PBE keys를 사용할때 Bouncy Castle에서 초기화 벡터(IV)가 필요하고, 앱이 제공하지 않으면 경고가 발생합니다.
  • ARC4 암호를 Conscrypt로 구현하면 ARC4/ECB/NoPadding or ARC4/NONE/NoPadding 을 지정할 수 있습니다.
  • The Crypto Java Cryptography Architecture(JCA) provider가 삭제 되었습니다. SecureRandom.getInstance("SHA1PRNH", "Crypto")를 호출하면 NoSuchProviderException이 발생합니다.
  • RSA keys를 키 구조보다 더 큰 버퍼에서 파싱하는경우 더 이상 예외가 발생하지 않습니다.(발생했었나보지..?)

App compatibility changes

앱의 안정성과 호환성을 보장하기 위해 non-SDK 메서드와 필드의 접근이 제한됩니다. 이 제한은 직접 접근, 리플렉션을 통한 접근, JNI를 통한 접근과 관계없이 적용 됩니다. preview1 버전에서는 접근이 가능하나 토스트와 로그가 표시됩니다. 앱에서 이러한 토스트나 로그를 보는 경우 제한된 인터페이스를 사용하지 않고 구현하는 것이 중요합니다. 적절한 대안이 없는 경우 경우 버그 리포트를 통해 제한 사항 재검토를 요청할 수 있습니다.

더 상세한 내용은 Restrictions on non-SDK interfaces에 있습니다. (이것도 나중에 보자… 길다..)

Updates to the ICU libraries

ICU 라이브러리가 ICU 58(Android 8.0, 8.1)에서 ICU 60으로 업데이트 되었습니다. (ICU라이브러리는 Android 7.0에서 추가됨-링크)

  • 플랫폼에서 타임존을 다루는 방식이 변경되었습니다.
    • 플랫폼은 GTM 과 UTC를 보다 더 잘 처리합니다. UTC는 GMT와 동일한 의미가 아닙니다.
      • UTC : 협정 세계시, GMT : 그리니치 평균시
      • 초의 소숫점 단위에서 차이가 있음
      • ICU는 GMT와 UTC간의 변환을 제공합니다.
    • java.text.SimpleDataFormat는 ICU를 사용하여 UTC, GMT 표현을 지원합니다.
      • "zzzz" 포멧팅은 모든 언어에 대하여 긴 지역화된 스트링을 생성합니다. 이전 버전에서는 "UTC", "GMT+00:00" 문자열이 생성되었습니다.(테스트해보려 하였으나, Android Studio 3.2 canary 버전이 정상동작하지 않는다....)
      • "zzzz" 는 "Universal Coordinated Time", "Greenwich Mean Time" 의 긴 문자열을 파싱할 수 있습니다.
      • 모든 언어에 대해서 "zzzz"가 "UTC", "GMT+00:00" 의 문자열을 생성한다고 가정하는 앱은 호환성 문제가 발생할 수 있습니다.
    • java.text.DateFormatSymbols.getZoneString()의 동작이 변경되었습니다.
      • SimpleDateFormat과 동일하게 긴 지역화된 스트링을 사용합니다.
      • 몇몇 zone ID는 다른 zone의 동의어로 올바르게 인식됩니다. (Eire와 같은 구식의 zone ID)
    • Aisa/Hanoi는 더 이상 zone으로 인식되지 않습니다. java.util.TimeZones.getAvailableIds()는 이 값을 반환하지 않습니다. 그리고 java.util.TimeZone.getTimeZone()도 이 값을 인식하지 않습니다. 이것은 android.icu의 이전 동작과 동일합니다.
  • android.icu.text.NumberFormat.getInstance(ULocale, PLURALCURRENCYSTYLE).parse(String) 메서드는 적절한 currency text를 파싱할때도 ParseException을 던집니다. 이 문제를 피하려면 PLURALCURRENCYSTYLE의 currency 텍스트를 파싱할때는 Android 7.0부터 사용 가능한 NumberFormat.parseCurrency를 사용하십시오.

Android secure encrypted files are no longer supported

  • Android secure encrypted file(ASECs)는 original apps-on-SD-card기능을 위해 Android 2.2에서 소개되었습니다. Android 6.0에서 "adoptable SD card" 기능이 추가되었고 ASECs는 deprecated되었습니다.
  • Android 8.0 (API level 26)에서 새 앱을 ASECs에 설치하는 기능을 차단했습니다. preview 버전에서 ASEC기능을 완전히 제거합니다.

Test suite build changes

TestSuiteBuild 클래스는 deprecated되었고, addRequirements() 메서드는 제거되었습니다.

Testing libraries removed from framework

ActivityInstrumentationTestCase2와 같은 클래스는 테스트를 편리하게 할 수 있게 하지만 android.jar가 제공하는 JUnit 버전으로 테스트 해야 하므로 다른 버전의 JUnit에 의존하는 종속성을 빌드하고 테스트하기 어렵습니다.

좀더 유연성을 주기위해 프레임워크에서 테스트 클래스들을 제거하였습니다. Legacy testing libraries의 방법으로 예전 방식의 테스트 클래스는 사용 가능 합니다.

안드로이드 앱을 어떻게 테스트하는지 더 알아보려면 Testing Apps on Android를 참고하세요.

Java UTF decoder

UTF8은 Android의 기본 charset 입니다. UTF8 byte stream은 String(byte[] bytes)와 같은 생성자에 의해 디코드 될 수 있습니다. Android P에서 UTF-8 디코더는 더 엄격해졌습니다. 이것은 Unicode 표준을 따릅니다.

  • <C0, AF>와 같은 non-shorted UTF-8은 부적합한 것으로 처리됩니다.
  • U+D800..U+DFFF와 같은 surrogate UTF-8은 부적합한 것으로 처리됩니다.
  • The maximal subpart is replaced by a single 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를 모르니 해석이 안된다..~~~)
  • Android P 에서 수정 된 UTF-8/CESU-8 sequence를 디코딩 하려면 DAtaInputStream.readUTF() 메서드 또는 NewStringUTF() JNI메서드를 사용하세요.

Hostname verification using a certificate

RFC2818은 도메인 이름과, 인증서를 비교하는 두가지 방법을 설명합니다. - subjectAltName(SAN)과 commonName(CN)

CN fallback이 deprecated되어 안드로이드에서도 CN fallback을 더 이상 지원하지 않습니다. hostname 검증을 위해 서버는 SAN과 매칭되는 인증서를 준비해야 합니다.

Network address lookups can cause network violations

IP주소를 확인하는 작업은 네트워크 I/O를 발생시키므로 blocking operations으로 간주됩니다. 메인 쓰레드에서 blocking operation을 실행하는 경우 중지될 수 있습니다. 숫자 기반의 IP를 사용하는 경우에는 blocking operation으로 간주되지 않습니다.

StrictMode를 통해 위 제약사항을 테스트 할 수 있습니다. - NetworkOnMainThreadException, detectNetwork(), detectAll()

Socket tagging

Android P 미만 버전에서 setThreadStatsTag() 메서드를 사용하여 소켓에 태그를 지정하면 ParcelFileDescriptor container와 함께 binder IPC를 사용하는 다른 프로세스로 전송될 때 소켓에 태크가 지정되지 않습니다.

Android P에서는 소켓 태그는 binder IPC를 사용하여 다른 프로세스로 전송 될 때 유지 됩니다. 이 변경은 네트워크 트래픽 통계에 영향을 미칠 수 있습니다. 예를 들면 queryDetailForUidTag() 메서드를 사용할때... 소켓을 다른 프로세스에 보내기 전에 unTagSocket()을 호출하여 이전과 동일하게 동작하게 할 수 있습니다.

Reported amount of available bytes in socket

available() 메서드는 shutdownInput() 메서드를 호출한 후에 호출되면 0을 반환합니다.

More detailed network capabilities reporting for VPNs

P 이전 플랫폼 버전에서 NetworkCapavilities 클래스는 NET_CAPABILITY_NOT_VPN은 제외된 TRANSPORT_VPN과 같은 제한된 정보를 전달했습니다. 이러한 상황 때문에 개발자는 VPN을 사용하면 요금이 부과 될 수 있는지 판단하기 어려웠습니다. 예를 들면 NET_CAPABILITY_NOT_METERED를 체크해도 기본 네트워크가 측정이 되는지 확신할 수 없었습니다.

P 부터 VPN의 setUnderlyingNetworks() 메서드를 호출하면 Android System은 모든 기본 네트워크의 transports와 capabilities를 머지하여 VPN network 의 효율적인 네트워크 capabilities로 결과를 리턴합니다.

Files in xt_qtaguid folder are no longer available to apps

/proc/net/xt_qtaguid 폴더에 있는 파일에 대한 직접 접근은 더이상 허용되지 않습니다. 이러한 파일이 없는 몇몇 Android P 단말과의 일관성을 보장하기 위함 입니다.

이 파일과 관련이 있는 TrafficStats, NetworkStatsManager의 public API는 여전히 잘 동작합니다. 그러나 qtaguid_tagSocket()과 같은 cutils 메서드는 동작하지 않을 수 있습니다.

FLAG_ACTIVITY_NEW_TASK requirement is now enforced

non-activity context에서 Activity를 실행하는 경우 FLAG_ACTIVITY_NEW_TASK flag는 강제됩니다. 해당 플래그 없이 실행하는 경우 activity는 실행되지 않습니다. 그리고 시스템은 로그를 남깁니다.

위 동작은 이전에도 의도된 동작이었으나, Android N에서는 버그로 동작하지 않았습니다.

Apps targeting Android P

Foreground Service

Foreground service를 사용하는 앱은 FOREGROUND_SERVICE 퍼미션이 있어야 합니다. 이 퍼미션은 노말 퍼미션으로 시스템은 자동적으로 권한을 부여합니다.

만약 FOREGROUND_SERVICE권한 없이 foreground service를 생성하는 경우 SecurityException이 발생합니다.

()

Device serial access restrictions

Build.SERIAL 필드는 Android 8.0(API 26)에서 deprecate되었습니다. P 에서 Build.SERIAL은 항상 UNKNOWN으로 설정 됩니다. 이 변경은 사용자의 프라이버시를 보호합니다. 만약 앱이 디바이스의 하드웨어 시리얼 넘버에 접근할 필요가 있는 경우 READ_PHONE_STATE 퍼미션을 획득하고 getSerial() 함수를 호출해야 합니다.

Framework security changes

P 이상의 타겟팅 버전에서 시스템은 더 엄격한 Network와 File System 보안을 시행합니다. 더 상세한 내용은 Security Behavior Changes를 확인하세요.

  • Network TLS enabled by default
    • isCleartextTrafficPermitted() 의 default 값이 false를 리턴
  • Web-based data directories separated by process
    • 하나의 앱에서 여러 프로세스를 실행하는 경우 Webview data 디렉토리, 쿠키, HTTP caches 등이 별도로 저장되고 관리됩니다.
  • Per-app SELinux domains
    • world-accessible Unix permissions를 통해 다른 앱과 파일 공유를 할 수 없습니다.
    • 파일을 공유하려면 content provider 또는 external storage를 사용해야 합니다.

View focus

높이나 너비가 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 scrolling element

기존에는 document.body가 scroll value 0이었으나 Android P부터는 스크롤 요소를 루트 요소로 변경하였습니다. 따라서 viewport의 스크롤 값에 접근하려면 document.scrollingElement를 사용하세요.

Screen rotation changes

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 OrientationBehavior
unspecified, user세로 또는 가로 모드로 렌더링 할 수 있습니다. 세로와 가로 모드의 레이아웃을 지원해야 합니다.
userLandscape가로 또는 reverse 가로 모드로 렌더링 할 수 있습니다. 가로 모드의 레이아웃을 지원해야 합니다.
userPortrait세로 reverse 세로 모드로 렌더링 할 수 있습니다. 세로 모드 레이아웃을 지원해야 합니다.
fullUser세로 또는 가로 모드로 렌더링 할 수 있습니다. 세로와 가로 모드의 레이아웃을 지원해야 합니다. 회전 잠금 사용자에게는 reverse 세로 모드로 잠금 수 있는 옵션이 제공 됩니다.
sensor, fullSensor, sensorPortrait, sensorLandscape회전 잠금 모드는 무시 됩니다. 자동 회전 모드가 활성화 된 것처럼 동작 합니다. UX 적인 매우 이례적인 경우에만 이 옵션의 사용을 사용하세요.
Authors get paid when people like you upvote their post.
If you enjoyed what you read here, create your account today and start earning FREE STEEM!
Sort Order:  

P 는 뭐의 약자일까요?

Popsicle, Pancake, Parfait, Pound Cake, Pumpkin Pie 등 여러가지 "썰"이 있으나 아직 정해지지 않은것 같습니다~~