Android 8.1 기능 및 API

Android 8.1 (API 수준 27)에는 사용자와 개발자를 위한 새로운 기능과 성능을 제공합니다. 이 문서에서는 개발자를 위한 새로운 기능을 소개합니다.

Android Oreo(Go 버전)

<ph type="x-smartling-placeholder"></ph> Android Go는 Google Play에서 지원하는 앱을 위한 Android 환경을 전 세계적으로 수십억 명이 인터넷에 접속합니다. Android 8.1부터 우리는 Android를 보급형 기기를 위한 훌륭한 플랫폼으로 만들고 있습니다. Android Oreo의 기능 (Go 버전) 구성에는 다음이 포함됩니다.

  • 메모리 최적화. 플랫폼 전반의 메모리 사용량을 개선하여 앱이 RAM이 1GB 이하인 기기에서 효율적으로 실행될 수 있습니다.
  • 유연한 타겟팅 옵션. 새 상품 하드웨어 기능 상수를 사용할 수 있습니다. Google Play
  • Google Play.Android Oreo를 실행하는 기기에서 모든 앱을 사용할 수 있습니다. (Go 버전), Google Play는 개발자가 특별히 최적화한 앱을 표시합니다 수십억 명의 사람들에게 훌륭한 환경을 제공하기 위해 <ph type="x-smartling-placeholder"></ph> 가이드라인을 참조하세요.

수십억 명의 사용자를 위해 건물을 업데이트했습니다. <ph type="x-smartling-placeholder"></ph> 가이드라인을 참조하세요. <ph type="x-smartling-placeholder"></ph> 앱이 실행되는 기기에 맞게 Android Oreo (Go 버전) 대부분의 개발자는 기존 APK를 최적화하거나 Google Play의 RAM이 부족한 기기에 APK 버전을 타겟팅하는 다중 APK 기능 은 Android Oreo Go 버전을 실행하는 기기를 준비하는 가장 좋은 방법입니다. 앱 더 가볍고 효율적이라고 할 수 있습니다.

Neural Networks API

Neural Networks API는 기기 내 머신에 가속화된 계산 및 추론을 제공합니다. TensorFlow Lite—Google의 모바일용 크로스 플랫폼 ML 라이브러리입니다. Caffe2 등이 있습니다. TensorFlow Lite로 이동 오픈소스 저장소를 사용하세요. TensorFlow Lite는 Neural Networks API와 연동하여 MobileNets Inception v3 휴대기기에서 스마트 답장을 효율적으로 사용하세요.

자동 완성 프레임워크 업데이트

Android 8.1 (API 수준 27)은 자동 완성의 몇 가지 개선사항을 제공합니다. 앱에 통합할 수 있는 프레임워크입니다.

BaseAdapter 이제 클래스에 setAutofillOptions()가 포함됩니다. 메서드를 사용하면 어댑터에 연결합니다. 이는 스피너 값을 동적으로 생성하는 컨트롤을 사용합니다. 예를 들어 setAutofillOptions() 메서드를 사용하여 사용자가 선택할 수 있는 연도의 목록이 신용카드 유효기간 자동 완성 서비스는 데이터가 필요한 뷰를 적절하게 채울 수 있습니다.

또한 AutofillManager 클래스에 notifyViewVisibilityChanged(View, int, boolean) 메서드가 포함됨 의 가시성 변경에 대해 프레임워크에 알리기 위해 호출할 수 있는 볼 수 있습니다 또한 비 생각해야 합니다. 그러나 비 가상 구조는 일반적으로 메서드가 이미 프레임워크에 의해 호출되었기 때문에 명시적으로 프레임워크에 알립니다. View 클래스에 대해 자세히 알아보세요.

Android 8.1은 또한 자동 완성 서비스에 저장 UI를 맞춤설정할 수 있는 더 많은 기능을 제공합니다. CustomDescription and Validator 지원을 추가하여 어포던스 SaveInfo 이내

맞춤 설명은 자동 완성 서비스에서 저장됩니다. 예를 들어 화면에 신용카드가 있는 경우 신용카드 은행 로고, 신용카드 마지막 4자리 숫자 표시 번호 및 만료 번호를 지정합니다. 자세한 내용은 CustomDescription를 참고하세요. 클래스에 대해 자세히 알아보세요.

Validator 유효성 검사 도구 실행 시 자동 완성 저장 UI가 표시되지 않도록 하기 위해 객체가 사용됩니다. 조건을 만족하지 않습니다. 자세한 내용은 Validator 클래스 및 서브클래스 LuhnChecksumValidatorRegexValidator

알림

Android 8.1에서는 알림이 다음과 같이 변경됩니다.

  • 이제 앱은 초당 한 번만 경고음을 낼 수 있습니다. 이 값을 초과하는 알림음 요율이 대기열에 추가되지 않고 손실됩니다. 이 변경사항은 알림의 다른 측면에는 영향을 미치지 않습니다. 동작 및 알림 메시지는 계속 정상적으로 게시됩니다.
  • NotificationListenerService 및 RAM이 부족한 경우 ConditionProviderService가 지원되지 않습니다. 다음의 경우 true를 반환하는 Android 지원 기기 ActivityManager.isLowRamDevice()가 호출됩니다.

EditText 업데이트

API 수준 27부터 EditText.getText() 메서드는 Editable를 반환합니다. 이전 CharSequence를 반환했습니다. 이 변경사항은 Editable가 구현하므로 이전 버전과 호환됨 CharSequence입니다.

Editable 인터페이스는 기능을 제공합니다 예를 들어 EditableSpannable 인터페이스를 구현하는 경우 콘텐츠를 EditText의 인스턴스 내 콘텐츠로 사용하세요.

프로그래밍 방식의 세이프 브라우징 작업

Safe Browsing API의 WebView 구현을 통해 앱에서 다음 작업을 할 수 있습니다. WebView 인스턴스가 탐색을 시도할 때 감지 Google이 알려진 위협으로 분류한 URL로 보냅니다. 기본적으로 WebView에서는 사용자에게 알려진 위협에 대해 경고하는 전면 광고를 표시합니다. 이 화면에서 사용자는 무시하고 URL을 로드하거나 이전 페이지로 이동해야 합니다.

Android 8.1에서는 빌드 시 다음과 같이 알려진 위협에 대응하는 방법을 보여줍니다.

  • 앱에서 알려진 위협을 Safe에 보고할지 여부를 제어할 수 있습니다. 탐색을 탭합니다.
  • 앱에서 다음과 같은 특정 작업을 자동으로 수행하도록 할 수 있습니다. 사용자가 안전 브라우징을 할 수 있는 URL을 발견할 때마다 알려진 위협으로 분류합니다.

참고: 알려진 위협으로부터 최적의 보호 기능을 사용하려면 다음 단계를 따르세요. 세이프 브라우징을 초기화한 후에 WebView 객체의 loadUrl() 메서드와 일치해야 합니다.

다음 코드 스니펫은 앱의 인스턴스에 WebView: 보안 침해 발생 후 항상 안전한 상태로 복귀 알려진 위협:

AndroidManifest.xml

<manifest>
    <application>
        ...
        <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing"
                   android:value="true" />
    </application>
</manifest>

MyWebActivity.java

Kotlin

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!")
            }
        })
    }
}

자바

private WebView superSafeWebView;
private boolean safeBrowsingIsInitialized;

// ...

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    superSafeWebView = new WebView(this);
    superSafeWebView.setWebViewClient(new MyWebViewClient());
    safeBrowsingIsInitialized = false;

    superSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() {
        @Override
        public void onReceiveValue(Boolean success) {
            safeBrowsingIsInitialized = true;
            if (!success) {
                Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!");
            }
        }
    });
}

MyWebViewClient.java

Kotlin

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()
    }
}

자바

public class MyWebViewClient extends 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
    public void onSafeBrowsingHit(WebView view, WebResourceRequest request,
            int threatType, SafeBrowsingResponse callback) {
        // The "true" argument indicates that your app reports incidents like
        // this one to Safe Browsing.
        callback.backToSafety(true);
        Toast.makeText(view.getContext(), "Unsafe web page blocked.",
                Toast.LENGTH_LONG).show();
    }
}

동영상 미리보기 이미지 Extractor

MediaMetadataRetriever 클래스에는 새 메서드 getScaledFrameAtTime()가 있습니다. 지정된 시간 위치에 가까운 프레임을 생성하고 가로세로 비율이 동일한 비트맵 반환 비율도 소스 프레임으로 나타내지만 특정 너비와 높이의 직사각형에 맞도록 조정됩니다. 높이. 이는 동영상에서 미리보기 이미지를 생성할 때 유용합니다.

메모리를 낭비할 수 있는 getFrameAtTime()보다는 이 메서드를 사용하는 것이 좋습니다. 소스 동영상과 해상도가 같은 비트맵을 반환하기 때문입니다. 대상 예를 들어 4K 동영상의 프레임은 16MB의 비트맵으로 썸네일 이미지가 필요합니다.

Shared Memory API

Android 8.1 (API 수준 27)에는 SharedMemory 드림 API에 액세스할 수 있습니다. 이 클래스를 사용하면 익명의 애플리케이션을 만들고, 매핑 및 관리할 수 있습니다. SharedMemory 드림 인스턴스를 만들 수 있습니다 메모리 보호 설정 위치: SharedMemory 드림 및/또는 쓰기를 위한 객체를 제공하며 SharedMemory 드림 객체가 Parcelable이면 AIDL을 통해 다른 프로세스로 쉽게 전달할 수 있습니다.

SharedMemory API는 ASharedMemory 기능에 대해 자세히 알아보기 ASharedMemory님이 액세스 권한을 부여합니다. 파일 설명자에 매핑하여 읽기 및 쓰기에 매핑할 수 있습니다. 정말 훌륭합니다. 대량의 데이터 공유 방법 여러 프로세스 간 또는 앱 간 또는 단일 앱 내의 여러 프로세스 간

