1、前台服务
- 针对 Android 9 或更高版本并使用前台服务的应用必须请求 FOREGROUND_SERVICE 权限。否则系统会引发 SecurityException
- Android8.0 启动前台服务后需要发送一条通知,通知需要需要渠道号
2、Build.SERIAL弃用
在Android 9中,为保护用户的隐私Build.SERIAL始终设置"UNKNOWN"。
如果您的应用需要访问设备的硬件序列号,则应该请求 READ_PHONE_STATE 权限,然后调用 getSerial()
3、默认情况下启用网络传输层安全协议 (TLS)
背景:
从Android 6.0开始引入了对Https的推荐支持,与以往不同,Android P的系统上面默认所有Http的请求都被阻止了。
适配方案:
- 【建议】解决的办法简单来说可以通过在AnroidManifest.xml中的application显式设置<application android:usesCleartextTraffic="true">
- 更为根本的解决办法是修改应用程序中Http的请求为Https
4、Apache HTTP 客户端弃用
背景:Apache HTTP client从bootclasspath中移除
适配方案:
- 【建议】如果要继续使用 Apache HTTP 客户端,以 Android 9 及更高版本为目标的应用可以向其 AndroidManifest.xml 添加以下内容:
<uses-libraryandroid:name="org.apache.http.legacy"android:required="false"/>
- 使用 HttpURLConnection 类替代apache-http
5、非SDK接口管控
背景:
在Android P版本中,谷歌加入了非SDK接口使用限制,无论是通过调用、反射还是JNI等方式,开发者都无法对非SDK接口进行访问,此接口的滥用将会带来严重的系统兼容性问题。
适配方案:
1、【建议】找到可替代的SDK接口进行适配
2、向Google提交名单降级申请
6、内联方法不允许跨dex限制
(1)背景:管控的地方增加了TargetSdkVersion判断,只有TargetSdkVersion>=28的应用才可能触发管控而abort崩溃;
(2)关键日志:This must be due to duplicate classes or playing wrongly with class loaders;(启动之后未发现该日志)
(3)兼容性影响:对使用了热修复和插件框架的应用有影响;
(4)测试和验证是否有影响:
(a)启动应用,构造热修复场景,在app侧触发热修复。
adb shell cmd package compile -m speed -f my-package 应用包名 (inline编译)
(b)重启应用,看看会不会出现闪退问题。
(c)通过关键日志分析确认是不是这个问题:This must be due to duplicate classes or playing wrongly with class loaders。
(5)如果确认应用有这个问题,修复建议:
(a)尽量避免使用不同的classloader来加载相关的(有互相调用可能)类。
(b)如果一定要这样做的话,需要避免内联(比如在不期望被inline的函数里面加个try catch,这样compiler就不会将这个函数inline)。
7、64位要求
(1)新开发的应用,2019-8-1以后上架谷歌Play要求应用的native代码需要提供64位的版本;
(2)更新的应用,2019-11-1以后上架谷歌play要求应用的native代码需要提供64位的版本。
8、Canvas clipPath 方法检查变更 可能会crash
10、Notification Channel问题
Android 8.0开始Notification 需要指定一个channel,当target大于26时,这个channel需要进行系统注册,否则会crash