dex-файл не содержит класса MainActivity

При запуске моего приложения я получаю следующую ошибку:

java.lang.RuntimeException: Unable to instantiate activity ComponentInfo{com.name.app/com.name.app.MainActivity}: 
java.lang.ClassNotFoundException: Didn't find class "com.name.app.MainActivity" on path: 
    DexPathList[[zip file "/data/app/com.name.app-2/base.apk"],
        nativeLibraryDirectories=[/vendor/lib, /system/lib]]

Я использовал анализатор apk Android Studio (Build > Analyze APK) для анализа моего apk (app/build/outputs/apk/debug/app-debug.apk), и структура classes.dex такова

java/
    lang/*
    util/*
    io/*
com/google/devtools/build/...

Я заметил, что мои собственные классы и, следовательно, MainActivity отсутствуют. Насколько я понимаю файлы dex (из этот вопрос SO) мой собственный занятия тоже должны быть. Поскольку их там нет, я понимаю, почему я получаю сообщение об ошибке, что мой класс не найден.

Я получаю эту ошибку на своем собственном устройстве: Samsung, Lollipop 5.0.2, API 21 и на виртуальном устройстве: Google Pixel, Oreo 8.0.0, API 26.

Что я пробовал

Я гуглил и нашел несколько предложений, но ни одно из них не сработало для меня. Эти предложения были:

  • Отключить мгновенный запуск. «Файл» > «Настройки» > «Сборка, выполнение, развертывание» > «Мгновенный запуск» > снимите флажок «Мгновенный запуск».

  • Очистите проект. Построить > Очистить. Затем перестройте проект, Build > Rebuild.

  • Недействительные кеши/перезапуск.

  • Удалите приложение с устройства и повторите попытку.

  • Используйте другое имя пути в файле Manifest. Замените android:name=".MainActivity" на android:name="com.name.app.MainActivity" в теге activity.

  • Отключите предварительное индексирование, как в этом ответе.

Добавлено следующее в build.gradle

dexOptions {
    preDexLibraries false
}
  • Включите multidex, перейдя по этой ссылке. Сначала включил multidex в build.gradle, а потом добавил MultiDexApplication в свой манифест. Мой MainActivity расширяет AppCompatActivity (и, следовательно, не расширяет Application).

Включение мультидекса дает аналогичную ошибку:

java.lang.RuntimeException: Unable to instantiate application android.support.multidex.MultiDexApplication: 
java.lang.ClassNotFoundException: Didn't find class "android.support.multidex.MultiDexApplication" on path: 
    DexPathList[...]

Ниже приведены дополнения для включения multidex.

build.gradle

android {
    defaultConfig {
        ...
        minSdkVersion 15 
        targetSdkVersion 26
        multiDexEnabled true
    }
    ...
}

dependencies {
  implementation 'com.android.support:multidex:1.0.3'
}

манифест (только соответствующая часть)

<application
        android:name="android.support.multidex.MultiDexApplication" >
        ...
</application>

Примечание. Было еще одно предложение, связанное с библиотеками, см. этот ответ. Однако это было нацелено на Eclipse, и я не уверен, что это может быть решением моей проблемы. Gradle должен иметь дело со всеми зависимостями, верно? На всякий случай вот как я перечислил все свои зависимости в Gradle (версия Kotlin 1.2.51):

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    testImplementation 'junit:junit:4.12'
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support:design:26.1.0'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-simplexml:2.3.0'
    implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version"

    testImplementation 'org.junit.platform:junit-platform-engine:1.2.0'
    testImplementation 'org.jetbrains.spek:spek-api:1.1.5'
    testImplementation 'org.jetbrains.spek:spek-junit-platform-engine:1.1.5'
}

Обновить

Я использую Android Studio 3.1.3. Я попытался запустить свое приложение на другом ноутбуке (через контроль версий, используя Android Studio 3.1.3), и там ошибка не появляется. Поскольку файлы абсолютно одинаковы, я подозреваю, что с моей настройкой Android Studio что-то не так.

Удаление Android Studio и всех его настроек, а затем загрузка и установка Android Studio с здесь не помогли. решать проблему.


person Abby    schedule 09.07.2018    source источник
comment
ваш основной класс - это класс kotlin?   -  person Nirav Bhavsar    schedule 09.07.2018
comment
надеюсь, что ваш com.name.app.MainActivity уже определен в Manifest.xml   -  person Sreehari    schedule 09.07.2018
comment
@NiravBhavsar Нет, моя MainActivity — это класс Java. У меня есть другие классы Kotlin.   -  person Abby    schedule 09.07.2018
comment
@ Шрихари Да, конечно.   -  person Abby    schedule 09.07.2018
comment
Откуда это 7866bT-i2U8fT-8nEVVFCA==?   -  person OneCricketeer    schedule 09.07.2018
comment
@cricket_007 Честно говоря, я понятия не имею... Я также не смог найти каталог /data.   -  person Abby    schedule 09.07.2018
comment
Этот каталог находится на самом устройстве. Вы устанавливаете на эмулятор или на физическое устройство? Это новый проект или предыдущий? Приложение когда-нибудь устанавливалось правильно?   -  person OneCricketeer    schedule 09.07.2018
comment
@cricket_007 Это было на эмуляторе. Просто запустил его на физическом устройстве, и этот путь имеет гораздо больше смысла. Я отредактирую вопрос, чтобы избежать путаницы. Это не новый проект, это предыдущий, который я улучшаю (примерно через год после того, как он был впервые «закончен») и медленно конвертирую Java в Kotlin. Недавно мы обновили Gradle до 4.7, так что, возможно, это как-то связано с этим (хотя я помню, что с этим он работал нормально).   -  person Abby    schedule 09.07.2018
comment
Вы когда-нибудь переименовывали имя пакета или это просто опечатка? com.nane.app/com.name.app   -  person OneCricketeer    schedule 09.07.2018
comment
@cricket_007 Просто опечатка. Это фиктивные имена.   -  person Abby    schedule 09.07.2018


Ответы (1)


Структура моих папок была

.gradle/
.idea/
app/
    build/
    src/main
        gen/
        java/
        res/
build/
gradle/

Папки gen здесь быть не должно. Эта папка содержала сгенерированные файлы, такие как R.java. Эти файлы тоже были (впрочем, правильно) в app/build/generated/source/*. Простое удаление папки gen и очистка проекта решили проблему.

Я понятия не имею, как эта папка gen оказалась там, так как я несколько раз удалял проект с диска и клонировал репозиторий git (в котором этой папки нет). Как только я узнаю, как он туда попал, я обновлю этот ответ.

person Abby    schedule 11.07.2018