Неопределенная ошибка Dotfuscator в приложении Xamarin.Android

1

При запуске Dotfuscator в продакшен версии моего приложения Xamarin.Android, я получаю следующие ошибки: Изображение 174551

Если я отключаю Dotfuscator, то все работает нормально. Странная часть в том, что она отлично работает в предыдущей версии приложения. В этой новой версии приложения я добавил только несколько Android ContentProvider и один пакет NuGet. Ничего больше. Есть идеи?


Обновить

Как объясняет Джо Сьюэл, технически проблема не в Dotfuscator, а в Xamarin.Android. Система от Xamarin, генерируя классы Java, заполняет их имена из строк, извлеченных из файлов языка .NET Intermediary Language, без предварительной проверки, могут ли эти строки фактически использоваться в качестве имен классов Java.

В моем случае проблема была вызвана тем, что у меня был два слишком много затемненных классов С# в моем проекте. Dotfuscator был переименовав один из моего класса do (после прохождения ее нормального переименованием цикла: ab, ac, ad и т.д.). Очевидно, что do нельзя использовать в качестве имени класса Java, поскольку оно является зарезервированным ключевым словом Java, поэтому позже это вызвало синтаксическую ошибку в инструментах Xamarin. Удаление или использование Dotfuscator игнорирует любые два класса в моем проекте, заставило Dotfuscator не достигать имени do в его цикле, и проблема была устранена. Поэтому, пока эта ошибка не будет исправлена в Xamarin.Android, существует такая вещь, как запутывание слишком большого количества классов в вашем проекте.

Теги:
xamarin
dotfuscator

1 ответ

2

Кажется, что происходит то, что Dotfuscator переименовывает тип, который нужно do - это безопасно делать для небиблиотечных проектов .NET Framework, потому что промежуточный язык .NET не резервирует это слово. Затем "клейкий" код Xamarin.Android создает код Java на основе запутанных имен типов сборки .NET, и, поскольку do является зарезервированным словом в Java, это вызывает ошибки компилятора Java.

Чтобы обойти эту проблему, вы можете использовать пользовательский интерфейс сообщества Dotfuscator, чтобы исключить тип, который переименовывается. Вы можете использовать переименовываемый файл карты (например, DotfuscatorReports\Release\Renaming.xml), чтобы увидеть соответствие между исходными именами исходного кода и обфусцированными именами, в том числе со встроенным инструментом декодирования.

Я работаю в команде Dotfuscator и отвечаю в этом качестве. Я также подал проблему с Xamarin, ссылаясь на этот вопрос, относительно этих ошибок.

  • 0
    В моем случае это не просто один класс, а два, которые я сузил, исключив пространства имен и затем классы. Итак, почему эти два класса? Я всегда предполагал, что запутанные имена были просто переработаны: аа, аа, ас и тд. Если это так, то исключение этих двух проблемных классов не приведет к тому, что следующий неисключенный класс в списке получит имя «do»? Или Dotfuscator использует исходное имя класса в качестве «семени» для определения его запутанного имени? Если да, могу ли я переименовать класс во что-нибудь, что сгенерирует беспроблемное запутанное имя?
  • 0
    @AxiomaticNexus Эта проблема возникает только в том случае, если переименованный тип используется в Java-коде «клей», который в сборке представлен не всеми типами. Если какой-то другой тип, которому не присвоен Java-эквивалент, получает имя do , то эта проблема не должна возникать.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню