💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、豆包、星火、月之暗面及文生图、文生视频 广告
### **[Android 8.1功能和API](https://developer.android.com/about/versions/oreo/android-8.1.html)** Android 8.1(API级别27)为用户和开发人员引入了各种新特性和功能。本文档重点介绍了开发人员的新功能。 #### **Android奥利奥(Go版)** Android Go是我们主动为全球数十亿在线用户优化Android体验。从Android 8.1开始,我们将使Android成为入门级设备的绝佳平台。Android Oreo(Go版)配置中的功能包括: * 内存优化。改善整个平台的内存使用情况,确保应用程序可以在1GB或更少RAM的设备上高效运行。 * 灵活的定位选项。新的 硬件功能常量,可让您通过Google Play将应用程序分配到普通或低RAM设备。 * Google Play。虽然所有的应用程序都可以在运行Android Oreo(Go版)的设备上使用,但Google Play将提供开发人员专门优化的应用程序的可见性,为数十亿用户提供数十亿 指导方针的良好体验 。 我们已经更新了数十亿 指南的建设, 并提供了关于如何 针对运行Android Oreo(Go版)的设备优化您的应用的其他指导 。对于大多数开发者来说,优化现有的APK或使用Google Play的 多APK功能将您的APK版本定位到低内存设备是准备运行Android Oreo(Go版)的设备的最佳方式。请记住,无论使用哪种设备,让您的应用 更轻盈,更高效,都可以让您的整个观众受益 #### **神经网络API** Neural Networks API为设备上的机器学习框架(如TensorFlow Lite -Google的移动平台ML库以及Caffe2等)提供了加速的计算和推理。访问TensorFlow Lite 开源回购下载和文档。TensorFlow Lite可与Neural Networks API 协同工作,在移动设备上高效运行 MobileNets, Inception v3和 Smart Reply等模型。 #### **自动填充框架更新** Android 8.1(API级别27)对自动填充框架进行了一些改进,您可以将其添加到应用程序中。 该BaseAdapter 级现在包括setAutofillOptions() 方法,它允许您提供值的字符串表示在一个适配器。这对于 在其适配器中动态生成值的微调控件非常有用。例如,您可以使用该setAutofillOptions()方法提供用户可以选择作为信用卡过期日期一部分的年份列表的字符串表示形式。自动填充服务可以使用字符串表示来适当填写需要数据的视图。 此外,AutofillManager 该类还包括notifyViewVisibilityChanged(View, int, boolean)可以调用的方法,以通知框架关于虚拟结构中视图可见性的更改。非虚拟结构的方法也有重载。但是,非虚拟结构通常不要求您明确地通知框架,因为该方法已被View 该类调用 。 Android 8.1还为Autofill服务提供了更多的能力,通过添加对CustomDescription and Validator 内部的支持来定制保存UI可供性SaveInfo。 自定义描述可帮助自动填充服务澄清正在保存的内容; 例如,当屏幕包含信用卡时,它可以显示信用卡银行的标志,信用卡号码的最后四位数字和到期号码。要了解更多信息,请参阅 CustomDescription 课程。 Validator 对象用于避免在验证条件不满足时显示自动填充保存UI。要了解更多信息,请参阅 Validator类及其子类 LuhnChecksumValidator和RegexValidator。 #### **通知** Android 8.1包含对通知的以下更改: * 应用程序现在只能每秒发出一次通知警报声音。超过这个速度的警报声音不会排队并丢失。此更改不会影响通知行为的其他方面,通知邮件仍按预期发布。 * NotificationListenerService并且 在 被称为ConditionProviderService返回的低内存Android设备上不受支持。 trueActivityManager.isLowRamDevice() #### **EditText更新** 从API级别27开始,该EditText.getText()方法返回一个Editable; 以前它返回一个CharSequence。这种变化是向后兼容的,作为Editable实现 CharSequence。 该Editable接口提供了宝贵的附加功能。例如,因为Editable也实现了Spannable接口,所以可以将标记应用于实例中的内容EditText。 #### **程序化安全浏览操作** 通过使用安全浏览API 的实施,您的应用可以检测何时尝试导航到Google已经归类为已知威胁的URL 的实例。默认情况下,会 显示警告用户已知威胁的插页式广告。该屏幕允许用户选择加载URL,或返回到安全的上一页。 WebViewWebViewWebView 在Android 8.1中,您可以通过编程来定义您的应用程序如何响应已知的威胁: * 您可以控制您的应用是否将已知威胁报告给安全浏览。 * 您可以让自己的应用程序自动执行特定操作(例如回到安全状态),每次遇到安全浏览会将其归类为已知威胁的网址时。 > 注意:为了最大限度地防范已知威胁,请等到您在调用WebView对象的loadUrl()方法之前初始化安全浏览 。 以下代码片段显示了如何指示您的应用程序的实例 WebView在遇到已知威胁后总是返回到安全状态: AndroidManifest.xml中 ~~~ <manifest> <application> ... <meta-data android:name="android.webkit.WebView.EnableSafeBrowsing" android:value="true" /> </application> </manifest> ~~~ **MyWebActivity.java** ~~~ private WebView mSuperSafeWebView; private boolean mSafeBrowsingIsInitialized; // ... @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mSuperSafeWebView = new WebView(this); mSuperSafeWebView.setWebViewClient(new MyWebViewClient()); mSafeBrowsingIsInitialized = false; mSuperSafeWebView.startSafeBrowsing(this, new ValueCallback<Boolean>() { @Override public void onReceiveValue(Boolean success) { mSafeBrowsingIsInitialized = true; if (!success) { Log.e("MY_APP_TAG", "Unable to initialize Safe Browsing!"); } } }); } ~~~ **MyWebViewClient.java** ~~~ 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(); } } ~~~ #### **视频缩略图提取器** 的MediaMetadataRetriever类有一个新的方法,getScaledFrameAtTime()即找到邻近给定的时间位置的帧,并返回具有相同的纵横比作为源帧的位图,但是缩放,以符合给定宽度和高度的矩形。这对于从视频生成缩略图图像很有用。 我们建议使用这种方法,而不是getFrameAtTime()浪费内存,因为它返回一个与源视频分辨率相同的位图。例如,来自4K视频的帧将是16MB的位图,远大于缩略图所需的位图。 #### **共享内存API** Android 8.1(API等级27)引入了一个新的 SharedMemory API。这个类允许你创建,映射和管理一个匿名 SharedMemory 实例。您可以将SharedMemory 对象的内存保护设置 为读取和/或写入,并且由于 SharedMemory 对象是Parcelable,因此可以通过AIDL轻松地将其传递给另一个进程。 该SharedMemory API与互操作 ASharedMemory的NDK设施。 ASharedMemory允许访问文件描述符,然后可以将其映射到读取和写入。这是在应用程序之间或单个应用程序中的多个进程之间共享大量数据的好方法。 #### **WallpaperColors API** Android 8.1(API等级27)允许您的动态壁纸为系统UI提供颜色信息。您可以通过WallpaperColors 从位图,可绘制对象或使用三种手动选择的颜色创建对象来实现此目的。你也可以检索这个颜色信息。 要创建一个WallpaperColors 对象,请执行以下任一操作: * 要WallpaperColors 使用三种颜色创建对象,请WallpaperColors 通过传递一级,二级和三级颜色来创建该类的实例。原色不能为空。 * 要从WallpaperColors 位图创建对象,请fromBitmap() 通过传递位图源作为参数来调用该方法。 * 要从WallpaperColors drawable 创建一个对象,请fromDrawable() 通过传递可绘制的源作为参数来调用该方法。 要从壁纸检索主要,次要或第三个颜色细节,请调用以下方法: * getPrimaryColor() 返回壁纸最具视觉代表性的颜色。 * getSecondaryColor() 返回壁纸的第二个最显着的颜色。 * getTertiaryColor() 方法返回壁纸的第三个最显着的颜色。 要通知系统有关您的动态壁纸的任何重大的颜色变化,请调用该notifyColorsChanged() 方法。onComputeColors()在有机会提供新WallpaperColors 对象的情况下,此方法会触发生命周期事件。 要添加用于颜色更改的侦听器,可以调用该addOnColorsChangedListener()方法。您也可以调用该getWallpaperColors()方法来检索壁纸的主要颜色。 #### **指纹更新** 该FingerprintManager班先后引进了以下错误代码: * FINGERPRINT_ERROR_LOCKOUT_PERMANENT - 用户尝试使用指纹读取器解锁设备的次数过多。 * FINGERPRINT_ERROR_VENDOR - 发生特定于供应商的指纹识别器错误。 #### **加密更新** Android 8.1已经进行了许多密码修改: * 新的算法已经在Conscrypt中实现。Conscrypt实现优先用于现有的Bouncy Castle实现。新算法包括: * 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相关的许多内部的加密类被重构。由于开发人员有时会反射地访问这些内容,所以垫片已经被留下以支持以前的使用,但是一些细节已经改变。例如,之前的套接字是类型的OpenSSLSocketImpl,但是现在它们是类型的, ConscryptFileDescriptorSocket或者 ConscryptEngineSocket两者都扩展 OpenSSLSocketImpl。 * SSLSessionIllegalArgumentException当传递一个空引用时抛出的方法被 抛出NullPointerException。 * RSA KeyFactory不再允许从字节数组中生成大于编码密钥的密钥。调用 generatePrivate()并 generatePublic()提供一个 KeySpec关键结构不填充整个缓冲区的地方将导致一个InvalidKeySpecException。 * 当套接字读取被关闭的套接字中断时,Conscrypt用于从读取中返回-1。现在阅读抛出 SocketException。 * 根CA证书集已被更改,大部分删除了大量的废弃证书,同时也删除了WoSign和StartCom的根证书。有关此决定的更多信息,请参阅Google安全博客文章, [WoSign和StartCom证书的最终删除信任](https://security.googleblog.com/2017/07/final-removal-of-trust-in-wosign-and.html)。