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

[Android] 8.1 Feature and APIs (API Level 27)

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

[Android] 8.1 Feature and APIs (API Level 27)


https://developer.android.com/about/versions/oreo/android-8.1

addOnColorsChangedListener, Android 8.1, android 8.1 changes, Android Go, android go edition, android low ram, android memory, android memory optimization, Android Oreo, api level 27 changes, ASharedMemory, autofill framework, charsequence, Cipher, ConditionProviderService, Conscrypt, ConscryptEngineSocket, ConscryptFileDescriptorSocket, cryptography, customdescription, editable, edittext gettext, edittext update, fingerprint updates, FingerprintManager, FINGERPRINT_ERROR_LOCKOUT_PERMANENT, FINGERPRINT_ERROR_VENDOR, generatePrivate, generatePublic, getFrameAtTime, getScaledFrameAtTime, InvalidKeySpecException, isLowRamDevice, live wallpaper, low-ram 단말, MediaMetadataRetriever, ml platform, neural networks api, noti alarm sound, notification, NotificationListenerService, notifyColorsChanged, notifyViewVisibilityChanged, onComputeColors, OpenSSLSocketImpl, root ca set, Safe Browsing, safe browsing init before loadurl, saveinfo, setautofilloptions, shared memory api, sharedmemory, sharedmemory aidl, SocketException, spinner, SSLSession, startcom, targetsdk 27, targetsdk 27 changes, targetsdk 8.1, tensorflow lite, VALIDATOR, video thumbnail extractor, virtual view, wallpapercolors, wallpapercolors api, wosign, [Android] 8.1 Feature and APIs (API Level 27), 안드로이드 go, 안드로이드 메모리 최적화


* 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 인증서가 제거되었다.




반응형

댓글