WallpaperColors API

Android 8.1 (API 수준 27)에서는 라이브 배경화면에 색상을 제공할 수 있습니다. 시스템 UI에 전달합니다. 이렇게 하려면 WallpaperColors를 만들면 됩니다. 객체를 비트맵 또는 드로어블로 설정하거나 수동으로 선택한 세 가지 색상을 사용합니다. 이 색상 정보를 검색할 수도 있습니다.

WallpaperColors 생성 객체가 있으면 다음 중 하나를 수행합니다.

  • WallpaperColors 생성 객체를 만들려면 WallpaperColors의 인스턴스를 만듭니다. 클래스에 기본 색과 보조 색, 3차 색을 전달하면 됩니다. 기본 색상은 null이 아니어야 합니다.
  • WallpaperColors 생성 객체를 비트맵에서 반환하도록 하려면 fromBitmap() 메서드를 사용하여 비트맵 소스를 매개변수로 전달할 수 있습니다.
  • WallpaperColors 생성 객체를 드로어블로 가져온 경우, fromDrawable()를 호출합니다. 메서드를 사용하여 드로어블 소스를 매개변수로 전달할 수 있습니다.

기본, 보조 또는 3차 색상 세부정보를 배경화면을 사용하려면 다음 메서드를 호출합니다.

  • getPrimaryColor() 는 배경화면에서 시각적으로 가장 대표적인 색상을 반환합니다.
  • getSecondaryColor() 은 배경화면에서 두 번째로 두드러진 색상을 반환합니다.
  • getTertiaryColor() 메서드는 배경화면에서 세 번째로 두드러진 색상을 반환합니다.

라이브 배경화면의 중요한 색상 변경을 시스템에 알리려면 다음 단계를 따르세요. notifyColorsChanged() 호출 메서드를 사용하여 축소하도록 요청합니다. 이 메서드는 onComputeColors() 수명 주기를 트리거합니다. 새 WallpaperColors을 제공할 기회가 있는 이벤트 객체를 지정합니다.

색상 변경 리스너를 추가하려면 addOnColorsChangedListener() 메서드를 호출하면 됩니다. 다음과 같은 작업을 할 수 있습니다. getWallpaperColors() 메서드도 호출합니다. 배경화면의 기본 색상을 가져옵니다.

지문 업데이트

FingerprintManager 클래스에는 다음이 포함됩니다. 다음과 같은 오류 코드가 도입되었습니다.

  • FINGERPRINT_ERROR_LOCKOUT_PERMANENT – 사용자가 시도함 기기를 잠금 해제하지 못할 수 있습니다.
  • FINGERPRINT_ERROR_VENDOR – 공급업체별 디지털 지문입니다. 판독기 오류가 발생했습니다.

암호화 업데이트

Android 8.1에서는 여러 가지 암호화 변경이 실행되었습니다.

  • Conscrypt에서 새로운 알고리즘이 구현되었습니다. Conscrypt 구현이 기존 Bouncy Castle보다 우선 사용됩니다. 있습니다. 새로운 알고리즘은 다음과 같습니다. <ph type="x-smartling-placeholder">
      </ph>
    • 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을 사용하는 알고리즘에서 더 오래 작동합니다. 대신 getParameterSpec(GCMParameterSpec.class)
  • TLS와 관련된 많은 내부 Conscrypt 클래스가 리팩터링되었습니다. 이후 개발자들은 때때로 이러한 정보에 액세스하는데, 심은 여러 번 이전 사용을 지원하지만 일부 세부정보는 변경되었습니다. 예: 소켓 이전에는 OpenSSLSocketImpl 유형이었지만 이제는 다음 유형입니다. ConscryptFileDescriptorSocket 또는 ConscryptEngineSocket, 둘 다 OpenSSLSocketImpl
  • 발생에 사용되는 SSLSession 메서드 IllegalArgumentException에 null 참조가 전달되면 이제 NullPointerException이 발생합니다.
  • RSA KeyFactory에서 더 이상 키 생성을 허용하지 않습니다. 인코딩된 키보다 큰 바이트 배열에서 반환됩니다. 수신 전화 generatePrivate()generatePublic()KeySpec, 여기서 키 구조가 전체 버퍼에서 InvalidKeySpecException이 발생합니다.
  • 소켓이 닫혀 소켓 읽기가 중단되면 Conscrypt가 읽기에서 -1을 반환합니다. 이제 읽기가 발생합니다. SocketException
  • 루트 CA 인증서 세트가 변경되어 더 이상 사용하지 않는 인증서의 개수뿐 아니라 WoSign 및 StartCom 이 결정에 대해 자세히 알아보려면 보안 블로그 게시물, 최종 WoSign 및 StartCom 인증서에 대한 신뢰 삭제