Другое

Полное руководство: исправление ошибки classes.dex в .NET 9 MAUI

Решите сбои .NET 9 MAUI в Release с ошибкой 'classes.dex'. Полный гайд по настройке линкера, AOT, multi-dex и другим решениям и практическими советами по отладке.

.NET 9 MAUI‑приложение падает в режиме Release с ошибкой «Failed to find entry ‘classes.dex’»

Я разрабатываю приложение .NET 9 MAUI в Visual Studio 2026. В режиме Debug приложение запускается без проблем, но сразу падает, когда собирается в Release. В логе видны следующие строки:

11-15 23:44:38.874 W/nguageinuse.app( 3604): Failed to find entry 'classes.dex': Entry not found
11-15 23:44:38.875 W/nguageinuse.app( 3604): Failed to find entry 'classes.dex': Entry not found
11-15 23:44:38.875 W/nguageinuse.app( 3604): Failed to find entry 'classes.dex': Entry not found

Мой MainActivity.cs выглядит так:

csharp
[Activity(
    Theme = "@style/Maui.SplashTheme",
    MainLauncher = true,
    LaunchMode = LaunchMode.SingleTop,
    ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation |
                           ConfigChanges.UiMode | ConfigChanges.ScreenLayout |
                           ConfigChanges.SmallestScreenSize | ConfigChanges.Density)]
[IntentFilter(new[] { Platform.Intent.ActionAppAction },
    Categories = new[] { global::Android.Content.Intent.CategoryDefault })]
[IntentFilter(new[] { Intent.ActionView },
    Categories = new[]
    {
        Intent.ActionView,
        Intent.CategoryDefault,
        Intent.CategoryBrowsable,
    },
    DataScheme = "liu",
    DataHost = "",
    DataPathPrefix = "/")]
public class MainActivity : MauiAppCompatActivity
{
    // код
}

Ранее я публиковал более раннюю версию этого приложения в Google Play без каких‑либо проблем. Что может вызывать ошибку «Failed to find entry ‘classes.dex’» в режиме Release и как её исправить?

Понимание ошибки

Ошибка «Failed to find entry ‘classes.dex’» возникает, когда Android‑runtime не может найти основной файл dex в вашем APK. Этот файл содержит ядро кода приложения и необходим для запуска приложения системой Android. В журнале ошибок, который вы привели:

11-15 23:44:38.874 W/nguageinuse.app( 3604): Failed to find entry 'classes.dex': Entry not found

указывается, что во время загрузки пакета Android ищет classes.dex, но не может его найти. Это обычно происходит, когда:

  • Linker удаляет критически важные ссылки на код во время сборки Release
  • Процесс упаковки не включает необходимые dex‑файлы
  • Конфигурация Multi‑dex мешает корректно сгенерировать основной dex

Согласно документации Microsoft, проблема связана именно с тем, как .NET MAUI обрабатывает Android‑упаковку в режиме Release по сравнению с Debug.

Общие причины проблем с classes.dex

1. Проблемы с настройками Linker

Linker в режиме Release удаляет неиспользуемый код, но иногда удаляет код, который действительно нужен во время выполнения. Как отмечено в обсуждении на Stack Overflow, поведение Linker часто является причиной.

2. AOT (Ahead of Time) компиляция

.NET MAUI использует AOT для Android в Release‑режиме, что иногда мешает генерации и упаковке dex‑файлов.

3. Конфигурация Multi‑dex

Когда приложение превышает определённый размер, Android использует Multi‑dex, но неправильная настройка может вызвать проблемы. В issue на GitHub упоминается, что Multi‑dex по умолчанию может вызывать проблемы.

4. Проблемы с языком/кодировкой

Некоторые пользователи обнаружили, что системные настройки языка влияют на процесс сборки. Согласно Microsoft Q&A, смена системного языка на английский и пересборка могут решить проблему.

5. Совместимость библиотек

Если вы используете сторонние библиотеки, которые не настроены должным образом для Release‑сборок MAUI, они могут вызвать ошибки, связанные с dex. Это упоминается в форуме поддержки ABP.IO.

Пошаговые решения

Решение 1: Очистка и пересборка

Начните с самого простого:

bash
# Полностью очистите решение
dotnet clean
# Удалите все папки bin и obj вручную
# Пересоберите в Release‑режиме
dotnet build -c Release

Как отмечено в треде на Reddit, полная очистка сборок и удаление bin/obj может решить проблемы с упаковкой.

Решение 2: Настройка Linker

  1. Откройте свойства проекта MAUI Android
  2. Перейдите на вкладку «Android Options»
  3. В разделе «Linker Behavior» попробуйте изменить значение с «SDK Assemblies Only» на «None»
  4. Пересоберите и протестируйте

