前言
根据之前开发的案例来看,原生WebView存在着很多的不完善,面临开发使用WebView时,通常会使用腾讯X5内核;但是腾讯X5内核也有一些不完善的地方,只是相比原生WebView会好一些,那么关于X5接入会遇到那些坑,该如何解决呢,本文将讲述自己接入X5内核时遇到的问题及解决方法。
问题1,选择图片问题
问题2,视频横屏全屏的问题
在查找资料的时候看到别人写的blog讲得还可以,所以请移步查看。
自己遇到的问题通常是问题3:“64位手机无法加载x5”
x5内核暂时不提供64位的so文件,在64位手机上需要让AP以32位模式运行。具体操作如下(官网问题单地址:https://x5.tencent.com/tbs/technical.html#/detail/sdk/1/34cf1488-7dc2-41ca-a77f-0014112bcab7):
x5内核暂时不提供64位的so文件,在64位手机上需要让AP以32位模式运行。具体操作如下:
1.如果使用是Eclipse则需要将所有的.so文件都放置在so加载目录:lib/armeabi文件夹下(没有该目录则新建一个,AP中没有使用到.so文件则需要拷贝任意一个32位的so文件到该目录下,如果没有合适的so可以到官网(http://x5.tencent.com/tbs/sdk.html) 下载官网“SDK接入示例“,拷贝对应目录下的liblbs.so文件),lib文件夹下不要有其他以”armeabi“开头的文件夹。
2.如果使用的是 Android studio则需要进行两项配置,
(1)打开对应module中的build.gradle文件,在文件的android{}中的defaultConfig{}里(如果没有defaultConfig{}则手动添加)添加如下配置: ndk{abiFilters "armeabi", "armeabi-v7a", "x86", "mips"},如果配置后编译报错,那么需要在gradle.properties文件中加上Android.useDeprecatedNdk=true;
(2)找出build.gradle中配置的so加载目录:jniLibs.srcDir:customerDir,如果没有该项配置则so加载目录默认为:src/main/jniLibs,需要将.so文件都放置在so加载目录的armeabi文件夹下(没有该目录则新建一个,AP中没有使用到.so文件则需要拷贝任意一个32位的so文件到该目录下,如果没有合适的so可以到官网http://x5.tencent.com/tbs/sdk.html下载官网“SDK接入示例“,拷贝对应目录下的liblbs.so文件),so加载目录下不要有其他以”armeabi“开头的文件夹。
而这里我们需要知道相关ABI的知识:
我们都知道引入so库的时候需要在项目的build.gradle文件中配置ndk{abiFilters "armeabi", "armeabi-v7a", "x86", "mips"}这样的代码,但是具体的意义是什么呢?
下面了解几个问题
1、ABI 是 Application Binary Interface 的缩写。不同 Android 手机使用不同的 CPU,因此支持不同的指令集。我们必须为应用要使用的每个 CPU 架构指定 ABI。
支持的 ABI:
ABI | 支持的指令集 | 说明 |
---|---|---|
armeabi |
* ARMV5TE 和更高版本* Thumb-1 | 无硬浮点。 |
armeabi-v7a |
* armeabi* Thumb-2* VFPv3-D16* 其他(可选) | 与 ARMv5、v6 设备不兼容。 |
arm64-v8a |
* AArch-64 | |
x86 |
* x86 (IA-32)* MMX* SSE/2/3* SSSE3 | 不支持 MOVBE 或 SSE4。 |
x86_64 |
* x86-64* MMX* SSE/2/3* SSSE3* SSE4.1、4.2* POPCNT | |
mips |
* MIPS32r1 及更高版本 | 使用硬浮点,并且假设 CPU:FPU 时钟比率为 2:1 以获取最大兼容性。 不提供 micromips 或 MIPS16。 |
mips64 |
* MIPS64r6 |
armeabi是针对所有的arm cpu,只要支持arm的指令集就可以,
v7a,v8a是针对arm后来出的指令集版本制定的cpu如符合arm7指令集的cpu
armeabi-v7a是针对有浮点运算或高级扩展功能的arm v7 cpu。
armeabi-v7a(32位ARM设备),
arm64-v8a(64位ARM设备)
如果在匹配到的目录下没有对应的库也不会去别的目录下加载;但是armeabi目录可以匹配所有的arm架构的cpu。
armeabi与armeabi-v7a的区别 (转载自armeabi与armeabi-v7a的区别)
1、手机cpu架构。
讲到armeabi就不得不讲手机cpu了。电脑有电脑的cpu,手机也有手机的cpu。cpu有厂商属性,也有架构属性,架构的话自己简单地理解就是它的内部模块的组成结构。
其中arm架构的手机cpu占市场的大部分,这也是今天的重点。但arm架构的发展历史悠久,也有很多不同的版本。
2、前面讲了cpu架构,为下面的讲述做了一个技术背景的铺垫。
我们在开发Android项目的时候,比如使用高德地图导航或者3d地图的时候就会使用到.so库文件,它们保存在armeabi和armeabi-v7a或arm64-v8a等目录下,这有什么作用呢?
其实这是给app运行时读取的几个目录,但会根据手机cpu架构类型只从其中一个文件夹读取,有点类似values和values-21的作用,但是与它们又有点不同。
后者的规则是:如果手机是21以上的会首先在values-21文件里面查找样式等,如果查找不到才去values文件找;如果手机是21以下的就直接在values文件下找。
前者的规则是:根据cpu架构类型去app的libs里面匹配到对应的目录比如armeabi或者armeabi-v7a,然后就加载这个目录下的.so库;
如果在匹配到的目录下没有对应的库也不会去别的目录下加载;
但是armeabi目录可以匹配所有的arm架构的cpu,意思是指所有的arm架构的cpu的安卓手机如果没有找到最优的对应的目录,则会去匹配armeabi目录。
我的推测是arm架构的cpu是向下兼容的,即保留之前版本的功能,而armeabi目录是匹配低版本armv5的,所以高版本的arm架构的cpu可以读取armeabi目录下的.so库文件;查过资料会发现低版本的arm架构cpu支持软浮点运算而高版本的支持硬件浮点运算,这是他们的区别之一。
3、最近在开发高德导航功能,官方文档提示此功能不支持armeabi-v7a,根据以上的讲述:导航功能并没有为armeabi-v7a对应的cpu设计一套.so库文件,所以只能使用armeabi目录下的库文件,所以要删掉armeabi-v7a目录。