Android 接入支付宝在手机未安装支付宝客户端的情况下掉不起支付宝sdk的h5页面

Android 接入支付宝在手机未安装支付宝客户端的情况下掉不起支付宝sdk的h5页面

最近公司项目需要对接支付宝移动支付,按照支付宝开发文档一步步往项目中集成,一开始还是比较顺利的,因为测试手机上安装了支付宝客户端,当我把支付宝卸载后,问题出现了,因为支付宝sdk本身就进行了客户端是否安装的判断,安装了会呼起支付宝客户端,未安装会调用内置的H5支付界面。现在H5界面无法呼起了!!!然后一步步核对开发文档,是否有遗漏或者没有配置的,发现并没有,这就尴尬了,然后就各种百度搜索,网上的原因大多是在AndroidManifest中配置H5PayActivity,我配置了,混淆规则也按照要求配置了,然而就是不行啊。始终报错

{memo=系统繁忙,请稍后再试, result=, resultStatus=4000}

网上搜了一大堆没用的后,自己测试了后定位到应该是 没有HTTPClient 这个类

HttpClient

HttpClient 早期Android 程序员都封装过多网络请求库。在Android 6.0 后,google就取消了对Apache HTTP的支持。以后,相继出现了HttpUrlConnect 、okhttp .
Apache HTTP 客户端弃用影响采用非标准 ClassLoader 的应用其实,自 Android 6 发布,就移除了对 Apache HTTP 客户端的支持,而推荐改用 HttpURLConnection 类,因为它可以通过透明压缩和响应缓存减少网络使用,并可最大限度降低耗电量, 从此我们变习惯这样使用 Apache HTTP API,即在 build.geadle 添加:


android {
    useLibrary 'org.apache.http.legacy'
}

就可以继续的使用httpClient。但是在9.0后,默认情况下该内容库已从 bootclasspath 中移除且不可用于应用。

androd P 开始,默认情况下该内容库已从 bootclasspath 中移除且不可用于应用。
这句话怎么理解,也就是说默认 Apache HTTP API 不可用,即使在build.geadle申明了该库。
这种说法分两种情况: 运行在 android P 设备上的应用:

9.0上如何继续使用httpClient

Target 28 ,默认会报 NoClassDefFoundError,因为此库被禁止使用,要继续使用 Apache HTTP 客户端,以 Android 9 及更高版本为目标的应用可以向其 AndroidManifest.xml 添加以下内容:

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

Target < 28 可以和 android 6.0 一致。bootclasspath 是 linux 系统变量,是系统在启动时会预先加载的类,以提高系统性能,这是 小米 MIX(7.0)上的 bootclasspath 变量:

/system/bin/sh: /system/framework/core-oj.jar:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/apache-xml.jar:/system/framework/org.apache.http.legacy.boot.jar:/system/framework/vivo-framework.jar:/system/framework/tcmiface.jar:/system/framework/telephony-ext.jar:/system/framework/vivo-media.jar:/system/framework/qcrilhook.jar:/system/framework/WfdCommon.jar:/system/framework/com.qti.location.sdk.jar:/system/framework/oem-services.jar:/system/framework/qcom.fmradio.jar: not found

变量中有:/system/framework/org.apache.http.legacy.boot.jar ,因此系统会帮我们加载,默认允许使用。
这是 android P 上的 bootclasspath 变量:

/system/framework/core-oj.jar:/system/framework/core-libart.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/bouncycastle.jar:/system/framework/apache-xml.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/ims-common.jar:/system/framework/android.hidl.base-V1.0-java.jar:/system/framework/android.hidl.manager-V1.0-java.jar:/system/framework/framework-oahl-backward-compatibility.jar:/system/framework/android.test.base.jar
generic_x86_64:/ $ 

是没有 apache 的 http 库的, 但是 他们有一个共同特点,就是系统内置了 apache 包, 在 /system/framework/目录下:

在这里插入图片描述

,但是我有一个困惑的地方,就是 同样 是运行在 android P 设备上 和 运行在 低版本上(>M) DexPathList 值确不一样:

android P :

PathClassLoader// 这是httpClient的 ClassLoader
DexPathList[[zip file “/system/framework/org.apache.http.legacy.boot.jar”,
zip file “/data/app/com.example.leixiang.demoapp-hOOUC7E0LuRvgmYC38vd5w==/base.apk”
],nativeLibraryDirectories=[/data/app/com.example.leixiang.demoapp-hOOUC7E0LuRvgmYC38vd5w==/lib/x86_64, /system/lib64]]

android N:

dalvik.system.PathClassLoader //这是httpClient的 ClassLoader
[DexPathList[[zip file “/data/app/com.example.leixiang.demoapp-1/base.apk”
],nativeLibraryDirectories=[/data/app/com.example.leixiang.demoapp-1/lib/arm64, /system/lib64, /vendor/lib64]]]

他们不同之处在于,android N 设备上的 DexPathList里面多了 apache的包,但是他们的加载器却都还是 PathClassLoader,我想可能是 P 系统上不再预先加载 apache http 相关类,所以把他加入 DexPathList? , 并且 P 之前的系统加载 bootclasspath 中类也是用的PathClassLoader?这个有待研究。

总结

支付宝sdk调用其h5PAyActivity需要 HTTPClient类的支持,希望入坑的朋友注意下

发布了122 篇原创文章 · 获赞 30 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/qijingwang/article/details/102739536