Menu Docs

Página inicial do DocsDesenvolver aplicaçõesAtlas Device SDKs

Solução de problemas - SDK Java

Nesta página

  • Não foi possível carregar "librealm-jni.so"
  • Chamadas de rede para o Multipanel
  • Alterar ouvintes no Android 12 com versões do SDK abaixo de 10.5.1
  • As configurações não podem ser diferentes se usadas para abrir o mesmo arquivo
  • Exceções do Kapt durante compilações
  • Tamanho da instalação
  • Personalizar dependências definidas pelo plug-in Realm Gradle

Se o seu aplicativo utilizar bibliotecas nativas que não são fornecidas com suporte para arquiteturas de bits, o Android não conseguirá carregar o arquivo librealm-jni.so do Realm em dispositivos ARM64. Isso acontece porque o Android não pode carregar bibliotecas nativas de 32 bits e 64 bits simultaneamente. Idealmente, todas as bibliotecas poderiam fornecer o mesmo conjunto de ABIs suportadas, mas, às vezes, isso pode não ser possível ao usar uma biblioteca de terceiros.

Para contornar esse problema, você pode excluir a biblioteca ARM64 do Realm do arquivo API adicionando o seguinte código ao build.gradle do aplicativo. Você pode consultar Combinando dependências de 32 e 64 bits no Android para obter mais informações.

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

Dica

Veja também:

Para obter mais informações, consulte Combinando dependências 32- e 64bits no Android.

O Realm coleta análises anônimas quando você executa o conversor de bytecode do Realm em seu código-fonte. Isso é totalmente anônimo e nos ajuda a melhorar o produto sinalizando:

  • qual versão do SDK você usa

  • qual sistema operacional você usa

  • se o seu aplicativo usar o Kotlin

  • se o seu aplicativo usar Realm ou Sincronização somente local

As análises não são executadas quando seu aplicativo é executado nos dispositivos do usuário - somente quando você compila seu código-fonte. Para desativar a análise, você pode configurar a variável de ambiente do REALM_DISABLE_ANALYTICS para true.

Devido a uma alteração no kernel do Linux, as notificações de objetos, coleções e domínios não funcionam nas versões do SDK anteriores à 10.5.1 em dispositivos que executam determinadas versões anteriores do Android 12.

Esta alteração afeta as versões do kernel Linux começando com 5.5. A versão 5.14-rc4 do kernel Linux corrigiu o problema. A correção também foi portada para LTS 5.10.56 e LTS 5.13.8. Todas as ramificações principais e do LTS do Android 12 contêm a correção ou um backport dela.

Se você enfrentar esse problema, poderá restaurar a funcionalidade de notificação com as seguintes correções:

  • atualize para uma versão do SDK posterior à 10.5.1.

  • atualize para uma versão do Android 12 que usa uma versão do kernel Linux que contém a correção (kernel commit 3a34b13a88caeb2800ab44a4918f230041b37dd9) ou o backport da correção (kernel commit 4b20d2de0b367bca627b49efd8d2e9e01bb66753).

O Realm executa verificações sempre que você abre um arquivo de Realm para evitar corrupção. Para evitar a abertura acidental de um arquivo de domínio com configurações incompatíveis, o SDK usa o método equals() do Java para comparar objetos RealmConfiguration . Isso impede que o SDK abra um único arquivo de domínio com diferentes esquemas, níveis de durabilidade ou configurações de escrita. No entanto, as configurações que incluem funções lambda, como as passadas para initialData() e compactOnLaunch(), podem quebrar essa comparação equals() , já que duas lambdas diferentes nunca são consideradas iguais usando a comparação integrada do Java. Para evitar esse erro ao usar lambdas, você pode:

  1. Armazene uma única configuração estaticamente em seu aplicativo, para que instâncias de domínio separadas usem exatamente o mesmo objeto RealmConfiguration e ele passe na verificação.

  2. Substitui a verificação de igualdade padrão do 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()

Se você enfrentar uma exceção na biblioteca Kapt com uma descrição como a seguinte:

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

Isso provavelmente significa que há um problema com uma das suas classes de modelo. As possíveis causas incluem:

  • introduzir um tipo de campo que não é suportado pelo SDK

  • usando um tipo de visibilidade diferente de open ou public para uma classe de modelo de Objeto de Realm

  • usando uma anotação de Realm em um campo incompatível

Se você enfrentar esse erro, verifique se há problemas nas atualizações recentes do seu esquema.

Depois que seu aplicativo for criado para lançamento e divisão para distribuição, o SDK deverá adicionar apenas cerca de 800 KB ao seu API, na maioria dos casos. As versões são significativamente maiores porque incluem suporte para mais arquiteturas, como ARM7, ARMv7, ARM64, x86 e MIPS. O arquivo API contém todas as arquiteturas suportadas, mas o instalador do Android instala apenas o código nativo para a arquitetura do dispositivo. Isso significa que o aplicativo instalado é menor que o tamanho do arquivo API.

Você pode reduzir o tamanho do próprio API do Android dividindo-o em uma versão para cada arquitetura. Use o suporte da divisão ABI da Ferramenta de construção Android adicionando o seguinte ao seu build.gradle:

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

Selecione as arquiteturas que você deseja incluir para criar um API separado para cada uma.

Dica

Veja também:

Se não quiser lidar com vários APIs, você pode restringir o número de arquiteturas suportadas em um único API. Isso é feito adicionando abiFilters ao seu build.gradle:

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

O Realm usa um plug-in Gradle porque facilita a configuração de um grande número de dependências. Infelizmente, isso também torna um pouco mais difícil ignorar dependências transitivas específicas.

Se quiser personalizar o Realm além do que é exposto pelo plugin, você poderá configurar manualmente todas as dependências e ignorar o plugin Gradle. O exemplo a seguir demonstra como configurar o SDK para um aplicativo Android usando o Kotlin manualmente:

buildscript {
ext.kotlin_version = '1.5.21'
ext.realm_version = '10.11.1'
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"
}
← Teste - SDK Java