[android] POS, target SDK 28 이상의 동작 변경 |
https://developer.android.com/about/versions/pie/android-9.0-changes-28
* Foreground services
-
Android 9 이상을 target 하는 앱들은 반드시 FOREGROUND_SERVICE 권한을 받아야 한다.
이것은 normal permission 으로 system 이 자동으로 grant 해준다.
target 이 android 9 이상을 하는데, 이 권한이 없는 경우 SecurityException 이 발생한다.
* Privacy changes
** Build serial number deprecation
-
Build.SERIAL 값이 항상 UNKNOWN 을 제공한다.
hardware serial number 가 필요한 경우 READ_PHONE_STATE 권한을 취득한 후 getSerial 을 호출해야 한다.
** DNS privacy
-
private DNS API 를 존중해야 한다.
특히 앱은 system resolver 가 DNS-over-TLS 를 하는 경우와 built-in client 가 동일한 hostname 에 대해 encrypted DNS 를 사용하는 경우, 또는 disable 된 경우를 고려해야 한다.
* Framework security changes
** Network TLS enabled by default
-
isCleartextTrafficPermitted 함수는 기본값으로 false 를 return 한다.
만약 앱이 cleartext 를 특정 domain 에 대해 허용해야 한다면, cleartextTrafficPermitted 를 true 로 세팅해주어야 한다.
** Web-based data directories separated by process
-
Android 9 에서는 데이터의 안정성과 통합을 위해 multi process 간에 WebView 가 data directory 를 share 할 수 없게 하였다.
보통 이 directory 들은 cookie, HTTP cache, 그리고 다른 web browsing 하는 데 있어 영구적 또는 임시 데이터를 저장하고 있다.
-
대부분의 경우 android.webkit package 에 있는 클래스들은 한 개의 process 에서만 사용해야 한다.
예를 들어 WebView 를 사용하는 모든 Activity 들을 하나의 process 로 몰아넣어야 한다.
“한 개의 process 만!” 이라는 규칙을 엄격하게 적용하려면 WebView 가 없어야 하는 다른 process 에 disableWebView() 를 호출해주어야 한다.
이를 호출해주면 WebView 가 실수로 다른 process 에서 init 을 하는 것을 막을 수 있다. ( 의존하고 있는 lib 에서 호출하는 것도 )
-
앱이 WebView 를 반드시 한 개 이상의 process 에서 사용해야 한다면, unique data directory suffix 를 각각의 process 에 assign 해주어야 한다. 이는 WebView.setDataDirectorySuffix() 함수를 통하며, WebView 를 사용하기 전에 호출해주어야 한다.
이 함수는 각각의 process 의 web data 를 지정한 곳에 각각 저장한다.
-
setDataDirectorySuffix 를 호출했다고 해도, system 은 cookie 나 다른 web data 를 앱 process 간 공유하지 않는다.
만약 여러 개의 process 가 같은 web data 를 접근해야 한다면, 그것들의 정보를 process 간 스스로 복사해야 한다.
예를 들면 한 process 에서 getCookie 로 값을 얻고, 다른 process 에 setCookie 를 하는 식으로 말이다.
** Per-app SELinux domains
-
world-accessible Unix permission 으로 다른 앱이랑 data 를 공유할 수 없다.
이는 Android Application Sandbox 정책의 무결성을 더해주며, private data 는 오직 그 앱만 접근할 수 있음을 보장해준다.
만약 share 가 필요한 정보가 있다면 content provider 를 사용하자.
* Connectivity changes
** 연결 데이터 카운팅과 멀티패스
-
앱 안에서 system 은 현재 default 가 아닌 network 에 대한 network traffic 을 계산한다.
예를 들어 Wi-Fi 가 켜져 있는 동안의 cell traffic 을 계산한다는 얘기이다.
NetworkStatsManager 를 통해 그 traffic 을 조회해 볼 수 있다.
-
getMultipathPreference 는 이제 앞서 이야기한 network traffic 에 대한 value 를 제공한다.
Android 9 부터는 이 함수는 cell data 에 대해서는 true 를 주지만, 하루 안에 특정 양의 traffic 이 누적이 된다면, false 를 return 하기 시작한다.
Android 9 을 target 하는 앱들은 이 값을 존중해주어야 한다.
-
ConnectivityManager.NetworkCallback 은 이제 VPNs 에 대한 정보를 앱에 제공한다.
이 변화는 앱이 동기/비동기적인 call 을 혼합할 필요 없이, 그리고 제한된 API 를 사용할 필요 없이 connectivity event 를 감지할 수 있게 해준다.
덧붙여 단말이 여러개의 wi-fi 에 접속해 있거나, 여러개의 cell network 에 동시에 붙어 있을 때, 정보의 전송이 예상한대로 작동함을 의미한다.
** Apache HTTP client deprecation
-
안드로이드 6.0 (MOS) 에서 Apache HTTP client 에 대한 지원이 제거되었다.
Android 9 부터는 이 lib 이 bootclasspath 에서 아예 제외되었고, 앱이 기본으로 사용할 수 없게 되었다.
( 돼왕 : BOOTCLASSPATH 는 앱이나 jar 가 로드될 때 추가적으로 클래스를 불러올 수 있는 jar 와 앱의 리스트이다.
보통 안드로이드에는 5개의 BOOTCLASSPATH 가 있다.
core.jar, ext.jar, framework.jar, android.policy.jar, services.jar 이다.
모든 앱이 위의 5개 jar 를 참조한다는 말이고, 추가로 jar 를 사용하는 경우에는 이 파일에 해당 jar 가 추가되어야 한다.)
-
Apache HTTP client 를 계속 사용하기 위해서는 다음을 manifest 에 써 줘야 한다.
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
android:required=false 는 min SDK 가 23 이하일 때 요구된다. 왜냐하면 24 미만에서는 org.apache.http.legacy lib 이 접근 불가능하기 때문이다. (그 단말들은 Apache HTTP class 들이 bootclasspath 에서 접근 가능하다.)
-
runtime Apache lib 을 사용하는 대안으로, 앱은 org.apache.http lib 의 자체 버전을 bundle 할 수도 있다.
이것을 한다면 lib 을 repackage 해서, 호환성 이슈가 없도록 해야 한다.
* UI changes
** view focus
-
area 를 갖지 않는 view 들은 더 이상 focus 를 받을 수 없다.
activity 는 touch-mode 의 initial focus 를 암시적으로 지정할 수 없게 되었다.
대신 필요한 경우 최초 focus 를 명시적으로 지정해주어야 한다.
** CSS RGBA hex value handling
-
4, 8 hex digit css 색상을 다루기 위해서 CSS color module level 4 동작을 enable 해주어야 한다.
이는 Chrome release 52 부터 지원되었다.
그러나 WebView 는 현재 이 기능을 disable 시켰다. 왜냐하면 존재하는 안드로이드 앱들이 32bit hex color 를 android ordering 으로 사용하고 있었기 때문이다. (ARGB order) 이는 rendering 에러로 이어진다.
예를 들어 target 이 27 이하인 경우 #80ff8080 은 현재 WebView 에서는 불투명한 옅은 빨간색 (#ff8080)을 그린다. (Android 에서는 alpha component 가 무시된다.).
만약 앱 target 이 28 이상인 경우 #80ff8080 은 50% 투명도를 가진 옅은 초록색 (#80ff80) 을 나타낸다.
** MIME type sniffing for file: URIs
-
Android 9 이전 버전에서 MIME type 을 file contents 로부터 추론할 수 있었다.
Android 9 에서는 WebView 에서 file: URI 를 사용하여 반드시 정확한 파일 확장자를 사용해야 한다.
파일 컨텐츠가 MIME type 을 추론하는 것은 보안 버그이며, 이는 보통 최근의 브라우저들이 다 불허하고 있다.
-
만약 파일이 .html, .txt, .js, .css 의 파일 확장자를 가지고 있다면 MIME type 은 확장자로 인식될 수 있다.
만약 extension 이 없는 녀석이거나 인식할 수 없는 녀석이라면, MIME type 은 plain text 가 된다.
예를 들어 file:///sdcard/test.html 은 HTML 로 렌더링 되지만, file:///sdcard/text 는 plain text 로 render 된다. 이 녀석이 HTML data 여도 말이다.
** Document scrolling element
-
document root element 가 scroll 하는 element 인 경우를 잘 다룬다.
이전 버전에서는 scroll position 이 body element 에 의해 지정되었고, root element 는 zero scroll 값을 가졌다.
android 9 은 root element 가 scrolling element 일 때 일반적으로 받아들여지는 동작을 한다.
게다가 document.body.scrollTop,document.body.scrollLeft, document.documentElement.scrollTop, document.documentElement.scrollLeft 는 target sdk 에 따라 다르게 동작한다.
viewport scroll value 를 접근하려면 가능하다면, document.scrollingElement 를 사용하라.
** Notifications from suspended apps
-
Android 9 이전에는 suspend 된 앱의 notification 은 취소되었다.
Android 9 부터는 suspend 된 앱의 notification 은 앱이 resume 될때까지 hidden 된다.
( 돼왕 : Suspended apps )
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] Pie (POS) 에서의 text (0) | 2019.07.25 |
---|---|
[android] Android P 부터는 기본으로 TLS (0) | 2019.07.24 |
[Android] 8.1 Feature and APIs (API Level 27) (0) | 2019.07.22 |
[android] Adoptable Storage (0) | 2019.07.09 |
[android] File-Based Encryption & Direct Boot mode (0) | 2019.07.08 |
댓글