Плагин Realm Gradle, похоже, ломает генерацию кода для Dagger

Так что я в восторге от новых функций Realm, добавленных в 0.88, и хочу использовать их в своем проекте. К сожалению, в версии 0.88+ теперь необходимо использовать плагин Gradle под названием realm-android.

Я также использую Dagger 1, для которого требуется этап генерации кода (для этого я использую apt). Когда я применяю плагин realm-android, все компилируется нормально, но я получаю ужасное

Module adapter for class could not be loaded

указывает на то, что компилятор неправильно сгенерировал файлы. Если я удалю плагин области, кинжал правильно сгенерирует файлы. Как я могу заставить Realm и Dagger хорошо работать вместе с этим новым механизмом плагинов?

build.gradle (уровень проекта): (отредактировано для актуальности)

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:1.5.0'
        classpath 'io.realm:realm-gradle-plugin:0.88.2'
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
    }
}

build.gradle (уровень модуля): (отредактировано для актуальности)

apply plugin: 'com.android.application'
apply plugin: 'realm-android'
apply plugin: 'com.neenbedankt.android-apt'

android {
    compileSdkVersion 23
    buildToolsVersion '23.0.2'
    dexOptions {
        jumboMode = true
    }

defaultConfig {
    applicationId "xx.xx.xx"
    minSdkVersion 15
    targetSdkVersion 23
    multiDexEnabled true
}

def daggerVersion = '1.2.2'

dependencies {
    apt "com.squareup.dagger:dagger-compiler:$daggerVersion"
    compile "com.squareup.dagger:dagger:$daggerVersion"
}

Изменить 02.04.16

Хорошо, все становится странным, и мне интересно, не преследую ли я здесь призрака. Я заметил, что дело не только в добавлении плагина, но и в наличии как минимум двух моделей областей. Имея две модели X и Y, APT не работает для Dagger, и я получаю ту же ошибку. Имейте 0 или 1 модель (X ИЛИ Y), и она работает без ошибок. Я никоим образом не использую модели и даже не создаю экземпляр Realm. В качестве конкретного примера, вот две модели данных, которые я использую, которые демонстрируют такое поведение.

import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import io.realm.annotations.Required;

public class ContactEmail extends RealmObject {
    @PrimaryKey
    private String localGuid;
    @Required
    private String email;

    public String getLocalGuid() {
        return localGuid;
    }

    public void setLocalGuid(String localGuid) {
        this.localGuid = localGuid;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}


import io.realm.RealmObject;
import io.realm.annotations.PrimaryKey;
import io.realm.annotations.Required;

public class ContactPhone extends RealmObject {
    @PrimaryKey
    private String localGuid;
    @Required
    private String phone;

    public String getLocalGuid() {
        return localGuid;
    }

    public void setLocalGuid(String localGuid) {
        this.localGuid = localGuid;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }
}

person Andrew G    schedule 02.04.2016    source источник
comment
Итак, это очень дикая догадка, но что произойдет, если вы измените порядок realm-android и com.neenbedankt.android-apt?   -  person EpicPandaForce    schedule 04.04.2016
comment
Хех да перепробовал там всякие порядовки :) Нет, к сожалению. Я очень сбит с толку этой вещью «позволяет один объект»!   -  person Andrew G    schedule 04.04.2016
comment
Вы должны сделать минимальный пример и опубликовать его как проблему для realm-java   -  person EpicPandaForce    schedule 04.04.2016
comment
Да, пожалуйста, создайте проблему Github с проектом, который может это воспроизвести. У нас уже есть проекты, объединяющие Dagger 1 и Realm без проблем, поэтому я подозреваю, что здесь играет роль что-то еще. Вы пробовали отключить MultiDex?   -  person Christian Melchior    schedule 05.04.2016
comment
@ChristianMelchior да, мне было интересно узнать о факторе мультидекса, учитывая странное поведение нескольких объектов. Я буду работать над созданием минимального примера.   -  person Andrew G    schedule 05.04.2016


Ответы (1)


Похоже, что Realm сама применяет плагин APT (на этом строка). Итак, попробуйте удалить строку плагина android-apt.

Это застало меня врасплох, когда я оценивал проект Android, который использовал Butterknife 8 и не объявлял плагин android-apt, а только плагин realm.

person Olinasc    schedule 13.06.2016