使用 Multidex 的 Android proguard

Posted

技术标签:

【中文标题】使用 Multidex 的 Android proguard【英文标题】:Android proguard using Multidex 【发布时间】:2016-08-25 10:29:24 【问题描述】:

我尝试在我的 android 应用程序中使用 proguard。我在我的应用程序中使用multidex,所以我在我的build.gradle 中添加了multiDexEnabled = true,但是当我尝试构建apk 时,出现以下错误:

Error:Execution failed for task 
':app:transformClassesWithMultidexlistForRelease'.
> expected one element but was: 
</Users/Amir/AndroidStudioProjects/jarchiapp/app/build/intermediates/transforms/proguard/release/jars/3/1f/butterknife-7.0.1.jar, 
/Users/Amir/AndroidStudioProjects/jarchiapp/app/build/intermediates/transforms/proguard/release/jars/3/1f/classes.jar, 
/Users/Amir/AndroidStudioProjects/jarchiapp/app/build/intermediates/transforms/proguard/release/jars/3/1f/commons-codec-1.10.jar, 
/Users/Amir/AndroidStudioProjects/jarchiapp/app/build/intermediates/transforms/proguard/release/jars/3/1f/disklrucache-2.0.2.jar, 
/Users/Amir/AndroidStudioProjects/jarchiapp/app/build/intermediates/transforms/proguard/release/jars/3/1f/dualcache-2.2.0.jar, ...>

这是我的 proguard-rules.pro:

-libraryjars <java.home>/lib/rt.jar(javax/**)
-keepattributes *Annotation*,InnerClasses,EnclosingMethod,Signature

-keep class com.squareup.okhttp.**  *; 
-keep interface com.squareup.okhttp.**  *; 
-dontwarn com.squareup.okhttp.**
-dontwarn rx.**
-dontwarn retrofit.**
-dontwarn okio.**
-keep class retrofit.**  *; 
-keepclasseswithmembers class * 
   @retrofit.http.* <methods>;


-keepnames class com.fasterxml.jackson.**  *; 
-dontwarn com.fasterxml.jackson.databind.**

-keep class butterknife.**  *; 
-dontwarn butterknife.internal.**
-keep class **$$ViewBinder  *; 

-keepclasseswithmembernames class * 
  @butterknife.* <fields>;


-keepclasseswithmembernames class * 
   @butterknife.* <methods>;


-dontwarn com.marshalchen.ultimaterecyclerview.animators.BaseItemAnimator
-dontwarn com.google.appengine.api.urlfetch.**
-dontwarn org.w3c.dom.bootstrap.DOMImplementationRegistry.**

-dontwarn javax.management.**
-dontwarn java.lang.management.**
-dontwarn org.apache.log4j.**
-dontwarn org.apache.commons.logging.**
-dontwarn org.slf4j.**
-dontwarn org.json.**

-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
-keep class javax.**  *; 
-keep class org.**  *; 
-keep class twitter4j.**  *; 

-keepclasseswithmembernames class * 
  native <methods>;


-keepclasseswithmembernames class * 
   public <init>(android.content.Context, android.util.AttributeSet);


-keepclasseswithmembernames class * 
  public <init>(android.content.Context, android.util.AttributeSet, int);


-keepclassmembers enum * 
  public static **[] values();
  public static ** valueOf(java.lang.String);


-keep class * implements android.os.Parcelable 
  public static final android.os.Parcelable$Creator *;

问题是什么,我该如何解决?

【问题讨论】:

你可以查看here如何为android应用添加multidex支持。 @ndeokar 我知道怎么加,不知道proguard有什么问题 【参考方案1】:

你看过这个讨论吗?

Android support multidex library implementation

顺便说一句。我不认为这是 proguard 的问题....

【讨论】:

这个讨论对你有帮助吗?

以上是关于使用 Multidex 的 Android proguard的主要内容,如果未能解决你的问题,请参考以下文章

如何使用新的 Android Multidex 支持库启用多索引

带有 multidex 的 Xamarin Android - 调试模式下的错误

android MultiDex multiDex原理

Android 使用android-support-multidex解决Dex超出方法数的限制问题

使用 Multidex 构建 xamarin.android 时出现 CREATEMULTIDEXMAINDEXCLASSLIST 错误

android MultiDex multidex原理原理下遇见的N个深坑