Docs 菜单
Docs 主页
/ /
Atlas Device SDKs
/ /

故障排除 - Java SDK

在此页面上

  • 无法加载“librealm-jni.so”
  • 对 Mixpanel 的网络调用
  • 在 SDK 版本低于 10.5.1 的 Android 12 中更改侦听器
  • 用于打开同一文件的配置不能不同
  • 构建期间的 Kapt 异常
  • 安装尺寸
  • 自定义由 Realm Gradle 插件定义的依赖项

如果您的应用使用的原生库不支持 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"
}
//...
}

提示

另请参阅:

有关详情,请参阅 在 Android 中混合使用 和 位依赖项。3264

当您对源代码运行 Realm 字节码转换器时,Realm 会收集匿名分析。 这是完全匿名的,可通过标记以下内容来帮助我们改进产品:

  • 您使用的是哪个版本的 SDK

  • 您使用的操作系统

  • 如果您的应用程序使用 Kotlin

  • 如果您的应用程序使用仅限本地的 Realm 或 Sync

当您的应用程序在用户设备上运行时,分析不会运行 - 仅当您编译源代码时才运行。 要选择退出分析,可以将REALM_DISABLE_ANALYTICS环境变量设置为true

由于 Linux 内核的更改,在运行某些早期版本的 Android 12 的设备上,对象、collection和域 通知在低于 10.5.1 的 SDK 版本中不起作用。

此更改会影响以5.5开头的 Linux 内核版本。 Linux 内核版本5.14-rc4修复了该问题。 此修复程序也已向后移植到LTS 5.10.56LTS 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 时出现此错误,您可以执行以下任一操作:

  1. 在应用程序中静态存储单个配置,以便单独的 RealmRealmConfiguration 实例使用完全相同的对象,并通过检查。

  2. 覆盖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 库时遇到异常,且异常描述如下:

A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction

这很可能意味着您的一个模型类存在问题。 可能的原因包括:

  • 引入 SDK 不支持的字段类型

  • 对 Realm 对象模型类使用openpublic以外的可见性类型

  • 在不兼容的字段上使用 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 插件。 以下示例演示了如何使用 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"
}

后退

测试