Abdroid M Apache httpclient Jar包混淆问题解决

        最近一段时间项目升级到M,由于项目中原有很多使用httpcleint 实现的逻辑,需要内apache的jar包进行兼容处理,在Gradle打包过程中遇到了各种问题,现在分享出来做个总结(呵呵,居然技术出差带厦门美图无聊就写点东西)。


    1、缺失Apache HttpClients 后的处理

    在最新的安卓M的Android SDK 中,其实是内置了一个作为过渡的httpclient jar包的,路径为SDK_HOME\platforms\android-23\optional\org.apache.http.legacy.jar,我们可以拿来用于编译。


    但是内部是空实现,千万不要拿着个jar包做实际的使用。猜测sdk的编译工具或者对端rom里的实现会覆盖掉这个空实现,达到兼容的目的。

QQ图片20151215143052.png

2、引入Apache HttpClients 包后的混淆处理

        由于上面说的机制,sdk编译时以及对端rom做了特殊的覆盖处理,所以我们要保持引入的httpclient jar包结构与原版完全相同,否则覆盖无从做起,使用了空实现的jar包,那么必然是会崩溃的。

# apache包

-keep public class android.support.annotation.**{*;}

-keep public class org.apache.commons.**{*;}

-keep public class org.apache.http.**{*;}

-keep public class android.net.compatibility.**{*;}

-keep public class android.net.http.**{*;}

-keep public class com.android.internal.http.multipart.**{*;}

使用上面的混淆你以为就好了,这才刚刚开始,你会发现,这个在Gradle构建中会与Proguard冲突,导致最终打包失败,报下面的错误

can not 计算 hash(就是这么任性,出差找不到原始错误了,反正就是这个意思)

3、混淆冲突的解决

经过无数种方法的尝试(包括各种修改proguard配置的方法),最终都不管用,全是这个错误,终于的终于,发现网上有关于Gradle 在构建Android M 包时引入Apache HttpClients Jar 包的方法,使用    useLibrary 'org.apache.http.legacy'就好了

blob.png

4、问题验证

为什么开头说是Gradle与Proguard的冲突导致的?上面第3步中Gradle脚本这么配置,同时需要在proguard.cfg中配置不混淆httpcleint才行,二者做其中一个也是不行的

5、其他

使用上面的步骤设置后,http的兼容完全没有问题了。好奇sdk实现替换的原理,解包后发现dex中并没有http的任何实现,感觉很困惑了,不知道编译时做了什么处理,应该是和Android.jar类似的吧,只作为编译时使用,实际的实现其实在对端rom。

已有1位网友发表了看法:

1L火蚁 2016-04-19 20:10:28 回复
同样遇到了打包apk的时候出现了奔溃,不过加上useLibrary 'org.apache.http.legacy'之后出现新的问题了,打包时提示org.apache.httpcomponents:httpclient:4.0.3 is ignored for micro DebugAndroidTest as it may be conflicting with the internal version provided by Android.

发表评论

必填

选填

选填

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。