Intereting Posts
Проблема при отображении имен элементов вместе с изображениями, которые хранятся в sqlite для android Android – пользовательский макет Inflater USB-отладка Moverio на Mac Добавление пользовательской аннотации к Android Saripaar Как перенести существующее приложение SQLite в библиотеку пространственного сопротивления? Можно ли получить конкретные сведения об ошибке из Android SQLiteConstraintException? Удалить историю браузера Android по умолчанию Позиционирование карт Google v2 увеличивает элементы управления на Android Каковы последствия не исправления проблемы «Класс, не найденный при разборке»? И почему это не влияет на приложение? Почему все мои растровые изображения выросли на 200%? Кэширование данных для мобильных приложений iOS / Android для работы с разбиением на страницы «Launchimage» для моего приложения trigger.io слишком мал на Galaxy Nexus Прямая трансляция из приложения Android в Youtube Получить день недели из GregorianCalendar Библиотека просмотра PDF в формате PDF без лицензии GPL

Обработка профайлов Android Studio в многобиблиотечных проектах

У меня есть приложение, которое использует библиотеку с внешней ссылкой (то есть каталог библиотеки находится на том же уровне, что и приложение, – он не копируется внутри папки приложения). Библиотека ссылается на приложение, и как библиотека, так и приложение включают файлы proguard. Все работает нормально, пока я не создаю приложение. Когда я построил приложение, все ссылки на классы, определенные в библиотеке, не найдены – я получаю ошибки «не могу найти символ …» при всех импортированных библиотечных классах. Как я понял, это происходит потому, что при перестройке приложения proguard запутывает все классы и переменные, и поэтому приложение не может ссылаться на них. Я добавил следующее в файл build.gradle,

buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' } debug { minifyEnabled false } } 

Но, похоже, при создании приложения вышеуказанное не учитывается (или здание выполняется в режиме деблокирования). Если я изменю приведенное выше на следующее (т. Е. Отключить proguard в режиме деблокирования)

 buildTypes { release { **minifyEnabled false** proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' } debug { minifyEnabled false } } 

Приложение компилируется в порядке.

Есть ли этому решение? Могу ли я включить proguard только при создании подписанного приложения?

Вот файл библиотеки proguard:

 -optimizationpasses 5 -dontusemixedcaseclassnames -dontskipnonpubliclibraryclasses -dontpreverify -verbose -optimizations !code/simplification/arithmetic,!field/*,!class/merging/* -optimizations !method/marking/static -keep public class * extends android.app.Activity -keep public class * extends android.app.Application -keep public class * extends android.app.Service -keep public class * extends android.content.BroadcastReceiver -keep public class * extends android.content.ContentProvider -keep public class * extends android.app.backup.BackupAgentHelper -keep public class * extends android.preference.Preference -keep public class com.android.vending.licensing.ILicensingService -keepclasseswithmembernames class * { native <methods>; } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet); } -keepclasseswithmembers class * { public <init>(android.content.Context, android.util.AttributeSet, int); } -keepclassmembers class * extends android.app.Activity { public void *(android.view.View); } -keepclassmembers enum * { public static **[] values(); public static ** valueOf(java.lang.String); } -keep class * implements android.os.Parcelable { public static final android.os.Parcelable$Creator *; } -dontwarn **CompatHoneycomb -keep class android.support.v4.** { *; } -keep class * extends java.util.ListResourceBundle { protected Object[][] getContents(); } -keep public class com.google.android.gms.common.internal.safeparcel.SafeParcelable { public static final *** NULL; } -keepnames @com.google.android.gms.common.annotation.KeepName class * -keepclassmembernames class * { @com.google.android.gms.common.annotation.KeepName *; } -keepnames class * implements android.os.Parcelable { public static final ** CREATOR; } -keep class com.google.android.gms.** { *; } -keep public class com.google.ads.** { public *; } -keep public class com.google.gson.** { public protected *; } -keep public class com.google.ads.internal.** {*;} -keep public class com.google.ads.internal.AdWebView.** {*;} -keep public class com.google.ads.internal.state.AdState {*;} -keep public class com.google.ads.mediation.** { public *; } -keep public class com.google.ads.searchads.** {*;} -keep public class com.google.ads.util.** {*;} -keep class com.google.ads.** -dontwarn com.google.ads.** -keepattributes *Annotation* 

Проблема в том, что я использую proguard как в библиотеке, так и в приложении?

После некоторых поисков я нашел ответ. Если вы используете внешние / отдельные исходные библиотеки с вашим основным проектом / приложением, вам не следует использовать proguard в библиотечных модулях. Вместо этого вы заменяете следующее:

 buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-project.txt' } debug { minifyEnabled false } } 

Со следующим (в build.gradle библиотеки / библиотек):

 buildTypes { release { consumerProguardFiles 'proguard-project.txt' } } 

Где proguard-project.txt – это файл, содержащий правила proguard для вашего проекта библиотеки. При создании приложения (в режиме отладки или выпуска) компилятор позаботится обо всех правилах (в библиотеке и в приложении).

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

(Например, посмотрите мой ответ здесь для ButterKnife lib: link )