Android9.0适配和新特性大全及升级实践(2018年最新集合汇总)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37199105/article/details/84572812

 

Android Pie(9.0) New Features

内容:

  • 刘海屏适配
  • 通知功能的变更
  • 隐私权变更
  • 对使用非 SDK 接口的限制 和 适配策略
  • 非Activity-Context启动Activity
  • Apache HTTP 客户端弃用,影响采用非标准 ClassLoader 的应用
  • 前台服务
  • ...

Google 已经正式发布了代号为 Pie 的 Android 9(目前版本也称Android 9.0),该版本最闪亮的功能是加入了全新的全面屏操作手势,有些类似 iPhone X 上的操作。同时 Android 9 还加入了 Android Dashboard,可以让用户了解自己使用设备的习惯,类似于苹果 iOS 12 的屏幕使用时间功能。

Google正式发布代号为Pie的Android 9

 

Android 9 Pie的形象图片

Google正式发布代号为Pie的Android 9

 

Android 9 Pie重要功能

1、Android 9 Pie 是 Android 的一次重大更新,首先 Pie 带来了一个全新的 Android 仪表板,可以让用户知道其在设备上花费的时间,这与 Apple 的屏幕时间功能类似。应用程序屏幕被重新设计,支持 iPhone X 等带有刘海的显示器设备。Pie 也使用了一种新的基于手势的系统界面,具有类似 iPhone 的滑动功能,可以在操作系统中导航。名为 Shush 的勿扰功能在手机屏幕朝下放置时会使 Android 设备静音,而 Wind Down 功能可让手机界面变为灰色,以减少 Android 用户在特定睡眠时间使用手机的可能性。

2、Android 9 Pie 还带来 AI 驱动的 Adaptive Battery,可通过优先处理用户最有可能使用的应用程序来优化电池电量,利用机器学习技术对系统资源进行有效分配,更专注于用户最常用的应用。如果用户已经针对低耗电模式、应用待机模式以及后台限制对您的应用进行过相关优化,那么它就应该已经能够和动态电量管理特性完美配合。

3、与其它版本的 Android 一样,Android 9 Pie 仅限于部分手机升级使用,每个手机厂商都需要经过定制才能对用户推出相应的版本更新。目前的情况是 Android Pie 已经面向 Pixel 手机推出,接下来几个月内将更新包括 Sony Mobile、Xiaomi、Oppo、Vivo、OnePlus 和 Essential 等厂商的最新设备。此外,适用于 Pixel 设备的系统映像现可供下载,支持手动刷机。

4、请前往 Android开源项目库 资源库中的 Android 9 板块,获取更多 Android 9 的相关资源。

 

简要说明Android 9 Pie重要功能

1、手势:Android Pie中加入全新的全面屏操作手势,与iPhone X的操作类似,但屏幕底部依然有导航键,不过只剩返回主菜单和后退。

2、Android Dashboard:这是一种查看APP使用时间的软件,这一点与iOS 12的屏幕使用时间功能类似。

3、Wind Down:在夜间使用手机时能将界面调整为灰色,也就是夜间模式。

4、Adaptive Battery(自适应电池用量):对用户常用的软件进行优化,控制CPU资源占用。

5、Shush勿扰功能:开启该功能后,当手机屏幕朝下,设备可以自动静音。

6、Actions和Slices:这两项功能是为了节省用户操作,比如Actions,检测到手机插入耳机后,会自动跳出音乐相关的App,方便用户选择;而Slices则能在App里节省用户操作,比如搜索打车软件,会自动跳选出叫车回家、目的地等。这类似于Smartisan OS的“一步”、MIUI的“传送门”,主要目的是为了简化用户对手机的操作。

7、界面调整:通知栏、顶部图标等一些功能也有着改变。

 

Android 9 Pie新功能图解说明

Google指出,Android Pie融入了“大量的人工智能援助,让手机更智能、更便利、更能满足用户的特别需求。”

Google正式发布代号为Pie的Android 9

Android Pie提供了一系列新功能,如,内置支持刘海屏、经过调整的快速设置面板、带圆角的通知栏、对内联回复的支持(直接在通知界面中快速回复短信)、通知中的智能回复、用于指纹身份验证的一致用户界面、限制应用后台执行功能的隐私增强特性、自适应电池和自适应亮度功能(由谷歌DeepMind提供支持)、预测用户下一步操作的App Action、在谷歌搜索结果和Assistant智能助理内部显示某些应用的用户界面的App Slices、通过系统管理对话框提示用户进行生物识别身份验证的BiometricPrompt API,以及允许用户同时从两个或多个物理摄像头访问流媒体内容的多摄像头API。

