Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /
Prueba y depuración

Resolución de problemas - Java SDK

Si su aplicación usa bibliotecas nativas que no son compatibles con arquitecturas de 64bits, Android no podrá cargar Realm. librealm-jni.so Archivo en64 dispositivos ARM. Esto ocurre porque Android no puede cargar 32 64bibliotecas nativas de y bits simultáneamente. Idealmente, todas las bibliotecas podrían proporcionar el mismo conjunto de ABI compatibles, pero a veces esto no es posible al usar una 3biblioteca de terceros.

Para solucionar este problema, puedes excluir la biblioteca ARM64 de Realm del archivo APK añadiendo el siguiente código al build.gradle de la aplicación. Consulta "Combinar dependencias de 32 y 64 bits en Android" para obtener más información.

android {
//...
packagingOptions {
exclude "lib/arm64-v8a/librealm-jni.so"
}
//...
}

Tip

Para más información, consulte Combinación de dependencias de 32y 64bits en Android.

Realm collects anonymous analytics when you run the Realm bytecode transformer on your source code. This is completely anonymous and helps us improve the product by flagging:

  • which version of the SDK you use

  • which operating system you use

  • si tu aplicación usa Kotlin

  • Si su aplicación utiliza Realm o Sync solo local

Analytics do not run when your application runs on user devices - only when you compile your source code. To opt out of analytics, you can set the REALM_DISABLE_ANALYTICS environment variable to true.

Debido a un cambio en el kernel de Linux, notificaciones de objetos, colecciones y realm no funcionan en las versiones del SDK inferiores a la 10.5.1 en dispositivos que ejecutan ciertas versiones tempranas de Android 12.

Este cambio afecta a las versiones del kernel de Linux que empiezan por 5.5. La versión 5.14-rc4 del kernel de Linux solucionó el problema. La corrección también se incorporó a LTS 5.10.56 y LTS 5.13.8. Todas las ramas principales y LTS de Android 12 contienen la corrección o una versión retroactiva de esta.

Si experimenta este problema, puede restaurar la funcionalidad de notificación con las siguientes correcciones:

  • upgrade to a version of the SDK later than 10.5.1.

  • upgrade to a version of Android 12 that uses a Linux kernel release that contains the fix (kernel commit 3a34b13a88caeb2800ab44a4918f230041b37dd9) or the backport of the fix (kernel commit 4b20d2de0b367bca627b49efd8d2e9e01bb66753).

Realm ejecuta comprobaciones al abrir un archivo realm para evitar la corrupción. Para evitar abrir accidentalmente un archivo realm con configuraciones incompatibles, el SDK utiliza el equals() método de Java para comparar RealmConfiguration objetos. Esto evita que el SDK abra un mismo archivo realm con diferentes esquemas, niveles de durabilidad o configuraciones de escritura. Sin embargo, las configuraciones que incluyen funciones lambda, como las que se pasan a initialData() y compactOnLaunch(), pueden interrumpir esta equals() comparación, ya que dos lambdas diferentes nunca se consideran iguales mediante la comparación integrada de Java. Para evitar este error al usar lambdas, puede:

  1. Store a single configuration statically in your application, so that separate realm instances use the exact same RealmConfiguration object and it passes the check.

  2. Anular la comprobación de igualdad predeterminada de 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()

Si experimenta una excepción en la biblioteca Kapt con una descripción como la siguiente:

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

This most likely means there is an issue with one of your model classes. Possible causes include:

  • introducing a field type that is not supported by the SDK

  • usando un tipo de visibilidad diferente a open o public para una clase de modelo de objeto de Realm

  • usando una anotación de Realm en un campo incompatible

Si experimentas este error, revisa cualquier actualización reciente de tu esquema en busca de problemas.

Una vez que tu aplicación se compile para la publicación y se divida para su distribución, el SDK solo debería agregar alrededor de 800KB a tu APK en la mayoría de los casos. Las versiones publicadas son significativamente más grandes porque incluyen soporte para más arquitecturas, como ARM7, ARMv7, ARM64, x86 y MIPS. El archivo APK contiene todos los arquitecturas compatibles, pero el instalador de Android solo instala código nativo para la arquitectura del dispositivo. Esto significa que la aplicación instalada es más pequeña que el tamaño del archivo APK.

You can reduce the size of the Android APK itself by splitting the APK into a version for each architecture. Use the Android Build Tool ABI Split support by adding the following to your build.gradle:

android {
splits {
abi {
enable true
reset()
include 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
}
}
}

Select the architectures that you'd like to include to build a separate APK for each.

Tip

Consulta la documentación de Android Tools sobre ABI Splits para obtener más información o el ejemplo en GitHub.

If you don't want to handle multiple APKs, you can restrict the number of architectures supported in a single APK. This is done by adding abiFilters to your build.gradle:

android {
defaultConfig {
ndk {
abiFilters 'armeabi-v7a', 'arm64-v8a', 'mips', 'x86', 'x86_64'
}
}
}

Realm utiliza un plugin de Gradle porque facilita la configuración de un gran número de dependencias. Lamentablemente, esto también dificulta un poco ignorar dependencias transitivas específicas.

If you want to customize Realm beyond what is exposed by the plugin, you can manually set up all the dependencies and ignore the Gradle plugin. The following example demonstrates how to set up the SDK for an Android application using Kotlin manually:

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"
}

Volver

Pruebas

En esta página