天天看點

解決高德地圖開啟混淆後release不顯示Marker

我使用了地圖與定位SDK,奇怪的是我已經按照高德文檔添加了混淆配置如下:

#3D 地圖 V5.0.0之後:
	-keep   class com.amap.api.maps.**{*;} 
	-keep   class com.autonavi.**{*;} 
	-keep   class com.amap.api.trace.**{*;}

	 #定位
	-keep class com.amap.api.location.**{*;}
	-keep class com.amap.api.fence.**{*;}
	-keep class com.autonavi.aps.amapapi.model.**{*;}
           

APP在運作時,定位與地圖功能都是正常的,唯獨Marker顯示不出來,Log顯示如下:

java.lang.NullPointerException: Attempt to read from field 'boolean h.a.a.a.a.t9.i' on a null object reference
           

我以為是混淆了這個 h.a.a.a.a.t9導緻的,通過mapping檔案我找到它混淆前的類:

com.amap.api.mapcore.util.x -> h.a.a.a.a.t9:
           

在忽略了這個util包下所有的類不參與混淆後。release後又報出如下錯誤,這不是上一個錯誤的翻版嗎??

java.lang.NullPointerException: Attempt to invoke virtual method 'boolean com.amap.api.mapcore.util.x.a()' on a null object reference
           

還有其他兩個錯誤,無非就是空指針,差不多類似上面這個錯誤。我按照異常的資訊看了高德SDK對應的源碼,非空判斷都做了,是不可能報這個異常的。而且debug版本沒有任何異常。下面說解決辦法

解決

既然源碼沒有問題,混淆也忽略了,為什麼還是不能用呢,考慮到是某些混淆指令導緻的,因為ProGuard有代碼優化的功能。可能代碼和資源優化後導緻的空指針,遂在ProGuard的官網文檔中找了一些看似有用的指令,最後解決指令如下:

#指定不優化輸入類檔案。預設情況下,ProGuard會優化所有代碼。它内聯并合并類和類成員,并在位元組碼級别優化所有方法。
-dontoptimize
           

關閉優化後問題解決了,release後Marker可以正常顯示,我反編譯了前後者的Apk,大概差異在于前者的可讀性會更差一些,雖然解決了問題,但是帶來的問題就是代碼的可讀性好了那麼一丢丢,這是我們不想要的,第二就是apk大概會大幾百kb。

如果可以定位到更細一點就好了