NativeLibCompression是一个压缩SO库的第三方工具,还是很好用的,确实是能压缩到50%的大小,想了解的可https://github.com/liyuming1978/NativeLibCompression 瞧一瞧。最近使用NativeLibCompression来压缩自己的SO库,遇到一些蛋疼的坑,在此记录一下,以免下次遇到同样的问题。
1.签名问题。
我在用eclipse打包apk时,已经使用了android tools进行签名了,屁颠屁颠的以为使用NativeLibCompression压缩apk不再需要签名。后来在测试百度地图功能时,一直在提示未授权成功,纳闷了。忽然想到既然压缩了apk,那就解压看看两个apk直接有什么不同。结果发现被压缩的apk中缺少META-INF,这时候才恍然大悟啊。
结论:不管你事先有没有签名apk,在使用NativeLibCompression压缩时,一定要再次签名。附上压缩命令:
在apk的根路径下,输入java -jar ApkCompress.jar -a ./XXX.apk(XXX是apk的名字) -k ./key(名称+后缀) 密码 alias的密码 alias的名字
2.压缩后导致百度地图导航无法使用。
对于百度地图map类的api,不需要在解压完成后调用System.load(DecRawso.GetInstance().GetPath("BaiduMapSDK_base_v3_6_1"));之类的语句,而只需要在解压完成(何时解压完成可以参考NativeLibCompression的demo)后调用SDKInitializer.initialize(getApplicationContext());即可。但是对于导航来说,在解压完成后,初始化navigation之前,必须手动load导航相关的so,如下:
System.load(DecRawso.GetInstance().GetPath("app_BaiduNaviApplib"));
System.load(DecRawso.GetInstance().GetPath("app_BaiduVIlib"));
System.load(DecRawso.GetInstance().GetPath("bd_etts"));
System.load(DecRawso.GetInstance().GetPath("bds"));
System.load(DecRawso.GetInstance().GetPath("BDSpeechDecoder_V1"));
System.load(DecRawso.GetInstance().GetPath("curl"));
System.load(DecRawso.GetInstance().GetPath("gnustl_shared"));