Xamarin Android ProGuard Включить

Я работаю над приложением xamarin. Когда я включаю «ProGuard» в свойствах Android при создании приложения, я получаю следующую ошибку:

"java.exe" exited with code1.

введите описание изображения здесь cfg-файл proguard содержит следующее:

-keep public class * extends android.app.Activity
-keep public class * extends android.app.Application
-keep public class * extends android.app.Service

Среда разработки:
Visual Studio 2015
Xamarin 4.0.4.4


person ravindar    schedule 23.08.2016    source источник
comment
Когда у вас ошибка? Время выполнения? Время компиляции? Добавьте и свой файл proguard.   -  person AndroidRuntimeException    schedule 23.08.2016
comment
Можете ли вы добавить к своему вопросу полный вывод диагностической сборки? Ошибка должна иметь след, ведущий к ней.   -  person Jon Douglas    schedule 23.08.2016
comment
Самая распространенная проблема, которую я видел, связана с вашей версией JDK (которую вы увидите в выводе, если вы установите ее на диагностику), а также с недостаточным размером кучи. В их багтрекере все еще есть несколько открытых ошибок, а именно: bugzilla.xamarin.com/ show_bug.cgi? id = 35255   -  person silencedmessage    schedule 23.08.2016
comment
Похоже, вам нужно добавить еще много крепостей в свой гвардеец. Проверьте эту ссылку proguard.sourceforge.net/manual/   -  person AndroidRuntimeException    schedule 23.08.2016
comment
@AndroidRuntimeException - добавление дополнительных сведений к тому, что вы говорите: код ошибки 1 предполагает отсутствие keeps, что приводит к сбоям связи (но сначала убедитесь, что JDK и Android SDK обновлены). Чтобы знать наверняка, нужно увидеть результаты диагностической сборки. FWIW, для Xamarin может быть специальный proguard cfg для проекта с любыми необходимыми настройками. Это дополняет путь по умолчанию для Android SDK, указанный в параметрах Xamarin Tools, например. (имя пользователя) /AppData/Local/Xamarin/Universal/AndroidSDK/tools/proguard/proguard-android.txt   -  person ToolmakerSteve    schedule 12.02.2017
comment
... также можно попробовать отключить оптимизацию (временно, в качестве теста): -dontoptimize в proguard.cfg проекта (при необходимости добавьте с помощью действия сборки ProguardConfiguration). Если ошибки ссылки исчезнут, это означает, что вам нужно добавить соответствующие keeps. ОДНАКО, если вы используете Google Play и у вас нет Enable Multi-Dex, это может подтолкнуть вас к пределу метода в 64 КБ, что приведет к выходу с кодом ошибки 2 в CompileToDalvik.   -  person ToolmakerSteve    schedule 12.02.2017


Ответы (2)


У меня была такая же проблема при включении ProGuard. Следуя совету по этой ссылке, я исправил проблему, обновив свой proguard вручную. Выполнить действия довольно легко, и они устранили проблему. Надеюсь, это тебе поможет.

  1. Загрузите zip-файл ProGuard, доступный по адресу: https://sourceforge.net/projects/proguard/files/. На момент написания последней версии ProGuard была 5.3.
  2. ProGuard не имеет программы установки, поэтому вам нужно будет распаковать файл и скопировать структуру папок proguard в место, указанное в шагах ниже.
  3. Запустите диспетчер SDK и обратите внимание на путь в левом верхнем углу под параметрами меню. В моем случае это был C: \ Users \ Sahar \ AppData \ Local \ Android \ android-sdk. Папка proguard находится в папке инструментов этого пути (в моем случае это был C: \ Users \ Sahar \ AppData \ Local \ Android \ android-sdk \ tools \ proguard).
  4. Закройте все среды разработки, которые могут обращаться к SDK, и переименуйте папку proguard в proguard.old.
  5. Скопируйте папку proguard новой версии в папку tools и при необходимости переименуйте в proguard (в моем случае скопированная папка была переименована из proguard5.3).
  6. Наконец, скопируйте файлы конфигурации из папки proguard.old в новую папку. В моем случае это были: - proguard-android.txt, proguard-android-optimize.txt и proguard-project.txt.
  7. Очистите и перестройте свой проект с помощью ProGuard.
person TheTallWitch    schedule 19.10.2016
comment
Лучше всего опубликовать соответствующие сведения и включить ссылку на страницу. В противном случае, если ссылка не работает, к сожалению, эффективность вашего ответа тоже. - person gravity; 19.10.2016
comment
@gravity спасибо за совет, я только начал помогать чем могу, обновлю свой ответ - person TheTallWitch; 21.10.2016
comment
Отличный монтаж. Отличные детали и в результате гораздо лучший ответ. - person gravity; 21.10.2016
comment
@gravity большое спасибо, в следующий раз я буду лучше - person TheTallWitch; 21.10.2016
comment
AFAIK, все, что использует Xamarin, - это три файла .jar в папке proguard/lib. Таким образом, альтернативой шагам 4-6 является замена этих трех файлов новыми. (Кто-то дал это решение в другом сообщении stackoverflow, но у меня нет ссылки на них.) - person ToolmakerSteve; 12.02.2017

У меня возникла проблема, когда Proguard удалял библиотеки сервисов Google Play из моего приложения.

Мне пришлось добавить следующие строки текста в файл proguard-android.txt, найденный в этой папке:

/(Path to your Android SDK Folder)/tools/proguard

-keep public class com.google.android.gms.* { public *; }
-dontwarn com.google.android.gms.**

Полный файл proguard-android.txt

-keep public class com.google.android.gms.* { public *; }
-dontwarn com.google.android.gms.**

# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html

-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
-dontoptimize
-dontpreverify
# Note that if you want to enable optimization, you cannot just
# include optimization flags in your own project configuration file;
# instead you will need to point to the
# "proguard-android-optimize.txt" file instead of this one from your
# project.properties file.

-keepattributes *Annotation*
-keep public class com.google.vending.licensing.ILicensingService
-keep public class com.android.vending.licensing.ILicensingService

# For native methods, see http://proguard.sourceforge.net/manual/examples.html#native
-keepclasseswithmembernames class * {
    native <methods>;
}

# keep setters in Views so that animations can still work.
# see http://proguard.sourceforge.net/manual/examples.html#beans
-keepclassmembers public class * extends android.view.View {
   void set*(***);
   *** get*();
}

# We want to keep methods in Activity that could be used in the XML attribute onClick
-keepclassmembers class * extends android.app.Activity {
   public void *(android.view.View);
}

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(java.lang.String);
}

-keepclassmembers class * implements android.os.Parcelable {
  public static final android.os.Parcelable$Creator CREATOR;
}

-keepclassmembers class **.R$* {
    public static <fields>;
}

# The support library contains references to newer platform versions.
# Don't warn about those in case this app is linking against an older
# platform version.  We know about them, and they are safe.
-dontwarn android.support.**

# Understand the @Keep support annotation.
-keep class android.support.annotation.Keep

-keep @android.support.annotation.Keep class * {*;}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <methods>;
}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <fields>;
}

-keepclasseswithmembers class * {
    @android.support.annotation.Keep <init>(...);
}
person Brandon Minnick    schedule 14.05.2017