문서 메뉴

문서 홈애플리케이션 개발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"
}
//...
}

다음도 참조하세요.

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은 손상을 방지하기 위해 Realm 파일을 열 때마다 검사를 실행합니다. 설정이 호환되지 않는 Realm 파일이 실수로 열리는 것을 방지하기 위해 SDK는 Java의 equals() 메서드를 사용하여 RealmConfiguration 객체를 비교합니다. 이렇게 하면 SDK가 스키마, 내구성 수준 또는 쓰기 가능성 설정이 다른 단일 Realm 파일을 열 수 없습니다. 그러나 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를 빌드합니다.

여러 개의 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.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"
}
← 테스트 - Java SDK