Как использовать Realm в библиотеке

Я пытаюсь понять, как использовать Realm в библиотеке, которую я создаю, теперь я понимаю RealmModules после нескольких дней исследований (если кто-то из Realm читает это, вы должны действительно улучшить документацию об использовании в библиотеках). Я сделал простой класс, который дает мне область с конфигурацией библиотеки:

object ChatRealm { fun getChatRealm(): Realm{ val config = RealmConfiguration.Builder() .name("mtchat_realmDB") .schemaVersion(2) .deleteRealmIfMigrationNeeded() .modules(ChatModule()) .build() return Realm.getInstance(config) } } 

модуль – это

 @RealmModule(library = true, allClasses = true) class ChatModule {} 

и в проекте Application class i setup realm, как это

 class App: Application() { override fun onCreate() { super.onCreate() initRealm() setupRealm() } private fun initRealm() { Realm.init(this) } private fun setupRealm(){ Realm.setDefaultConfiguration( RealmConfiguration.Builder() .deleteRealmIfMigrationNeeded() .modules(Realm.getDefaultModule(), ChatModule()) .build() ) } } 

Теперь проблема в том, что сборка не работает или приложение терпит крах по разным причинам, основываясь на том, как я настраиваю файлы gradle.

Мой: приложение gradle – это

 apply plugin: 'com.android.application' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'realm-android' repositories { maven { url "https://jitpack.io" } maven { url 'https://maven.google.com' } mavenCentral() } buildscript { repositories { jcenter() } } android { compileSdkVersion 26 buildToolsVersion "26.0.0" defaultConfig { minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionName "1.0" vectorDrawables.useSupportLibrary= true } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') compile 'com.android.support:appcompat-v7:26.0.2' compile 'com.android.support:design:26.0.2' compile 'com.android.support.constraint:constraint-layout:1.0.2' compile 'com.android.support:support-vector-drawable:26.0.2' compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" compile project(':mtchat') } 

и мой градиент библиотеки – это

 apply plugin: 'com.android.library' apply plugin: 'kotlin-android' apply plugin: 'kotlin-android-extensions' apply plugin: 'kotlin-kapt' apply plugin: 'realm-android' repositories { maven { url "https://jitpack.io" } maven { url 'https://maven.google.com' } mavenCentral() } buildscript { repositories { jcenter() } } android { compileSdkVersion 26 buildToolsVersion "26.0.0" defaultConfig { minSdkVersion 15 targetSdkVersion 26 versionCode 1 versionName "1.0" } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile "com.android.support:appcompat-v7:$compat_version" compile "com.android.support:support-v4:$compat_version" compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version" compile "com.android.support:cardview-v7:$compat_version" compile "com.android.support:recyclerview-v7:$compat_version" compile "com.android.support:design:$compat_version" compile "de.hdodenhof:circleimageview:2.1.0" compile 'com.github.bumptech.glide:glide:4.1.1' compile 'com.android.volley:volley:1.0.0' } 

и это моя проектная градация

 buildscript { ext.kotlin_version = '1.1.4-3' ext.compat_version = '26.0.2' repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.3' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" classpath "io.realm:realm-gradle-plugin:3.7.2" // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files } } allprojects { repositories { jcenter() } } task clean(type: Delete) { delete rootProject.buildDir } 

и на основе, если я добавлю или не применяю плагин: «realm-android» к модулю: app, я получаю либо RealmObject «X», либо не является частью схемы для этой области, или если я добавлю плагин к графе приложения, это не сработает полностью построить проект.

Есть ли кто-нибудь, кто использовал Realm в библиотеке и хочет объяснить, как, ясно и подробно, может быть, это может быть использовано в качестве ссылки в будущем

EDIT: с приведенной выше конфигурацией я получаю эту ошибку при создании

 Execution failed for task ':app:transformClassesWithDexForDebug'. > com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define Lio/realm/ChatRealmProxyInterface; 

EDIT 2:

Мне удалось заставить его работать, определяя модули как для приложения, так и для библиотеки и избегая присвоения имен моделей области в приложении тем же, что и в библиотеке (это требуется? Или есть способ изолировать библиотечные модели, чтобы пользователь могут использовать те же имена, что и в библиотечных моделях?) Тем не менее это заняло у меня 2 дня исследований, и я до сих пор не уверен, что я делаю это правильно. Это было бы ДЕЙСТВИТЕЛЬНО здорово, если бы кто-то с большим количеством знаний, чем я, сделал хороший учебник или что-то в этом роде.

вы сталкиваетесь с более 64 тыс. методов. Несколько проблем с файлом dex, не связанных с библиотекой областей, вам нужно добавить зависимости

Настройте приложение для multidex

 android { defaultConfig { ... multiDexEnabled true } productFlavors { dev { // Enable pre-dexing to produce an APK that can be tested on // Android 5.0+ without the time-consuming DEX build processes. minSdkVersion 21 } prod { // The actual minSdkVersion for the production version. minSdkVersion 14 } } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } } dependencies { compile 'com.android.support:multidex:1.0.1' } 

Если вы не переопределяете класс приложения, отредактируйте файл манифеста, чтобы установить имя android: name в теге следующим образом:

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application android:name="android.support.multidex.MultiDexApplication" > ... </application> </manifest> 

Если вы переопределите класс приложения, измените его, чтобы расширить MultiDexApplication (если возможно) следующим образом:

 public class MyApplication extends SomeOtherApplication { @Override protected void attachBaseContext(Context base) { super.attachBaseContext(base); MultiDex.install(this); } } 

Добавьте это в свой проект gradle file

 dependencies { classpath "io.realm:realm-gradle-plugin:3.5.0" }