Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

문제 해결 - Java SDK

이 페이지의 내용

  • 'librealm-jni.so'를 로드할 수 없습니다.
  • 혼합 패널에 대한 네트워크 호출
  • SDK 버전이 10.5.1 미만인 Android 12의 리스너 변경
  • 동일한 파일을 여는 데 사용되는 경우 구성이 다를 수 없음
  • 빌드 중 Kat 예외
  • 설치 크기
  • Realm Gradle 플러그인에서 정의한 종속성 사용자 지정하기

앱에서 64비트 아키텍처를 지원하지 않는 네이티브 라이브러리를 사용하는 경우 Android는 ARM64 기기에서 Realm의 librealm-jni.so 파일을 로드하지 못합니다. 이는 Android가 32비트와 64비트 네이티브 라이브러리를 동시에 로드할 수 없기 때문에 발생합니다. 이상적으로는 모든 라이브러리가 지원되는 동일한 ABI 세트를 제공할 수 있지만 타사 라이브러리를 사용하는 경우에는 이것이 불가능할 수도 있습니다.

이 문제를 해결하려면 애플리케이션의 build.gradle 에 다음 코드를 추가하여 Apk 파일에서 Realm의 ARM64 라이브러리를 제외할 수 있습니다. 자세한 내용은 Android에서 32비트 및 64비트 종속성 혼합을 참조하세요.

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

다음도 참조하세요.

자세한 내용은 32 64Android에서 및 비트 종속성 혼합을 참조하세요.

Realm은 소스 코드에서 Realm 바이트코드 변환기를 실행하면 익명 분석을 수집합니다. 이 작업은 완전히 익명으로 처리되며 다음과 같이 신고하여 제품을 개선하는 데 도움이 됩니다.

  • 사용하는 SDK 버전

  • 사용하는 운영 체제

  • 애플리케이션에서 Kotlin을 사용하는 경우

  • 애플리케이션이 로컬 전용 Realm 또는 동기화를 사용하는 경우

애플리케이션이 사용자 기기에서 실행될 때는 분석이 실행되지 않고, 소스 코드를 컴파일할 때만 실행됩니다. 분석을 사용하지 않으려면 REALM_DISABLE_ANALYTICS 환경 변수를 true 로 설정할 수 있습니다.

Linux 커널의 변경으로 인해, 특정 이전 버전의 Android 12를 실행하는 기기의 10.5.1 미만의 SDK 버전에서는 객체, collection 및 영역 알림 이 작동하지 않습니다.

이 변경 사항은 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가 스키마, 내구성 수준 또는 쓰기 가능성 설정이 다른 단일 영역 파일 을 열 수 없습니다. 그러나 initialData()compactOnLaunch() 에 전달된 것과 같은 Lambda 함수를 포함하는 구성은 Java의 내장 비교를 사용하여 두 개의 서로 다른 Lambda가 동일한 것으로 간주되지 않으므로 이 equals() 비교가 중단될 수 있습니다. Lambda를 사용할 때 이 오류를 방지하려면 다음 중 하나를 수행할 수 있습니다.

  1. 단일 구성을 애플리케이션에 정적으로 저장하여 별도의 Realm 인스턴스가 정확히 동일한 RealmConfiguration 객체를 사용하고 검사를 통과하도록 합니다.

  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()

Kopt 라이브러리에서 다음과 같은 설명과 함께 예외가 발생하는 경우:

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

이는 모델 클래스 중 하나에 문제가 있음을 의미할 가능성이 높습니다. 가능한 원인은 다음과 같습니다.

  • SDK에서 지원 하지 않는 필드 유형 도입

  • Realm 객체 모델 클래스에 open 또는 public 이외의 가시성 유형을 사용하는 경우

  • 호환되지 않는 필드에 Realm 주석 사용

이 오류가 발생하면 스키마에 대한 최근 업데이트에 문제가 없는지 확인하세요.

앱의 출시를 목표로 빌드하고 배포를 위해 분할하면 대부분의 경우 SDK는 약 800KB 정도의 앱만 추가합니다. 릴리스가 훨씬 더 큰 이유는 ARM7, ARMv7, ARM64, x86 및 MIPS와 같은 더 많은 아키텍처에 대한 지원을 포함하기 때문입니다. SDK 파일에는 지원되는 모든 아키텍처가 포함되어 있지만 Android 설치 프로그램은 기기 아키텍처에 대한 네이티브 코드만 설치합니다. 이는 설치된 앱이APK 파일 크기보다 작음을 의미합니다.

API를 각 아키텍처의 버전으로 분할하여 AndroidAPK 자체의 크기를 줄일 수 있습니다. build.gradle 에 다음을 추가하여 Android 빌드 도구 ABI 분할 지원을 사용하세요.

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

포함할 아키텍처를 선택하여 각각에 대한 별도의 SDK를 빌드합니다.

다음도 참조하세요.

ABI 분할에 대한 Android 도구 설명서를 Github참조하세요.자세한 내용은 또는 의 예시 를 참조하세요.

여러 개의 SDK를 처리하지 않으려면 단일APK에서 지원되는 아키텍처 수를 제한할 수 있습니다. build.gradleabiFilters 을(를) 추가하면 됩니다.

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

돌아가기

테스트