Google正式发布代号为Pie的Android 9

其中,自适应电池功能特别有趣,它能够记录用户最常用的应用,并针对这些应用优先分配电量。同自适应电池一样,自适应亮度功能采用了人工智能技术,能够根据用户的喜好和环境自动调整屏幕亮度。

Google正式发布代号为Pie的Android 9

Google还用实例解释了App Actions如何基于背景信息预测用户的下一步行动。“假设今天是周二早上,你正准备上班,App Actions将建议用户使用谷歌地图导航到上班地点或播放谷歌Play Books中的有声书。下班后戴上耳机时,用户可能看到的选项有,打电话给妈妈或打开最喜欢的Spotify播放列表。”

Google正式发布代号为Pie的Android 9

App Slices功能将在“今年秋季晚些时候”才会推出。该功能能够在需要时显示用户最喜爱的应用的相关信息。例如,若用户在谷歌搜索中输入Lyft,搜索结果中会出现这个打车应用的用户界面,并显示打车回家的价格和预计抵达时间。

全新的数字化健康(Digital Wellbeing)系列功能将先后向Pixel手机(今年秋季)和其他设备(更晚时候)开放。这一系列功能包括记录用户设备使用时间的Dashboard、对某些应用设置使用时限的App Timer、屏蔽屏幕弹出内容的勿扰模式以及在睡觉前开启夜光和勿扰模式、将屏幕调为灰色色调的Wind Down。我们现在可在Pixel手机中通过beta版Android Pie尝试数字化健康系列功能。

Google正式发布代号为Pie的Android 9

Android Pie还推出了全新的系统导航特性,其中的单一主画面按钮借鉴了苹果的iPhone X。从任何地方向上滑动都可显示最近使用应用的全屏预览,用户可通过点击预览跳回某一应用。智能文字选择功能(Smart Text Selection)可识别用户选择的文字的含义并建议相关操作,该功能现在也适用于最近应用预览中。

各种隐私和安全性上的改进也值得一提。Android Pie引入了受保护确认操作(Android Protected Confirmation)、充当新型KeyStore的StrongBox、对DNS over TLS的内置支持、默认阻止所有明文流量的网络安全配置,以及限制闲置应用访问麦克风、相机和所有SensorManager传感器。

Google正式发布代号为Pie的Android 9

最后,Android Pie为我们带来了157个全新的表情符号。

 

API变更 

Display Cutout Support

Android 9 支持最新的全面屏,其中包含为摄像头和扬声器预留空间的屏幕缺口。 通过 DisplayCutout类可确定非功能区域的位置和形状,这些区域不应显示内容。 要确定这些屏幕缺口区域是否存在及其位置,使用 getDisplayCutout()函数。

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
    View decorView = getWindow().getDecorView();
    WindowInsets rootWindowInsets = decorView.getRootWindowInsets();
    if (rootWindowInsets != null) {
        DisplayCutout cutout = rootWindowInsets.getDisplayCutout();
        List<Rect> boundingRects = cutout.getBoundingRects();
        if (boundingRects != null && boundingRects.size() > 0) {
            String msg;
            for (Rect rect : boundingRects) {
                msg = s+"left-" + rect.left;
                Log.d(TAG, msg);
            }
         }
    }
}

用新的窗口布局属性 layoutInDisplayCutoutMode 为设备屏幕缺口周围的内容进行布局。 可以将此属性设为下列值之一:

LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT

The window is allowed to extend into the DisplayCutout area, only if the DisplayCutout is fully contained within a system bar. Otherwise, the window is laid out such that it does not overlap with the DisplayCutout area.

LAYOUT_IN_DISPLAY_CUTOUT_MODE_SHORT_EDGES

The window is always allowed to extend into the DisplayCutout areas on the short edges of the screen. The window will never extend into a DisplayCutout area on the long edges of the screen.屏幕短边有cutout,会延伸过去;若cutout在长边,一定不会延伸过去。

In this mode, the window extends under cutouts on the short edge of the display in both portrait and landscape, regardless of whether the window is hiding the system bars

On the other hand, should the cutout be on the long edge of the display, a letterbox will be applied such that the window does not extend into the cutout on either long edge在长边有cutout的情况,会排出在外。

LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER

The window is never allowed to overlap with the DisplayCutout area.

This should be used with windows that transiently set View.SYSTEM_UI_FLAG_FULLSCREEN or View.SYSTEM_UI_FLAG_HIDE_NAVIGATION to avoid a relayout of the window when the respective flag is set or cleared.

