解决高德地图开启混淆后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。

如果可以定位到更细一点就好了

你可能感兴趣的:(Android)