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
Não foi possível carregar "librealm-jni.so"
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 de - e bits no Android.32 64
Chamadas de rede para o Multipanel
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
.
Alterar ouvintes no Android 12 com versões do SDK abaixo de 10.5.1
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 commit4b20d2de0b367bca627b49efd8d2e9e01bb66753
).
As configurações não podem ser diferentes se usadas para abrir o mesmo arquivo
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 Realm 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 Realm 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:
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.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()
Exceções do Kapt durante compilações
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
oupublic
para uma classe de modelo de Objeto de Realmusando 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.
Tamanho da instalação
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:
Consulte a documentação das ferramentas Android sobre divisões de ABI para obter mais informações, ou o exemplo no Github.
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' } } }
Personalizar dependências definidas pelo plug-in Realm Gradle
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.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" }