WindowManager.LayoutParams lp = getWindow().getAttributes();
lp.layoutInDisplayCutoutMode = WindowManager.LayoutParams.LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
getWindow().setAttributes(lp);

Channel settings, broadcasts, and Do Not Disturb

Android 8.0 引入了通知渠道,允许您为要显示的每种通知类型创建可由用户自定义的渠道。 Android 9 通过下列变更简化通知渠道设置:

  • 屏蔽渠道组:现在,用户可以针对某个应用在通知设置中屏蔽整个渠道组。 您可以使用 isBlocked()函数确定何时屏蔽一个渠道组,从而不会向该组中的渠道发送任何通知。
    此外,您的应用可以使用全新的 getNotificationChannelGroup()函数查询当前渠道组设置。

  • 全新的广播 Intent 类型:现在,当通知渠道和渠道组的屏蔽状态发生变更时,Android 系统将发送广播 Intent。 拥有已屏蔽的渠道或渠道组的应用可以侦听这些 Intent 并做出相应的回应。 有关这些 Intent 操作和 extra 的更多信息,请参阅 NotificationManager 参考中更新的常量列表。 有关响应广播 Intent 的信息,请参阅广播。

  • NotificationManager.Policy 有 3 种新的“请勿打扰”优先级类别:

  • PRIORITY_CATEGORY_ALARMS优先处理警报。

  • PRIORITY_CATEGORY_MEDIA优先处理媒体源的声音,如媒体和语音导航。

  • PRIORITY_CATEGORY_SYSTEM优先处理系统声音。

  • NotificationManager.Policy 还有 7 种新的“请勿打扰”常量,可以用来抑制视觉中断:

  • SUPPRESSED_EFFECT_FULL_SCREEN_INTENT防止通知启动全屏 Activity。

  • SUPPRESSED_EFFECT_LIGHTS屏蔽通知灯。

  • SUPPRESSED_EFFECT_PEEK防止通知短暂进入视图(“滑出”)。

  • SUPPRESSED_EFFECT_STATUS_BAR防止通知显示在支持状态栏的设备的状态栏中。

  • SUPPRESSED_EFFECT_BADGE在支持标志的设备上屏蔽标志。 如需了解详细信息,请参阅修改通知标志。

  • SUPPRESSED_EFFECT_AMBIENT在支持微光显示的设备上屏蔽通知。

  • SUPPRESSED_EFFECT_NOTIFICATION_LIST防止通知显示在支持列表视图(如通知栏或锁屏)的设备的列表视图中。

隐私权变更-现在收的原来越紧,安卓也越来越规范

为了增强用户隐私,Android 9 引入了若干行为变更,如限制后台应用访问设备传感器、限制通过 Wi-Fi 扫描检索到的信息,以及与通话、手机状态和 Wi-Fi 扫描相关的新权限规则和权限组。

无论采用哪一种目标 SDK 版本,这些变更都会影响运行于 Android 9 上的所有应用。

后台对传感器的访问受限

Android 9 限制后台应用访问用户输入和传感器数据的能力。 如果您的应用在运行 Android 9 设备的后台运行,系统将对您的应用采取以下限制:

您的应用不能访问麦克风或摄像头。
使用连续报告模式的传感器(例如加速度计和陀螺仪)不会接收事件。
使用变化或一次性报告模式的传感器不会接收事件。
如果您的应用需要在运行 Android 9 的设备上检测传感器事件,请使用前台服务。

限制访问通话记录

Android 9 引入 CALL_LOG 权限组并将 READ_CALL_LOGWRITE_CALL_LOG和 PROCESS_OUTGOING_CALLS权限移入该组。 在之前的 Android 版本中,这些权限位于 PHONE 权限组。

如果应用需要访问通话记录或者需要处理去电,则您必须向 CALL_LOG权限组明确请求这些权限。 否则会发生 <mark>SecurityException</mark>。

限制访问电话号码

在未首先获得 READ_CALL_LOG 权限的情况下,除了应用的用例需要的其他权限之外,运行于 Android 9 上的应用无法读取电话号码或手机状态。

与来电和去电关联的电话号码可在手机状态广播(比如来电和去电的手机状态广播)中看到,并可通过 PhoneStateListener 类访问。 但是,如果没有 READ_CALL_LOG 权限,则 PHONE_STATE_CHANGED 广播和 PhoneStateListener <mark>提供的电话号码字段为空</mark>。

