Android应用在9.0版本手机或者target设置28需要关注的问题

前言

app在设置target=28之后,在华为的一款9.0的手机上测试,出现大面积的图片显示不出来的问题(少部分正常显示),在调试过程中发现,不能正常显示的图片的url都是http的,能正常显示的图片都是https,由此找到问题原因,借此总结一下Android9.0版本对app的一些限制,还有在设置target为28之后,需要对9.0版本做的适配工作,这里不说9.0的功能,只了解对开发者需要注意的点。

Android9.0设备的限制

下边是Android设备的版本为9.0对应用的一些限制,不管你的target是多少,都会有这些限制!
我这里只了解一般开发比较常用的,全部内容请参考:android-9.0-changes-all

隐私权变更

后台对传感器的访问受限

Android 9 限制后台应用访问用户输入和传感器数据的能力。如果应用进入后台,则:

  • 不能访问麦克风和摄像头
  • 使用连续报告模式的传感器(例如加速度计和陀螺仪)不会接收事件。
  • 使用变化或一次性报告模式的传感器不会接收事件。

就是说比如直播应用,或者导航应用,需要用到手机设备的麦克风,摄像头或者其他传感器,一旦应用进入后台,则收不到传感器的数据。

对此的解决方案,就是使用前台服务。在你的service中调用startForeground(NOTIFICATION_ID, notification);,方法有两个参数:唯一标识通知的整型数和状态栏的 Notification,这样服务就会运行在前台,我们在通知栏就能看到应用。

限制访问通话记录和电话号码

对于需要访问通话敏感信息(如读取通话记录和识别电话号码)的应用,需要请求权限组CALL_LOG,否则会发生SecurityException

一般对于类型通讯管家这种应用,就直接使用运行时权限请求CALL_LOG权限组就完事了,CALL_LOG权限组包括READ_CALL_LOGWRITE_CALL_LOGPROCESS_OUTGOING_CALLS

对使用非 SDK 接口的限制

这是一条让人心情很沉重的限制,看完我都快哭了!?

看一下官方是怎么说的:

为帮助确保应用稳定性和兼容性,此平台对某些非 SDK 函数和字段的使用进行了限制;无论您是直接访问这些函数和字段,还是通过反射或 JNI 访问,这些限制均适用。 在 Android 9 中,您的应用可以继续访问这些受限的接口;该平台通过 toast 和日志条目提醒您注意这些接口。

这意味着之前的好多黑科技在Android9.0之后可能就不能用了!
在 Android 9(API 级别 28)中,非受限灰名单中的非 SDK 接口称为浅灰名单,而受限灰名单中的非 SDK 接口称为深灰名单。也就是说,如果我们访问了深灰名单中的api,那就gg了!
关于更多内容,可以参考:针对非 SDK 接口的限制

现在强制执行 FLAG_ACTIVITY_NEW_TASK 要求

在 Android 9 中,您不能从非 Activity 环境中启动 Activity,除非您传递 Intent 标志 FLAG_ACTIVITY_NEW_TASK。 如果您尝试在不传递此标志的情况下启动 Activity,则该 Activity 不会启动,系统会在日志中输出一则消息。

之前遇到在一个service中启动一个activity,在Android9.0上失效,原因就是没有添加FLAG_ACTIVITY_NEW_TASK

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

在 Android 6.0 中,取消了对 Apache HTTP 客户端的支持。

在6.0中,sdk移除了HttpClient相关的api。而推荐使用HttpURLConnection

此变更对大多数不以 Android 9 或更高版本为目标的应用没有任何影响。 不过,此变更会影响使用非标准 ClassLoader 结构的某些应用,即使这些应用不以 Android 9 或更高版本为目标平台。

这些内容什么意思呢?
就是说在6.0移除了 Apache HTTP 客户端,当然我们知道要想用还可以用,在build.gradle中添加:

android {
    useLibrary 'org.apache.http.legacy'
}

但是从9.0开始,org.apache.http.legacy 库将从 bootclasspath 中删除。
所以,在9.0版本之前想用,引用方式相同,只是不能显式地指定系统的ClassLoader去加载apache-http的类,通过应用的ClassLoader去加载。在9.0之后想用,要在Manifest.xml中添加:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

当然,说实话,现在很少有人会有Apache HTTP了!?

target设置为28及以上的限制

同样的,下边只了解常用的,需要了解全部可以参考:
行为变更:以 API 级别 28+ 为目标的应用

前台服务

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

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

构建序列号弃用

在 Android 9 中,Build.SERIAL 始终设置为"UNKNOWN"以保护用户的隐私。
如果应用需要访问设备的硬件序列号,您应请求 READ_PHONE_STATE权限,然后调用getSerial()

Apache HTTP 客户端弃用

在 Android 6.0 中,我们取消了对 Apache HTTP 客户端的支持。 从 Android 9 开始,默认情况下该内容库已从 bootclasspath 中移除且不可用于应用。

要继续使用 Apache HTTP 客户端,以 Android 9 及更高版本为目标的应用可以向其 AndroidManifest.xml 添加以下内容:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

注:拥有最低 SDK 版本 23 或更低版本的应用需要 android:required=“false” 属性,因为在 API 级别低于 24 的设备上,org.apache.http.legacy 库不可用。 (在这些设备上,Apache HTTP 类在 bootclasspath 中提供。)

这块内容,在上边已经提到过!

界面变更

视图焦点

0 面积的视图(即宽度或高度为 0)再也不能被聚焦。

此外,Activity 不再隐式分配触摸模式下的初始焦点。 而是由您显式请求初始焦点(如若需要的话)。

CSS RGBA 十六进制值处理

以 Android 9 或更高版本为目标的应用必须支持草案版 CSS 颜色模块级别 4 的行为,用于处理 4 和 8 个十六进制数字 CSS 颜色。

例如,对于以 API 级别 27 或更低版本为目标平台的应用,颜色 #80ff8080 目前在 WebView 中被渲染为不透明浅红色 (#ff8080)。 先导部分(Android 会将其解读为 Alpha 部分)目前被忽略。 如果某个应用以 API 级别 28 或更高版本为目标,则 #80ff8080 将被解读为 50% 透明浅绿 (#80ff80)。

也就是说,28以前颜色解析为ARGB,28之后变成了RGBA!

HTTP请求被禁止

Android9.0之后,默认禁止不安全的HTTP请求。
这个就是文章开头所提到的问题!
解决方案:
在res->xml文件夹下新建network_security_config.xml:

<network-security-config>
  <base-config cleartextTrafficPermitted="true" />
</network-security-config>

然后在manifest.xml中的application标签中引入:

<application
...
android:networkSecurityConfig="@xml/network_security_config"
...
>

结语

以上,完结!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值