Если это работает, вы можете постепенно экспериментировать с менее агрессивными настройками Linker. В обсуждении на Reddit предлагается включать Linker даже в Debug‑режиме, чтобы выявлять проблемы раньше.

Решение 3: Отключение AOT и Trimming

В файле проекта (.csproj) добавьте следующие свойства:

xml
<PropertyGroup>
  <AndroidEnableAotCompilation>false</AndroidEnableAotCompilation>
  <PublishTrimmed>false</PublishTrimmed>
</PropertyGroup>

Это устраняет проблемы, упомянутые в Stack Overflow, где AOT и Trimming вызывали ошибки.

Решение 4: Конфигурация Multi‑dex

Убедитесь, что ваш Android‑проект настроен на Multi‑dex:

xml
<PropertyGroup>
  <AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
  <AndroidEnableMultiDex>true</AndroidEnableMultiDex>
</PropertyGroup>

Решение 5: Настройка языка

Как упомянуто в Microsoft Q&A, попробуйте изменить системный язык на английский и пересобрать проект. Это иногда решает проблемы, связанные с кодировкой.

Продвинутые техники отладки

Включение отладочных символов в Release

Хотя это не рекомендуется для продакшн‑версий, временное включение символов может дать более подробную информацию об ошибке:

xml
<PropertyGroup>
  <DebugType>full</DebugType>
  <DebugSymbols>true</DebugSymbols>
</PropertyGroup>

Как отмечено в Stack Overflow, это помогает выявить конкретный код, вызывающий проблемы.

Использование инструментов отчётов об ошибках

Внедрите сервис отчётов об ошибках, например, Sentry или Raygun, чтобы получать подробные отчёты о сбоях из Release‑версий. Это рекомендуется в руководстве по отладке на Stack Overflow.

Подробное логирование

Добавьте обширное логирование в MainActivity:

csharp
protected override void OnCreate(Bundle savedInstanceState)
{
    try
    {
        base.OnCreate(savedInstanceState);
        // Ваш существующий код
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine($"Crash in MainActivity: {ex}");
        throw;
    }
}

Стратегии предотвращения

1. Регулярное тестирование Release‑версий

Старайтесь тестировать Release‑сборки регулярно во время разработки, а не только в конце. Это позволяет выявлять проблемы раньше.

2. Настройка Linker для Debug

Как предложено в Reddit, включайте Linker даже в Debug‑режиме, чтобы ловить потенциальные проблемы до того, как они проявятся в Release.

3. Проверка совместимости библиотек

Регулярно проверяйте, что все подключённые библиотеки совместимы с последними версиями .NET MAUI. Форум ABP.IO подчёркивает важность проверки совместимости библиотек.

4. Автоматизация скриптов сборки

Создайте скрипты сборки, которые автоматически тестируют как Debug, так и Release конфигурации, чтобы выявлять проблемы заранее.

Когда обращаться за дополнительной помощью

Если ни одно из решений не помогло, рассмотрите следующие варианты:

  1. Проверка issue на GitHub: В репозитории dotnet/maui есть похожие проблемы, которые обсуждают другие разработчики.
  2. Microsoft Q&A: Опубликуйте подробную информацию о вашей конкретной конфигурации на Microsoft Q&A.
  3. Сообщества: Обратитесь к сообществу .NET MAUI на Reddit или Stack Overflow для более персонализированной помощи.

При обращении предоставьте полную информацию, включая:

  • Точную версию .NET MAUI
  • Версию Visual Studio
  • Целевую версию Android
  • Полный лог ошибок
  • Шаги, которые вы уже предприняли

Источники

  1. Microsoft Q&A - Invalid dex file indices Error in Net Maui
  2. Stack Overflow - Release mode for NET9 MAUI failed to find entry classes.dex
  3. Microsoft Q&A - Project deploy OK in debug mode but failed in release mode
  4. Reddit - MAUI app crashing in release but working in debug
  5. GitHub - .NET MAUI App Crashes in Release Mode
  6. Stack Overflow - How to debug reason for Crash in .NET MAUI Release App
  7. Reddit - MAUI app crash on Release mode on android
  8. ABP.IO Support - Net Maui - Trying to build in release mode

Заключение

Ошибка «Failed to find entry ‘classes.dex’» в Release‑сборках .NET 9 MAUI обычно вызвана поведением Linker, проблемами AOT компиляции или некорректной конфигурацией упаковки. Начните с простых шагов: очистка и пересборка, затем постепенно переходите к более сложным настройкам, таким как изменение Linker, отключение AOT и включение Multi‑dex. Регулярно тестируйте Release‑версии и внедряйте инструменты отчётов об ошибках для более точного диагностирования проблем в продакшн‑окружении. Если проблемы сохраняются, используйте активное сообщество .NET MAUI и каналы поддержки Microsoft для получения дополнительной помощи.

Авторы
Проверено модерацией
Модерация