Android Studio proguard处理多库项目

我有一个使用外部引用库的应用程序(也就是说,库的目录与应用程序在同一级别 – 它不会复制到应用程序的文件夹中)。 库被应用程序引用,库和应用程序都包含proguard文件。 一切工作正常,直到我build立的应用程序。 当我构build的应用程序,所有引用库中定义的类都没有find – 我得到“无法find符号类…)错误的所有库类的导入。 正如我所发现的,这是因为在重build应用程序时,proguard混淆了所有类和variables,因此应用程序无法引用它们。 我已经将以下内容添加到我的build.gradle文件中,

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

但似乎在构build应用程序时,不考虑以上内容(或者在发布模式下完成构build)。 如果我将上面的内容更改为以下内容(即在释放模式下禁用proguard),

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

应用程序编译正常。

有针对这个的解决方法吗? 创build签名的应用程序时,我只能启用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是一个问题?

Solutions Collecting From Web of "Android Studio proguard处理多库项目"

经过一番search,我find了答案。 如果您在主项目/应用程序中使用外部/独立源库,则不应在库模块上使用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规则的文件。 在构build应用程序时(无论是在debugging模式还是释放模式下),编译器都会处理所有的规则(在库和应用程序中)。

我想你需要为你的库定义proguard-rules。 通常他们在图书馆文档。

(例如,看看我的答案在这里ButterKnife lib: 链接 )