要从手机状态中读取电话号码,请根据您的用例更新应用以请求必要的权限:

  • 要通过 PHONE_STATE Intent 操作读取电话号码,同时需要 READ_CALL_LOG 权限和 READ_PHONE_STATE 权限
  • 要从 onCallStateChanged() 中读取电话号码,只需要 READ_CALL_LOG 权限。 不需要 READ_PHONE_STATE 权限

电话信息现在依赖设备位置设置

如果用户在运行 Android 9 的设备上<mark>停用设备定位</mark>,则以下函数不提供结果:

  • TelephonyManager.getAllCellInfo()
  • TelephonyManager.listen()
  • TelephonyManager.getCellLocation()
  • TelephonyManager.getNeighboringCellInfo()

Build.SERIAL 始终设置为 "UNKNOWN" 以保护用户的隐私。

如果您的应用需要访问设备的硬件序列号,您应改为请求 READ_PHONE_STATE权限,然后调用 getSerial()。

多进程 webview 信息访问限制

在 Android P 中为了提升系统的安全性,用户无法在多进程的 webview 中共享数据目录,该目录下存储的是一些 cookies、Http 缓存和其他一些永久、临时的缓存。当下不少应用会把 webview 放在另一个进程中打开以避免内存泄漏,但是他们 cookies 的设置往往还是在主进程中,所以开发者需要仔细排查自己的应用是否有这么使用,webview 相关运行是否正常等。

对使用非 SDK 接口的限制

为帮助确保应用稳定性和兼容性,此平台对某些非 SDK 函数和字段的使用进行了限制;无论您是直接访问这些函数和字段,还是通过反射或 JNI 访问,这些限制均适用。 在 Android 9 中,您的应用可以继续访问这些受限的接口;<mark>该平台通过 toast日志条目提醒您注意这些接口</mark>。 如果您的应用显示这样的 toast,则必须寻求受限接口之外的其他实现策略。 如果您认为没有可行的替代策略,您可以提交错误以请求重新考虑此限制。

对于非SDK 接口

  • 浅灰名单:仍可以访问的非 SDK 函数/字段。
  • 深灰名单:
    对于目标 SDK 低于 API 级别 28 的应用,允许使用深灰名单接口。
    对于目标 SDK 为 API 28 或更高级别的应用:行为与黑名单相同。
  • 黑名单:受限,无论目标 SDK 如何
    平台将提示接口并不存在。
    例如,无论应用何时尝试使用接口,<mark>平台都会引发 NoSuchMethodError/NoSuchFieldException,</mark>即使应用想要了解某个特殊类别的字段/函数名单,平台也不会包含接口。

检测是否使用了非SDK接口

  • 工具veridex
  1. 下载工具,阅读README.txt
  2. 打包一个应用 APK,建议使用 release 包,排除一些未使用到的单元测试类或者其他因素的影响,取消混淆,将 APK 放到工具目录下;
  1. 执行命令 ./appcompat.sh --dex-file=test.apk,在终端上会输出三个名单每个 API 的详细调用处

 

P版本三方适配挖孔屏方案

1、 新增挖孔屏挖孔尺寸和位置接口

class WindowInsets {
DisplayCutout getDisplayCutout();
}
class DisplayCutout {
int getSafeInsetLeft();
int getSafeInsetTop();
int getSafeInsetRight();
int getSafeInsetBottom();
Region getBounds();
}

2、新窗口布局模式,允许应用程序请求是否在挖孔区域布局:

class WindowManager.LayoutParams {
int layoutInDisplayCutoutMode;
final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT;
final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS;
final int LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER;
    }
layoutInDisplayCutoutMode值说明:

a)LAYOUT_IN_DISPLAY_CUTOUT_MODE_DEFAULT:默认情况下,全屏窗口不会使用到挖孔区域,非全屏窗口可正常使用挖孔区域。
b)LAYOUT_IN_DISPLAY_CUTOUT_MODE_ALWAYS:窗口声明使用挖孔区域
c)LAYOUT_IN_DISPLAY_CUTOUT_MODE_NEVER:窗口声明不使用挖孔区域

Battery Improvements

谷歌在P版本之前没有一个完整的功耗解决方案,OEM厂商分别开发各自的功耗方案,管控手段都包括了清理应用,功耗得到优化,但是同时也影响了三方应用的一些功能正常使用,谷歌为了解决这个问题在P版本提出了自己的功耗解决方案。

主要方案:

  • AAB(Auto Awesome Battery):

1、通过ML算法将应用进行分类,不同类型的应用功耗管控策略不一样

