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 32y 64bits 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 recopila análisis anónimos cuando ejecuta el transformador de bytecode de Realm en su código fuente. Esto es completamente anónimo y nos ayuda a mejorar el producto al señalar:

  • ¿Qué versión del SDK utilizas?

  • ¿Qué sistema operativo utilizas?

  • si tu aplicación usa Kotlin

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

Las analíticas no se ejecutan cuando la aplicación se ejecuta en los dispositivos de los usuarios, solo al compilar el código fuente. Para desactivar las analíticas, puede configurar la variable de entorno REALM_DISABLE_ANALYTICS en true.

Debido a un cambio en el kernel de Linux, lasnotificaciones de objetos, colecciones y reinos no funcionan en versiones del SDK anteriores 10.5.1 a en dispositivos que ejecutan ciertas versiones anteriores 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 la misma.

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

  • actualizar a una versión del SDK posterior a 10.5.1.

  • actualizar a una versión de Android 12 que use una versión del kernel de Linux que contenga la corrección (confirmación del kernel 3a34b13a88caeb2800ab44a4918f230041b37dd9) o la versión retroactiva de la corrección (confirmación del kernel 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. Almacene una única configuración de forma estática en su aplicación, de modo que las instancias de reino separadas usen exactamente el mismo objeto RealmConfiguration y pase la verificación.

  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

Lo más probable es que esto signifique que hay un problema con alguna de las clases de tu modelo. Las posibles causas incluyen:

  • Introducir un tipo de campo que no es compatible con el SDK

  • usar un tipo de visibilidad distinto de open o public para una clase de modelo de objeto de reino

  • 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.

Puedes reducir el tamaño del APK de Android dividiéndolo en una versión para cada arquitectura. Usa la compatibilidad con ABI Split de Android Build Tool añadiendo lo siguiente a tu build.gradle:

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

Seleccione las arquitecturas que desea incluir para crear un APK separado para cada una.

Tip

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

Si no desea gestionar varios APK, puede restringir el número de arquitecturas compatibles con un solo APK. Para ello, añada abiFilters a su build.gradle:

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

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

Si desea personalizar Realm más allá de lo expuesto por el complemento, puede configurar manualmente todas las dependencias e ignorar el complemento de Gradle. El siguiente ejemplo muestra cómo configurar manualmente el SDK para una aplicación Android con Kotlin:

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