故障排除 - Java SDK
在此页面上
无法加载“librealm-jni.so”
如果您的应用使用的原生库不支持 64 位架构,Android 将无法在 ARM64 设备上加载 Realm 的 librealm-jni.so
文件。 发生这种情况是因为 Android 无法同时加载 32 位和 64 位原生库。 理想情况下,所有库都可以提供相同的一组受支持的 ABI,但有时在使用第 3 方库时这可能无法实现。
要临时解决此问题,您可以通过将以下代码添加到应用程序的build.gradle
来从 APK 文件中排除 Realm 的 ARM64 库。 有关详细信息,请参阅在 Android 中混合 32 位和 64 位依赖项。
android { //... packagingOptions { exclude "lib/arm64-v8a/librealm-jni.so" } //... }
对 Mixpanel 的网络调用
当您对源代码运行 Realm 字节码转换器时,Realm 会收集匿名分析。 这是完全匿名的,可通过标记以下内容来帮助我们改进产品:
您使用的是哪个版本的 SDK
您使用的操作系统
如果您的应用程序使用 Kotlin
如果您的应用程序使用仅限本地的 Realm 或 Sync
当您的应用程序在用户设备上运行时,分析不会运行 - 仅当您编译源代码时才运行。 要选择退出分析,可以将REALM_DISABLE_ANALYTICS
环境变量设置为true
。
在 SDK 版本低于 10.5.1 的 Android 12 中更改侦听器
由于 Linux 内核的更改,在运行某些早期版本的 Android 12 的设备上,对象、collection和域 通知在低于 10.5.1 的 SDK 版本中不起作用。
此更改会影响以5.5
开头的 Linux 内核版本。 Linux 内核版本5.14-rc4
修复了该问题。 此修复程序也已向后移植到LTS 5.10.56
和LTS 5.13.8
。 所有主线和 LTS Android 12 分支都包含修复程序或向后移植。
如果遇到此问题,可以通过以下修复来恢复通知功能:
升级到高于 10.5.1 的 SDK 版本。
升级到使用包含此修复程序(内核提交
3a34b13a88caeb2800ab44a4918f230041b37dd9
)或此修复程序向后移植(内核提交4b20d2de0b367bca627b49efd8d2e9e01bb66753
)的 Linux 内核版本的 Android 12 版本。
用于打开同一文件的配置不能不同
每当您打开域文件时, Realm都会运行检查以避免损坏。 为了避免意外打开设置不兼容的域文件,SDK 使用 Java 的equals()
方法来比较RealmConfiguration
对象。 这可以防止 SDK 打开具有不同模式、持久性级别或可写性设置的单个域文件。 但是,包含Lambda函数的配置(例如传递给initialData()和compactOnLaunch()的函数)可能会破坏此 equals()
比较,因为使用Java的内置比较永远不会将两个不同的 lambda 视为相等。 要避免在使用 lambda 时出现此错误,您可以执行以下任一操作:
在应用程序中静态存储单个配置,以便单独的 Realm
RealmConfiguration
实例使用完全相同的对象,并通过检查。覆盖
RealmConfiguration
的默认等于检查:val config = RealmConfiguration.Builder() .initialData(object: Realm.Transaction { override fun execute(realm: Realm) { TODO("Not yet implemented") } override fun equals(other: Any?): Boolean { return true } override fun hashCode(): Int { return 37 } }).build()
构建期间的 Kapt 异常
如果您在使用 Kapt 库时遇到异常,且异常描述如下:
A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction
这很可能意味着您的一个模型类存在问题。 可能的原因包括:
引入 SDK 不支持的字段类型
对 Realm 对象模型类使用
open
或public
以外的可见性类型在不兼容的字段上使用 Realm 注解
如果遇到此错误,请检查最近对模式的更新是否存在问题。
安装尺寸
一旦您的应用程序构建为发布并分割为分发后,在大多数情况下,SDK 应该只会为您的 APK 增加约 800KB。 这些版本的容量要大得多,因为它们支持更多架构,例如 ARM7、ARMv7、ARM64、x86 和 MIPS。 APK 文件包含所有支持的架构,但 Android 安装程序仅安装设备架构的原生代码。 这意味着安装的应用小于 APK 文件的大小。
您可以通过将 APK 拆分为每个架构的版本来减小 Android APK 本身的大小。 通过将以下内容添加到build.gradle
来使用 Android 构建工具 ABI 分割支持:
android { splits { abi { enable true reset() include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64' } } }
选择要包含的架构,为每个架构构建单独的 APK。
如果不想处理多个 APK,可以限制单个 APK 支持的架构数量。 为此,请在abiFilters
中添加build.gradle
:
android { defaultConfig { ndk { abiFilters 'armeabi-v7a', 'arm64-v8a', 'mips', 'x86', 'x86_64' } } }
自定义由 Realm Gradle 插件定义的依赖项
Realm 使用 Gradle 插件,因为它可以更轻松地设置大量依赖项。 不幸的是,这也使得忽略特定的传递依赖变得更加困难。
如果您想要自定义 Realm 超出插件公开的范围,您可以手动设置所有依赖项并忽略 Gradle 插件。 以下示例演示了如何使用 Kotlin 手动为 Android 应用程序设置 SDK:
buildscript { ext.kotlin_version = '1.5.21' ext.realm_version = '10.18.0' repositories { jcenter() mavenCentral() } dependencies { classpath "io.realm:realm-transformer:$realm_version" classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-kapt' import io.realm.transformer.RealmTransformer android.registerTransform(new RealmTransformer(project)) dependencies { api "io.realm:realm-annotations:$realm_version" api "io.realm:realm-android-library:$realm_version" api "io.realm:realm-android-kotlin-extensions:$realm_version" kapt "io.realm:realm-annotations-processor:$realm_version" }