2、 Firebase Cloud Messaging (FCM):管控三方消息接收的频率

3、谷歌提供了统一的应用的管控方法:Forced App Standby (FAS),谷歌不会通过清理应用来优化功耗

  • Extreme Battery Saver(EBS)谷歌超级省电模式;

  • Smart screen brightness:屏幕亮度调节优化算法。

影响

谷歌功耗方案对三方应用各种管控,存在导致应用后台功能无法正常使用的可能,特别是:IM、邮箱、闹钟、音乐(直播)、地图导航、运动健康、下载、日历等应用影响比较大。目前通过谷歌提供的调试命令验证:所有的应用都有可能会被分到管控的类型,对三方的后台功能是有影响的。

 

非 SDK API 的处理

适配的原则是优先黑名单和深灰名单,浅灰名单在官方未有替代 API 之前可以暂时不适配,在 Android P 上运行也不会有任何问题。

  1. 向google申请
    在之前 DP 版本时开发者如果遇到了不得不使用的黑名单或者深灰名单 API,需要向 google 官方及时提出反馈 (反馈url)申请将其移动到浅灰名单中,但是目前正式版本已经发布,未得知该申请通道是否仍有效。
  2. 针对第三方库调用到了非 SDK API 接口,解决办法当然是直接查询相关资料或者联系库提供方,确认是否有适配 Android P 新版本的 SDK。还有需要提到的一点,就算更换适配完成的第三方 SDK 后,仍然可能会在同一地方扫描出非 SDK API 的调用,这是因为适配工程师只是在调用处加了一个 try-catch 保护逻辑,虽然这样也勉强叫做适配完成,但是还是强烈建议大家使用如下的适配方式:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
// Android P or above
} else {
// below Android P
}

严格按照上面的适配方案,扫描工具就不会再扫描出此处的非 SDK API 调用,我们也无需每次都去确认所有非 SDK API 调用处都加了保护逻辑。
当然如果第三方库没有适配也没有近期适配的意向,目前有两种方法:第一种是屏蔽入口;第二种是反编译 SDK,在关键地方加上适配代码;

非Activity-Context启动Activity,现在强制执行 FLAG_ACTIVITY_NEW_TASK要求

Apache HTTP 客户端弃用,影响采用非标准 ClassLoader 的应用

将 compileSdkVersion 升级到 28 之后,如果在项目中用到了 Apache HTTP client 的相关类,<mark>就会抛出找不到这些类的错误</mark>。这是因为官方已经<mark>在 Android P 的启动类加载器中将其移除</mark>,如果仍然需要使用 Apache HTTP client.

  1. 在 Manifest 文件中加入:
<uses-library android:name="org.apache.http.legacy" android:required="false"/>
  1. 或者也可以直接将 Apache HTTP client 的相关类打包进 APK 中。
  2. 如果它们委托给 系统 ClassLoader,则应用在 Android 9 或更高版本上将失败并显示 NoClassDefFoundError,因为 系统 ClassLoader不再识别这些类。 为防止将来出现类似问题,一般情况下,应用应通过 应用 ClassLoader加载类,而不是直接访问系统 ClassLoader

前台服务

针对 Android 9 或更高版本并使用前台服务的应用<mark>必须请求</mark> FOREGROUND_SERVICE 权限。 这是普通权限,因此,系统会自动为请求权限的应用授予此权限。

如果针对 Android 9 或更高版本的应用尝试创建一个前台服务且未请求 FOREGROUND_SERVICE,则系统会引发 SecurityException。

 

项目升级P实操

使用模拟器

1、使用Android studio 3.1或者更高的版本
2、升级Android API 28版本,SDK Tools升级至Android SDK Build-Tools 28
3、下载API 28的模拟机镜像
4、设置启动模拟机

这里遇到一个坑,模拟机一直起不来。注意Graphics设置为Software-GLES 2.0

 

更新项目Gradle配置

    androidTargetSdkVersion = 28
    androidCompileSdkVersion = 28
    

模拟机开发者选项设置

开发者选项支持设置模拟刘海屏缺口,项目可通过设置,进行应用的测试。

 

 

总结

注意事项

1、随着Google新的版本发布,项目应尽快跟进兼容。否则后面有多个版本的迭代,遗留的坑会比较多

2、项目可在独立分支升级兼容,然后进行业务功能测试,发现问题进行针对性处理。可先解决一些闪退,功能不正常的问题。

3、多参考Google官方的版本适配介绍,有详细的技术指导

 

展开阅读全文

没有更多推荐了,返回首页