問(wèn)題描述:
gradle4.1.0打包開啟混淆后,TextureMapView利赋、TextureMapFragment水评、TextureSupportMapFragment 三種容器,在頁(yè)面關(guān)閉進(jìn)行回收時(shí),會(huì)耗時(shí)阻塞UI數(shù)秒無(wú)法操作UI媚送,將導(dǎo)致ANR異常的發(fā)生中燥。
之前已經(jīng)創(chuàng)建工單反饋過(guò)兩次(其實(shí)gradle3.6.4以上即可復(fù)現(xiàn)),但是需要提供源代碼塘偎,所以也沒(méi)時(shí)間搞疗涉,現(xiàn)在提供高德地圖的demo,可以打開提供的源代碼直接復(fù)現(xiàn)吟秩。
復(fù)現(xiàn)步驟:
gradle4.1.0(3.6.4以上)-開啟混淆-打包(release模式)咱扣,
打包后安裝-進(jìn)入首頁(yè)-顯示地圖(6中實(shí)現(xiàn)地圖的方式)-選擇TextureMapFragment-然后再返回上一頁(yè)-此時(shí)app已經(jīng)不能響應(yīng)任何操作(繼續(xù)操作將導(dǎo)致anr或者應(yīng)用長(zhǎng)時(shí)間卡死然后被系統(tǒng)重啟)。
問(wèn)題重點(diǎn):
1.gradle4.1.0(3.6.4以上)
2.開啟混淆
3.打包模式為release
4.使用TextureMapView涵防、TextureMapFragment闹伪、TextureSupportMapFragment 三種容器,關(guān)閉頁(yè)面時(shí)發(fā)生壮池。
如果打包模式為debug偏瓤,或者沒(méi)開啟混淆,或者打包的gradle環(huán)境是3.5.0椰憋,則均無(wú)法復(fù)現(xiàn)厅克,請(qǐng)注意發(fā)生條件。
問(wèn)題結(jié)論:
這個(gè)問(wèn)題很早就發(fā)現(xiàn)了橙依,但是給高德提工單他們需要我提供源碼我沒(méi)辦法提供证舟,又沒(méi)時(shí)間單獨(dú)寫個(gè)demo去復(fù)現(xiàn)問(wèn)題硕旗,只好先降級(jí)gradle版本或者換掉texturemap先避免異常,最近才有時(shí)間搞個(gè)demo去復(fù)現(xiàn)褪储。后來(lái)高德也是將近兩周的時(shí)間才給出答復(fù)卵渴,確定了原因所在。下面引用是高德工單回復(fù)的原文鲤竹。
您好浪读,久等了,這個(gè)問(wèn)題目前有兩個(gè)解法1.android build gradle tool 使用3.3版本辛藻。2.如果使用3.3以上的版本在gradle.properties文件中加上android.enableR8 = false 碘橘。
后來(lái)發(fā)現(xiàn)導(dǎo)航地圖也會(huì)有同樣的問(wèn)題,并且實(shí)際驗(yàn)證后build.gradle版本是在3.4.0以上release模式會(huì)默認(rèn)開啟R8編譯吱肌,導(dǎo)致TextureMap資源回收異常痘拆。
R8編譯是比ProGuard 更加優(yōu)秀的混淆技術(shù),簡(jiǎn)單來(lái)說(shuō)編譯混淆速度更快氮墨,打出來(lái)的包更小纺蛆。需要了解R8的可以看下這篇,作者介紹的比較詳細(xì)(http://www.reibang.com/p/fdadca8e2094)规揪。
但是相對(duì)專為 Android 項(xiàng)目設(shè)計(jì)的 ProGuard 而言桥氏,R8 是一項(xiàng)不同的技術(shù),因此壓縮和優(yōu)化可能會(huì)導(dǎo)致移除 ProGuard 可能沒(méi)有的代碼猛铅。所以字支,在高德上發(fā)生了。
解決方案:
注意下用到高德地圖的項(xiàng)目奸忽,如果build.gradle版本配置3.4.0以上堕伪,并且使用的有導(dǎo)航地圖或者TextureMap來(lái)展示加載地圖的。需要主動(dòng)關(guān)閉R8編譯栗菜,在gradle.properties配置:
android.enableR8 = false
或者降級(jí)build.gradle版本(這個(gè)方案不能長(zhǎng)久)