应用不兼容的常见原因

使用了系统的 ClassLoader 加载 org.apache.http.* 的库

Android M 就已经开始移除对 Apache HTTP client 的支持。而 Android P 的系统 ClassLoader 已经不支持加载 org.apache.http.包 (抛出 NoClassDefFoundError),应用必须用自定义的 ClassLoader 来加载,同时确保 org.apache.http. 的路径包含在应用 classpath 上。

应用不应该再使用 org.apache.http.legacy 库,如果实在必须,可以将它打包进自己的 APK,同时改名以防止与运行时的版本冲突。

没有使用兼容 Android 9 的加固服务

部分加固服务可能尚未兼容 Android 9。开发者应该使用兼容 Android 9 的加固服务。

直接调用 dex2oat

从一开始,dex2oat 就被设计为系统内部使用的编译部署工具,Android 从来都未支持过开发者直接调用 dex2oat 的场景。

如果您需要从内存中加载 dex 文件,而不愿在存储中留下痕迹,请使用 Android O 中新增的加载器 InMemoryDexClassLoader。

相关的 dex / so 文件亦不应直接操作或篡改,干扰或篡改系统内部加载 dex 的逻辑很可能会导致兼容性问题。

使用了非 SDK 接口

非 SDK 接口在每次版本更新中都有可能被改动,开发者应只使用 SDK 接口。

使用了不兼容的第三方的库

如果您使用的第三方库尚不支持 Android P 版本,请报告给其提供商,帮助推动它解决兼容性问题。

非 SDK 接口的限制名单

类别 介绍
白名单 Android SDK 本身没有任何限制
黑名单 只能被 Android 系统及系统应用使用,无论 targetSdkVersion 都禁止使用,对应用开发者来说,相当于没有这些接口
深灰名单 没有发现应用在使用,但我们觉得有潜在的可能性,当 targetSdkVersion < P 时允许使用,当 targetSdkVersion >= P 时禁止使用 (相当于黑名单)
浅灰名单 已有应用在使用的非 SDK 接口,仍然可以继续使用,将来会考虑提供相应的 SDK 接口,当 targetSdkVersion >= P 时系统提示警告

凹口屏幕 Display Cutout

不要硬编码状态栏的高度,请使用 WindowInsetsCompat 获取状态列的高度。

注意屏幕大小与显示范围的差异,请使用 View.getLocationInWindow(),而不是 View.getLocationOnScreen()。处理 MotionEvent 时,使用 getX() / getY() ,而不是 getRawX() / getRawY() 。

凹口可以置中或靠边,只会在屏幕短边出现,两条短边皆可有缺口。

屏幕旋转锁定

在 Android P 上,不论是自动旋转或旋转锁定 (rotation lock),应用界面皆可以为纵向或横向,这取决于最上层可见 Activity 的 screenOrientation 设置。请不要再假设设备在旋转锁定时必定为纵向。

Inline 函数调用检查

在 Android P 中,如果调用某个 inline 方法的类与 inline 方法所在的类由不同的 ClassLoader 加载, 就会主动发起 abort (inline 不允许跨 dex 文件),导致应用 crash。请尽量避免用不同的 ClassLoader 来加载相关的 (有互相调用可能) 类,因为被调用类的方法可能已经被 inline 了。

空闲应用无法访问麦克风、摄像头和传感器

为了更好地保证隐私,Android P 限制所有处于空闲状态的应用对麦克风、摄像头和所有 SensorManager 传感器的访问。当一个应用的 UID 空闲时,麦克风将会报告系统 “无音频信号”,传感器将会停止报告事件。应用使用的摄像头也会断开连接,如果应用尝试使用它们,则会生成错误。在大多数情况下,这些限制不会为现有应用带来新的问题,但我们仍然建议您从应用中移除此类传感器请求。

前台服务权限

应用 target 到 P 版本后,在使用前台服务时必须申请 FOREGROUND_SERVICE 权限。这是一个一般性权限,应用只需在 manifest 中声明,系统会自动授予而无需询问用户。但若无此权限即运行前台服务,系统会抛出 SecurityException。

后台服务限制

自 Oreo 起,Target SDK >= 26 的应用若没有在前台显示,它的后台服务将受到系统限制。需长期运行的服务应迁移至前台服务,并让使用者注意到服务正在运行;或改用排程作业,例如 WorkManager 或 JobScheduler。

Google Play targetSdkVersion 政策

为了推动应用获得 Android 新版本提供的安全和性能提升,Google Play 应用市场要求其上的应用必须:

从 2018 年 8 月起,新发布的应用必须将 targetSdkVersion 设置为 26 或更高

从 2018 年 11 月起,现有应用的升级必须将 targetSdkVersion 设置为 26 或更高

2019 年之后,新发布或升级应用必须将 targetSdkVersion 设置为一年内发布的 Android 版本

更多相关文章

  1. Bitmap 的加载和 Cache
  2. android内置的一些测试程序
  3. Android的系统服务一览
  4. Android(安卓)即时音视频解决方案1——环信
  5. android SDK manager 以及ADT eclipse更新问题
  6. Android(安卓)消息推送通知指南
  7. 异步加载注意的事项
  8. Android(安卓)5.0 SystemServer--->Android入口
  9. android系统学习笔记八

随机推荐

  1. Android(安卓)WindowManager悬浮窗
  2. android软键盘不覆盖屏幕方法
  3. Android(安卓)DataBinding使用总结(二)
  4. ionic 发布 android apk
  5. Android的Window底层原理
  6. 颜色选择器【ColorPickerPreference】自
  7. 打开Android(安卓)C文件中的LOG
  8. Android(安卓)Service的两种启动方式,你知
  9. android 6.0及以上动态权限的获取
  10. Android应用程序结构及开发流程