高德地图页面关闭时ANR
问题描述:
gradle4.1.0打包开启混淆后,TextureMapView、TextureMapFragment、TextureSupportMapFragment 三种容器,在页面关闭进行回收时,会耗时阻塞UI数秒无法操作UI,将导致ANR异常的发生。
之前已经创建工单反馈过两次(其实gradle3.6.4以上即可复现),但是需要提供源代码,所以也没时间搞,现在提供高德地图的demo,可以打开提供的源代码直接复现。
复现步骤:
gradle4.1.0(3.6.4以上)-开启混淆-打包(release模式),
打包后安装-进入首页-显示地图(6中实现地图的方式)-选择TextureMapFragment-然后再返回上一页-此时app已经不能响应任何操作(继续操作将导致anr或者应用长时间卡死然后被系统重启)。
问题重点:
1.gradle4.1.0(3.6.4以上)
2.开启混淆
3.打包模式为release
4.使用TextureMapView、TextureMapFragment、TextureSupportMapFragment 三种容器,关闭页面时发生。
如果打包模式为debug,或者没开启混淆,或者打包的gradle环境是3.5.0,则均无法复现,请注意发生条件。
问题结论:
这个问题很早就发现了,但是给高德提工单他们需要我提供源码我没办法提供,又没时间单独写个demo去复现问题,只好先降级gradle版本或者换掉texturemap先避免异常,最近才有时间搞个demo去复现。后来高德也是将近两周的时间才给出答复,确定了原因所在。下面引用是高德工单回复的原文。
您好,久等了,这个问题目前有两个解法1.android build gradle tool 使用3.3版本。2.如果使用3.3以上的版本在gradle.properties文件中加上android.enableR8 = false 。
后来发现导航地图也会有同样的问题,并且实际验证后build.gradle版本是在3.4.0以上release模式会默认开启R8编译,导致TextureMap资源回收异常。
R8编译是比ProGuard 更加优秀的混淆技术,简单来说编译混淆速度更快,打出来的包更小。需要了解R8的可以看下这篇,作者介绍的比较详细(https://www.jianshu.com/p/fdadca8e2094)。
但是相对专为 Android 项目设计的 ProGuard 而言,R8 是一项不同的技术,因此压缩和优化可能会导致移除 ProGuard 可能没有的代码。所以,在高德上发生了。
解决方案:
注意下用到高德地图的项目,如果build.gradle版本配置3.4.0以上,并且使用的有导航地图或者TextureMap来展示加载地图的。需要主动关闭R8编译,在gradle.properties配置:
android.enableR8 = false
或者降级build.gradle版本(这个方案不能长久)