一. SDK接口限制
1. 原因和目的
- 为帮助确保应用稳定性和兼容性,此平台对某些非 SDK 函数和字段的使用进行了限制;
- 无论您是直接访问这些函数和字段,还是通过反射或 JNI 访问,这些限制均适用。
- 在 Android 9 中,您的应用可以继续访问这些受限的接口;该平台通过,您的应用可以继续访问这些受限的接口;
2. SDK限制类型
- 白名单:SDK
- 浅灰名单:仍可以访问的非 SDK 函数/字段。
- 深灰名单: 对于 Target Api SDK 低于 API 28 的应用,允许使用深灰名单接口。对于 Target Api SDK API 28 或更高级别的应用:行为与黑名单相同。
- 黑名单:无论 Target Api SDK 如何。 平台将表现为似乎接口并不存在。 例如,无论应用何时尝试使用接口平台都会引发 NoSuchMethodError/NoSuchFieldException。
以DexFile(深灰名单)的热修复不能用
3. SDK检测工具
官方提供了自动扫描工具 veridex
4. 详情使用参考资料
Android P 适配指南Sdk接口限制
google官方中文文档对非Sdk接口限制
二.前台服务
1. 权限问题
Target 28+ 并使用前台服务的应用必须求 FOREGROUND_SERVICE
权限。 这是 普通权限,因此,系统会自 动为请求权限的应用授予此权限。
如果针对 Android 9 或更高版本的应用尝试创建一个前台服务且未请求 FOREGROUND_SERVICE
,则系统会引发 SecurityException
。
manifest.xml 中申明
<?xml version="1.0" encoding="utf-8"?>
<manifest ... >
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
</manifest>
2. 使用原因和目的
- 前台服务被认为是用户主动意识到的一种服务,因此在内存不足时,系统也不会考虑将其终止。
- 前台服务必须为状态栏提供通知,放在“正在进行”标题下方,这意味着除非服务停止或从前台移除,否则不能清除通知。
3. 使用方法
要请求让服务运行于前台,请调用 startForeground()。此方法采用两个参数:唯一标识通知的整型数和状态栏的 Notification。
例如:
Notification notification = new Notification(R.drawable.icon, getText(R.string.ticker_text),
System.currentTimeMillis());
Intent notificationIntent = new Intent(this, ExampleActivity.class);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0);
notification.setLatestEventInfo(this, getText(R.string.notification_title),
getText(R.string.notification_message), pendingIntent);
startForeground(ONGOING_NOTIFICATION_ID, notification);
注意:提供给 startForeground()
的整型 ID 不得为 0。要从前台移除服务,请调用 stopForeground()
。
此方法采用一个布尔值,指示是否也移除状态栏通知。 此方法不会停止服务。 但是,如果您在服务正在前台运行时将其停止,则通知也会被移除
4. 使用注意点
如果针对Android8.0的应用尝试在不允许创建其后台服务的情况下使用startService()函数,则该函数将引发一个llegalStateException.Context.startForegroundService()
函数将启动一个前台服务。即使应用在后台运行,系统也允许其调用Context.startForegroundService()
.不过,应用必须在创建服务后的5秒内调用改服务的startForegroun()
函数,否则将报ANR(Application Not Responding)错误。
从Android8.0开始,需要为发送的每种不同类型的通知创建一个渠道,如果在Android8.0及以上在未指定通知频道的情况下发送通知,通知不会显示,会记录错误。
创建通知渠道步骤:
1. 通