Intereting Posts
SwiperefreshLayout в Android Как использовать пользовательский файл android.media.MediaDataSource вместе с android.media.MediaPlayer? Использование функции gradleReference в кордове plugin.xml Сделать целую строку в ListView кликабельным? Значок поиска для поиска закрывается, а не белый Почему Android Studio не создаст мой файл AAR в режиме выпуска SwipeRefreshLayout с несколькими списками ListViews Android-дисплей html в текстовом режиме внутри списка Gradle buildType / productFlavor с использованием неожиданного buildConfigField Самый быстрый способ запросить контакты с «номерами мобильных телефонов» на Android Как установить прозрачность фонового изображения Android xml-файл Как переупаковать HttpClient 4.3.1 и удалить зависимости от ведения общедоступных записей? Отправка файлов с помощью POST с HttpURLConnection Android JNI: GetObjectClass сбой с SIGSEGV (не действительная ссылка JNI) Палирование теневой кнопки кнопки с плавающей кнопкой при просмотре полей

Обработка профайлов 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 )