[Android] 8.1 Feature and APIs (API Level 27) |
https://developer.android.com/about/versions/oreo/android-8.1
* Android Oreo ( Go Edition )
-
Android GO 는 온라인을 접하기 시작하는 사람들을 위한 안드로이드 경험을 최적화한 첫 시도이다.
안드로이드 8.1 부터, 우리는 안드로이드를 진입 장벽이 적은 우수한 플랫폼으로 만들기로 했다.
GO edition 에는 다음과 같은 설정이 들어간다.
1. 메모리 최적화 : 1GB 이하의 단말에서도 앱이 잘 돌아가도록 메모리 사용에 대한 개선이 있었다.
2. 유기적인 타겟 옵션 : 구글 플레이를 통해 low-RAM 단말을 target 할 수도 있는 새로운 하드웨어 지정 설정이 추가되었다.
3. Google play : 개발자에 의해 특별히 최적화된 앱에 대해 구글 플레이가 노출을 해준다.
“Building for billions” 라는 가이드라인이 있고, 이를 통해 Android GO 에서 돌 수 있게 최적화된 앱을 어떻게 만드는지 알려준다.
대부분의 개발자들은, 지금 있는 APK 를 최적화하거나, 구글 플레이의 Multiple APK 기능을 통해 low-RAM device 를 지원할 수 있다.
* Neural Networks API
-
Neural Networks API 는 TensorFlow Lite 와 같은 단말에서의 ML flatform 사용을 가능하게 해준다.
* Autofill framework updates
-
Android 8.1 부터는 Autofill framework 에 대한 개선사항을 볼 수 있다.
BaseAdapter class 가 이제 setAutofillOptions 함수를 포함하게 되어, adapter 안에서의 값을 제공할 수 있게 되었다.
spinner 와 같은 녀석을 control 할 때 동적으로 값을 generate 할 수 있게 되어 좋다.
예를 들어 setAutofillOptions 함수를 써서 연도를 표시하고자 할 때, 유저는 신용카드 만료 날짜의 일부를 선택할 수 있다.
Autofill service 는 string 의 형태로 값을 제공한다.
-
AutofillManager class 가 notifyViewVisibilityChanged 함수를 포함하게 되었다.
이는 framework 에 virtual structure 안의 view 의 visibility 가 변경되었을 때 framework 에 notify 해주기 위함이다.
non virtual structure 를 위한 overload 함수들도 있다.
하지만 non virtual structure 는 보통 framework 에 notify 해줄 필요가 없다. 왜냐면 이는 View class 에서 자동으로 해주기 떄문이다.
-
Android 8.1 에서 Autofill service 는 CustomDescription, Validator, 그리고 SaveInfo 를 통해 UI affordance 를 향상시켰다.
Custom decsription 은 autofill service 가 무엇을 저장하는지를 알려주는데 유용하다. 예를 들어 화면에 신용카드 정보가 있다면, 이것은 신용 카드 은행의 로고를 표시해줄 수도 있고, 신용카드의 마지막 4개 번호를 표시해줄 수도 있고, 만료일을 표시해줄 수도 있다.
Validator 는 validate 실패 시 autofill save UI 를 보여주는 것을 막는데 사용데 사용된다.
* Notifications
-
앱은 이제 1초에 한번만 noti alarm sound 를 만들 수 있다.
이 이상의 alert sound 는 무시된다,
다른 noti 동작에는 영향을 미치지 않고 소리에만 영향을 미친다. 즉 noti 가 등록은 된다.
-
NotificationListenerService 와 ConditionProviderService 가 low-RAM Android 단말에서 지원되지 않는다.
ActivityManager.isLowRamDevice() 가 true 를 return 하게 되는 것과 호환된다.
* EditText update
-
API Level 27 부터, EditText.getText 함수는 Editable 을 return 한다. 기존에는 CharSequence 로 return 되었다.
이는 하위호환성이 지켜지는데, Editable 이 CharSequence 를 구현하기 때문이다.
Editable interface 는 추가적인 기능을 제공한다.
예를 들면 Editable 은 Spannable 을 구현했기 떄문에, EditText instance 안에서 markup 을 추가할 수도 있다.
* Programmatic Safe Browsing actions
-
Safe Browsing API 를 사용하는 WebView를 구현하면, 앱에서는 WebView 가 Google 이 위험요소로 지정한 URL 로 이동하려고 하는지 detect 할 수 있다.
기본적으로 WebView 는 유저에게 그 위험요소가 무엇인지 webview 전체를 덮는 형태로 알려준다.
이 화면은 user 에게 계속 URL 을 load 할 것인지 아니면 이전 화면으로 돌아갈 지 선택을 할 수 있게 한다.
-
Android 8.1 에서 프로그램으로 알려진 위협에 대해 어떻게 응답할 지 설정할 수 있다.
앱이 Safe Browsing 에게 알려진 위협을 report 할지 결정할 수 있다.
알려진 위험요소에 마딱뜨렸을 때, 특정 액션을 자동으로 수행하게 할 수 있다. 예를 들면 안전을 위해 선택지 없이 무조건 going back 한다던지..
-
알려진 위협으로부터의 최적의 방어를 제공하기 위해서는 WebView 의 loadUrl 함수를 Safe Browsing 의 init 이 끝나기 전까지 호출하지 않는 것이다.
-
다음 코드는 항상 알려진 위협에 마딱뜨렸을 때 항상 go back 으로 동작하게 하기 위한 것이다.
manifest
<manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:value="true" /> </application> </manifest>
safe browsing initialize
private var superSafeWebView: WebView? = null private var safeBrowsingIsInitialized: Boolean = false // ... override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) superSafeWebView = WebView(this).apply { webViewClient = MyWebViewClient() safeBrowsingIsInitialized = false startSafeBrowsing(this@SafeBrowsingActivity, { success -> safeBrowsingIsInitialized = true if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!") } }) } }
webview client setting
class MyWebViewClient : WebViewClient() { // Automatically go "back to safety" when attempting to load a website that // Safe Browsing has identified as a known threat. An instance of WebView // calls this method only after Safe Browsing is initialized, so there's no // conditional logic needed here. override fun onSafeBrowsingHit( view: WebView, request: WebResourceRequest, threatType: Int, callback: SafeBrowsingResponse ) { // The "true" argument indicates that your app reports incidents like // this one to Safe Browsing. callback.backToSafety(true) Toast.makeText(view.context, "Unsafe web page blocked.", Toast.LENGTH_LONG).show() } }
* Video thumbnail extractor
-
MediaMetadataRetriever 는 getScaledFrameAtTime 이라는 새로운 함수가 추가되었는데, 이는 제공한 time position 에 가까운 frame 을 찾아서 source frame 의 aspect ratio 와 같은 bitmap 을 return 해준다.
이 때 주어진 width, height 의 rectangle 에 맞게 scale 은 해준다.
getFrameAtTime 대신 이 녀석을 쓰는 것을 추천하는데, getFrameAtTime 은 source video 와 같은 해상도로 bitmap 을 return 하기 때문에 메모리 낭비가 심하기 때문이다.
예를 들어 4K video 의 frame 은 16MB bitmap 정도가 나오는데 thumbnail 로는 필요없는 용량이다.
* Shared memory API
-
Android 8.1 에는 SharedMemory 라는 API 가 추가되었다.
이것은 익명의 SharedMemory 객체를 만들고, 매핑하고 관리할 수 있게 해준다.
SharedMemory object 에 메모리 보호를 세팅하고, 읽고 쓸 수 있다.
ShardMemory 는 Parcelable 이기 때문에 이를 AIDL 로 손쉽게 전달할 수 있다.
SharedMemory API 는 NDK 의 ASharedMemory 와 상호동작한다.
ASharedMemory 는 file descriptor 에 대한 접근을 줄 수 있어, fd 를 읽고 쓸 수 있다.
이것은 앱간, single app 의 multi process 간 많은 양의 data 를 공유하는 데 좋은 방법이다.
* WallpaperColors API
-
LIve wallpaper 가 System UI 에 색상 정보를 제공할 수 있게 되었다.
Bitmap, Drawable, 또는 직접 선택한 색상으로부터 WallpaperColors 객체를 만들어 제공하면 된다.
-
WallpaperColors 객체를 만들려면 다음 중 하나를 따르면 된다.
3가지 색을 이용해 만들려면, WallpaperColors 에 primary, secondary, tertiary color 를 전달하여 만들 수 있다. primary color 는 nonnull 이어야 한다.
bitmap 으로부터 만들려면 fromBitmap 을 사용하면 된다.
drawble 로부터 만들려면 fromDrawable 을 사용하면 된다.
-
primary, secondary, tertiary 색상을 얻으려면 getPrimaryColor, getSecondaryColor, getTertiaryColor 를 호출하면 된다.
-
live wallpaper 의 눈에 띄는 색상 변화를 notify 하려면 notifyColorsChanged 를 호출하면 된다.
이 함수는 onComputeColors lifecycle event 를 호출하는데, 여기서 새로운 WallpaperColors 객체를 전달해주면 된다.
-
color change 에 대한 listener 를 등록하려면 addOnColorsChangedListener 를 통해 listener 를 등록하면 된다.
이곳에서 getWallpaperColors 함수를 통해 primary color 를 얻을 수 있다.
* Fingerprint updates
-
FingerprintManager 에 error code 가 추가되었다.
FINGERPRINT_ERROR_LOCKOUT_PERMANENT : 유저가 너무 많이 unlock 하려고 시도했다.
FINGERPRINT_ERROR_VENDOR : vendor 특정 fingerprint reader error 가 발생했다.
* Cryptography updates
-
새로운 알고리즘이 Conscrypt( Java Security Provider ) 에 구현되었다.
AlgorithmParameters:GCM
KeyGenerator:AES
KeyGenerator:DESEDE
KeyGenerator:HMACMD5
KeyGenerator:HMACSHA1
KeyGenerator:HMACSHA224
KeyGenerator:HMACSHA256
KeyGenerator:HMACSHA384
KeyGenerator:HMACSHA512
SecretKeyFactory:DESEDE
Signature:NONEWITHECDSA
-
Cipher.getParameters().getParameterSpec(IvParameterSpec.class) 는 더 이상 GCM 을 사용하는 algorithm 에 대해 기능동작하지 않는다.
대신 getParameterSpec(GCMParameterSpec.class) 를 사용하라.
-
TLS 와 관련된 많은 Conscrypt 내부 클래스들이 리팩토링되었다.
개발자들은 이 녀석들을 reflection 으로 접근하기도 하기 때문에 이런 사용성을 위해 끼움새는 남겨두었고, (interface 는 남겨두았다는 얘기인듯) 상세내용이 변경되었다.
예를 들어 socket 이 OpenSSLSocketImpl 타입이었다면, 이제는 ConscryptFileDescriptorSocket 이나 ConscryptEngineSocket 타입이 되었을 것이며, 이들은 OpenSSLSocketImpl 을 구현하였다.
-
SSLSession method 는 null reference 가 전달되었을 때 IllegalArgumentException 을 던졌었는데, 이제는 NullPointerException 을 던진다.
-
RSA KeyFactor 는 더 이상 encoded key 보다 큰 byte array 로부터 key 를 생성하는 것을 허용하지 않는다.
key 구조가 buffer 전체를 채우지 못하는 KeySpec 이 제공되는 generatePrivate 와 generatePublic 를 호출하면, InvalidKeySpecException 을 발생시킨다.
-
socket read 가 closed 에 의해 interrupt 되면, Conscrypt 는 read 에 대해 -1 를 return 했었는데, read 는 이제 SocketException 을 발생시킨다.
-
root CA 인증서 set 이 변경되었다. 대부분 만료된 인증서가 제거되었고, WoSign 과 StartCom root CA 인증서가 제거되었다.
'프로그래밍 놀이터 > 안드로이드, Java' 카테고리의 다른 글
[android] Android P 부터는 기본으로 TLS (0) | 2019.07.24 |
---|---|
[android] POS, target SDK 28 이상의 동작 변경 (0) | 2019.07.23 |
[android] Adoptable Storage (0) | 2019.07.09 |
[android] File-Based Encryption & Direct Boot mode (0) | 2019.07.08 |
[RxJava] #8 테스팅과 Flowable (0) | 2019.06.12 |
댓글