Android 如何在库中使用域

Android 如何在库中使用域,android,module,realm,kotlin,android-library,Android,Module,Realm,Kotlin,Android Library,我试图理解如何在我正在制作的库中使用Realm,经过几天的研究,我现在理解了RealmModule(如果Realm的人读到了这篇文章,你应该改进关于在库中使用的文档)。我创建了一个简单的类,它为我提供了具有库配置的领域: object ChatRealm { fun getChatRealm(): Realm{ val config = RealmConfiguration.Builder() .name("mtchat_realmDB")

我试图理解如何在我正在制作的库中使用Realm,经过几天的研究,我现在理解了RealmModule(如果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 {}
在项目应用程序类i设置域中,如下所示

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'
}
这是我的图书馆

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'
}
这是我的项目gradle

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
}
根据我是否在:app模块中添加了apply插件:“realmandroid”,我得到的结果是RealmObject“X”不是该领域架构的一部分,或者如果我将插件添加到app gradle,则无法完全构建该项目

是否有人曾在图书馆中使用过领域,并想清楚而深入地解释一下如何将其用作未来的参考

编辑:使用上述配置,我在构建时会出现此错误

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;
编辑2:


我通过为应用程序和库定义模块并避免将应用程序中的领域模型命名为库中的领域模型(这是必需的吗?还是有办法隔离库模型以便用户可以使用库模型使用的相同名称?)尽管如此,我还是花了两天的时间进行研究,我仍然不确定我是否做对了。如果有一个比我更有知识的人做了一个很好的教程或什么的话,那就太好了。

将此添加到你的项目gradle文件中

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

您正面临超过64K个方法的多个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>
public class MyApplication extends SomeOtherApplication {
  @Override
  protected void attachBaseContext(Context base) {
     super.attachBaseContext(base);
     MultiDex.install(this);
  }
}

它已经在那里了,很抱歉我忘了写它,我会更新问题
(如果Realm的人读了这个,你应该真正改进关于在库中使用的文档)
有@EpicPandaForce是的,我读了它,它澄清了一些事情,但没有文档真正解释在库中使用Realm的规则,比如,如果你必须在:app gradle中包含“apply plugin”,如果你已经在库中有了它,如果库用户可以使用与库中的对象同名的realmobject以及类似的深入内容。Realm不考虑模块和模型类的包名,所以是的,在库和应用程序中使用相同的名称将产生冲突。我们确实尝试在文档中记录模式的限制,并将示例项目链接到上面,但听起来我们需要更好地描述文档中的限制。啊,谢谢,我认为我做了一些非常错误的事情。谢谢,但这不是问题,dex错误在干净的构建中消失了,这是模块和模型名称的配置问题