본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[android] POS, target SDK 28 이상의 동작 변경

by 돼지왕 왕돼지 2019. 7. 23.
반응형

[android] POS, target SDK 28 이상의 동작 변경


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


android p changes, android pie changes, android:required, apache http client deprecation, api level 28, api level 28 changes, bootclasspath, build serial number deprecation, connectivity changes, css rgba hex value handling, disableWebView, dns privacy, DNS-over-TLS, document scrolling element, file extension, foreground service, FOREGROUND_SERVICE, framework security change, getMultipathPreference, getserial, isCleartextTrafficPermitted, mime type inferrence, mime type sniffing for file, mime type 추론, multi process web data share, network tls enabled by default, networkcallback, NetworkStatsManager, org.apache.http lib, org.apache.http.legacy, p changes, per-app selinux domains, Plain Text, pos changes, privacy changes, private dns api, Repackage, runtime apache lib, setDataDirectorySuffix, suspended app, system resolver, target SDK 28 이상의 동작 변경, targetsdk 28, targetsdk 28 changes, ui changes, UNKNOWN, uris, uses-library, view focus, web data copy, web-based data directories separated by process, world accessible unix permission, [android] POS, 멀티패스, 연결 데이터 카운팅


* 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 )




반응형

댓글