Подтвердить что ты не робот

Обработка профайлов 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 как в библиотеке, так и в приложении?

4b9b3361

Ответ 1

После некоторых поисков я нашел ответ. Если вы используете внешние/отдельные исходные библиотеки с вашим основным проектом/приложением, вам не следует использовать 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 для вашего проекта библиотеки. При создании приложения (в режиме отладки или выпуска) компилятор позаботится обо всех правилах (в библиотеке и в приложении).

Ответ 2

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

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

Ответ 3

Как упомянул @Eric Lafortune в посте, вы можете использовать следующий синтаксис в своем проекте библиотеки, чтобы включить ProGuard[About]

android {
    defaultConfig {
        consumerProguardFiles 'proguard-rules.txt'
    }
    //...
}