Realm遇到的关于so导致闪退问题

一、简单介绍Realm

        在我们开发App时,有些时候需要我们本地保存数据,而我们保存本地数据的方式有文件保存(file)、Sqilite轻量级数据库、SharedPreferences(XML文件形式)等选择,虽说都能用于保存本地数据,但他们有各自的适应性,在某些方面各有差异。对于有大量复杂查询的数据保存,我们一般会选用Sqlite的方式,但其原始的使用略复杂,代码量较大,因此有一些基于Sqlite的优秀开源关系数据库框架可用,如GreenDao,ActivieAndroid等。

        那Realm是什么呢?Realm是一种不同于Sqlite的轻量级关系数据库,具有很多现在数据库的特性,基本满足功能开发的需要,而且在速度上要优于Sqlite,是一个不错的选择。有新的东西,当然要试着用用。

二、导入Realm框架

框架的导入这一部分就不写了,github框架首页或百度都能找到。

三、遇到的问题

大部分手机正常初始化,部分手机提示出现闪退现象,提示  librealm-jni.so  该文件  is 32-bit instead of 64-bit   的错误,导致Realm在Application 文件中初始化时异常导致应用闪退。

看到是so文件的字样,以及后面的32位和64位的错误xi信息字样,基本就可以定位到jniLibs文件夹中的文件导入有问题,可是Realm的导入操作中,根本不需要复制添加文件啊,都是自动导入的。以前遇到过类似问题,armeabi、armeabi、armeabi64-v8a等文件,由于相应的文件夹存在,导致xian相应的CPU架构的APK会在相应的文件夹中加载so文件。

查了查文件夹对应的架构,删掉了armeabi64-v8a尝试,然而还是失败。随后通过百度,找到了一个解决方案,就是在打包默认配置里加上(app.gradle文件中)

android { 
//… 
packagingOptions { 
exclude “lib/arm64-v8a/librealm-jni.so”     即过滤掉arm64-v8a中的librealm-jni.so文件

//… 

然后运行成功了,当我以为问题解决时,原来可以运行的64位手机又不能运行了,返回的还是librealm-jni.so文件的错误,但错误信息确反过来了is 64-bit instead of 32-bit ,这真是折腾。。。。

最后查看了关于so导入的相关资料,可以知道,64位的可以兼容32位的,因此我们只要保持32位的架构支持就OK了,虽然这样会对一些64位的手机产生性能影响,但为了兼容性,实在是没办法,毕竟性能的追求应该基于没毛病。

所以最终的解决方案是:

defalutConfig{

ndk{
    abiFilters("armeabi", "armeabi-v7a")    //除了armeabi、armeabi-v7a的文件,其它都过滤掉
}

}

希望对遇到同样问题的朋友有帮助。

猜你喜欢

转载自blog.csdn.net/chen_courage/article/details/81168791
今日推荐