Полное руководство: исправление ошибки 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 выглядит так:
[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: Очистка и пересборка
Начните с самого простого:
# Полностью очистите решение
dotnet clean
# Удалите все папки bin и obj вручную
# Пересоберите в Release‑режиме
dotnet build -c Release
Как отмечено в треде на Reddit, полная очистка сборок и удаление bin/obj может решить проблемы с упаковкой.
Решение 2: Настройка Linker
- Откройте свойства проекта MAUI Android
- Перейдите на вкладку «Android Options»
- В разделе «Linker Behavior» попробуйте изменить значение с «SDK Assemblies Only» на «None»
- Пересоберите и протестируйте
Если это работает, вы можете постепенно экспериментировать с менее агрессивными настройками Linker. В обсуждении на Reddit предлагается включать Linker даже в Debug‑режиме, чтобы выявлять проблемы раньше.
Решение 3: Отключение AOT и Trimming
В файле проекта (.csproj) добавьте следующие свойства:
<PropertyGroup>
<AndroidEnableAotCompilation>false</AndroidEnableAotCompilation>
<PublishTrimmed>false</PublishTrimmed>
</PropertyGroup>
Это устраняет проблемы, упомянутые в Stack Overflow, где AOT и Trimming вызывали ошибки.
Решение 4: Конфигурация Multi‑dex
Убедитесь, что ваш Android‑проект настроен на Multi‑dex:
<PropertyGroup>
<AndroidUseSharedRuntime>false</AndroidUseSharedRuntime>
<AndroidEnableMultiDex>true</AndroidEnableMultiDex>
</PropertyGroup>
Решение 5: Настройка языка
Как упомянуто в Microsoft Q&A, попробуйте изменить системный язык на английский и пересобрать проект. Это иногда решает проблемы, связанные с кодировкой.
Продвинутые техники отладки
Включение отладочных символов в Release
Хотя это не рекомендуется для продакшн‑версий, временное включение символов может дать более подробную информацию об ошибке:
<PropertyGroup>
<DebugType>full</DebugType>
<DebugSymbols>true</DebugSymbols>
</PropertyGroup>
Как отмечено в Stack Overflow, это помогает выявить конкретный код, вызывающий проблемы.
Использование инструментов отчётов об ошибках
Внедрите сервис отчётов об ошибках, например, Sentry или Raygun, чтобы получать подробные отчёты о сбоях из Release‑версий. Это рекомендуется в руководстве по отладке на Stack Overflow.
Подробное логирование
Добавьте обширное логирование в MainActivity:
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 конфигурации, чтобы выявлять проблемы заранее.
Когда обращаться за дополнительной помощью
Если ни одно из решений не помогло, рассмотрите следующие варианты:
- Проверка issue на GitHub: В репозитории dotnet/maui есть похожие проблемы, которые обсуждают другие разработчики.
- Microsoft Q&A: Опубликуйте подробную информацию о вашей конкретной конфигурации на Microsoft Q&A.
- Сообщества: Обратитесь к сообществу .NET MAUI на Reddit или Stack Overflow для более персонализированной помощи.
При обращении предоставьте полную информацию, включая:
- Точную версию .NET MAUI
- Версию Visual Studio
- Целевую версию Android
- Полный лог ошибок
- Шаги, которые вы уже предприняли
Источники
- Microsoft Q&A - Invalid dex file indices Error in Net Maui
- Stack Overflow - Release mode for NET9 MAUI failed to find entry classes.dex
- Microsoft Q&A - Project deploy OK in debug mode but failed in release mode
- Reddit - MAUI app crashing in release but working in debug
- GitHub - .NET MAUI App Crashes in Release Mode
- Stack Overflow - How to debug reason for Crash in .NET MAUI Release App
- Reddit - MAUI app crash on Release mode on android
- 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 для получения дополнительной помощи.