议题七 QQ音乐适配安卓P最佳实践 QQ音乐赵泽鹏

1. 大会视频回放链接:http://www.itdks.com/eventlist/detail/2823
2. QQ ⾳音乐 Android P 适配⼼心得 shawnzhao(赵泽鹏) QQ ⾳音乐/Android ⾼高级开发⼯工程师
3. Android P ⾏行行为变更更适配 全⾯面屏检测以及适配 01 02 ⾮非SDK API 详解 电源管理理改进 03 04 其余适配 2
4. 全⾯面屏检测以及适配 3
5. 全⾯面屏检测以及适配 public static void checkNotchScreenAboveP(final View decorView) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { WindowInsets windowInsets = decorView.getRootWindowInsets(); if (windowInsets != null) { DisplayCutout displayCutout = windowInsets.getDisplayCutout(); if (displayCutout != null) { List<Rect> rects = displayCutout.getBoundingRects(); if (rects != null && rects.size() > 0) { isNotchScreen = true; } } } } } • 注意要点: ➢ decorView 必须先 attach 到 window; ➢ 慎⽤用 setOnApplyWindowInsetsListener, 会造成导航栏透明; 4
6. ⾮非 SDK API 适配 5
7. ⾮非 SDK API 介绍检测 6
8. ⾮非 SDK API 适配⽅方案 01 项⽬目⾃自身代码 寻找新的可替代 API; 02 项⽬目⾃自身代码 不不同版本⾛走不不同逻辑,尽 量量不不使⽤用try-catch,以防 下次仍会被扫描; 03 第三⽅方SDK 联系第三⽅方 SDK 提供 ⽅方,获取最新适配版 本 SDK; 04 第三⽅方SDK 如果⼀一直未适配,根 据版本屏蔽功能; 7
9. ⾮非 SDK API 与版本迭代 ⾮非 SDK API 后续⽅方法论总结: 开发阶段 定期更更新官⽹网检测⼯工 具,定时扫描⾮非 SDK API 使⽤用,特别 是第三⽅方 SDK; 灰度前 发布灰度前,更更新⼯工具 完整扫描⼀一次⾮非 SDK API 使⽤用,对⽐比之前有 ⽆无新增; 灰度阶段 重点关注⽤用 Android P 版 本Crash 和 ⽤用户反馈; 全量量顺利利发布 8
10. 电源管理理改进适配 9
11. 电源管理理之应⽤用分组 Android P 设备上针对所有应⽤用均会⽣生效: 10
12. 电源管理理之省电模式 开启省电模式,⾃自动施加如下四个限制: 更更加积极的 将应⽤用置于 待机状态 后台应⽤用 没有⽹网络 访问权限 屏幕关闭时, 位置服务可 能会被停⽤用 后台执⾏行行限 制适⽤用于所 有应⽤用 11
13. 后台服务限制 第三⽅方拉起崩溃 java.lang.IllegalStateException: Not allowed to start service Intent 不不允许后台应⽤用创建后台服务,Android O 版本引⼊入,Android P 限制更更加严格; 12
14. QQ⾳音乐双进程旧⽅方案梳理理 • 旧双进程: ➢ 主进程服务被 LMK 杀死后会被播放进程拉起进⾏行行数据交互; ➢ 应⽤用常驻内存 = 主进程(除去相关资源) + 播放进程; 13
15. QQ⾳音乐双进程新⽅方案改进 • 新双进程: ➢ 播放歌曲时,主进程⾮非常驻; ➢ 新⽅方案应⽤用常驻内存 = 播放进程,降低⽤用户系统资源占⽤用50% 以上,⼀一切以⽤用户价值为依归,极⼒力力提升⽤用户体验! 14
16. QQ⾳音乐新双进程⽅方案通信改造优化 • 进程通信⽅方案: ➢ 播放进程维护⼀一套主进程 cache,主进程合适时间更更新cache, 避免频繁跨进程; ➢ 如果主进程 alive,则通过 AIDL 进⾏行行双进程通信; ➢ 如果主进程死亡,则通过 UnstableContentProvider 调⽤用到主进 程获取数据; 15
17. 其余适配 16
18. 其余 Android P ⾏行行为变更更适配 前台 Service ● 申请 FOREGROUND_SERVICE 权限; 隐私安全 保护 ● ⽆无法获取 Build.SERIAL; ● 多进程 WebView 信息访问限制; ⽆无法找到 相关类 ● Apache HTTP client 相关类⽆无法找到; ● com.android.internal 包下某些类找不不到; 17
19. Android P 新特性 HEIF HEIF 格式图⽚片介绍和⽀支持 ImageDecoder ImageDecoder 新特性初探 18
20. HEIF 图⽚片格式⽀支持 ● HEIF 格式优点: ➢ HEIF 格式的压缩率是 JPEG 的 2.39 倍, 同等⼤大⼩小质量量的图⽚片可节省 50% 的空间 和⽹网络传输流量量; ➢ ⽀支持动图,HEIF 格式⽐比起 GIF 格式来说 有着更更好的图⽚片展示效果; 19
21. HEIF 图⽚片格式⽀支持 fun supportHeif() = Build.VERSION.SDK_INT >= 28 && Build.MANUFACTURER.contains("HUAWEI") fun isHeifFile(filePath: String) = filePath.endsWith(".heif", true) filePath.endsWith("heic", true) fun decodeHeifDrawable(filePath: String): Drawable? { if (!supportHeif()) { return null } var source: ImageDecoder.Source = ImageDecoder.createSource(File(filePath)) return ImageDecoder.decodeDrawable(source) } ● HEIF 格式⽬目前使⽤用困难点: ➢ 兼容性问题,如何兼容不不⽀支持 HEIF 解码 的⼿手机; ➢ 由于专利利问题,可能不不是所有的⼿手机都能 够⽀支持 HEIF 格式硬编码; 20
22. ImageDecoder 类使⽤用初探 var source: ImageDecoder.Source = ImageDecoder.createSource(File(filePath)) var drawable = ImageDecoder.decodeDrawable(source) { decoder, info, src -> decoder.setTargetSampleSize(2) decoder.setPostProcessor { canvas -> val path = Path() path.fillType = Path.FillType.INVERSE_EVEN_ODD val width = canvas.width val height = canvas.height path.addRoundRect(0F, 0F, width.toFloat(), height.toFloat(), 20F, 20F, Path.Direction.CW) val paint = Paint() paint.isAntiAlias = true paint.color = Color.TRANSPARENT paint.xfermode = PorterDuffXfermode(PorterDuff.Mode.SRC) canvas.drawPath(path, paint) PixelFormat.TRANSLUCENT } decoder.setOnPartialImageListener • ImageDecoder实⽤用功能: ➢ 切圆⻆角; ➢ 设置采样率; ➢ 设置解码图⽚片出现错误的处理理⽅方式; { e: ImageDecoder.DecodeException -> true } } 21
23. 分享总结 22
24. 分享总结 ● Android P ⾏行行为变更更适配 ➢ 全⾯面屏适配以及检测; ➢ ⾮非SDK API 详解; ➢ 电源管理理改进 ➢ 其余适配 ● Android P 新特性 ➢ HEIF 格式图⽚片介绍和⽀支持; ➢ ImageDecoer 新特性初探; 23