2013-02-15 36 views
1

當我的android應用程序啓動時,會引發以下異常:Proguard with AbstractModule

can't instantiate class com.project.modules.ClientServicesModule; no empty constructor 

我的模塊類看起來像下面這樣;

public class ClientServicesModule 
    extends AbstractModule 
{ 

    private Context context; 

    public ClientServicesModule(Context context) 
    { 
     this.context = context; 
    } 


    @Override 
    protected void configure(){ 

     .... 

     bind(new TypeLiteral<Dao<City, Integer>>() 
     { 
     }).toProvider(new DaoProvider<City, Integer>(OpenHelperManager.getHelper(context, DatabaseHelper.class).getConnectionSource(), City.class)) 
      .in(Singleton.class); 

     ... 
     } 
} 

我Proguard的文件:

-target 1.6 

-verbose 
-dump ../bin/class_files.txt 
-printseeds ../bin/seeds.txt 
-printusage ../bin/unused.txt 
-printmapping ../bin/mapping.txt 

-optimizationpasses 5 
-dontusemixedcaseclassnames 
-dontskipnonpubliclibraryclasses 
-dontpreverify 
-verbose 
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* 
-ignorewarnings 
-renamesourcefileattribute SourceFile 
-keepattributes SourceFile,LineNumberTable,*Annotation*,Signature 

-dontwarn org.apache.** 
-dontwarn org.joda.** 
-dontwarn roboguice.** 
-dontwarn com.google.** 
-dontwarn org.slf4j.** 
-dontwarn twitter.** 
-dontnote 
-dontwarn **CompatHoneycomb 

# roboguice's jar has testing classes in it which don't resolve because the Android testing classes aren't available for non-testing 
-dontwarn roboguice.test.RoboActivityUnitTestCase 
-dontwarn roboguice.test.RoboUnitTestCase 

-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.app.Fragment 
-keep public class * extends android.support.v4.app.Fragment 
-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 com.google.inject.AbstractModule 
-keep public class com.android.vending.licensing.ILicensingService 
-keep class com.google.inject.** { *; } 
-keep class javax.inject.** { *; } 
-keep class javax.annotation.** { *; } 
-keep class roboguice.** { *; } 

-keepclasseswithmembers 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 * implements android.os.Parcelable { static android.os.Parcelable$Creator *; } 
-keepclassmembers class **.R$* { public static <fields>; } 
-keepclasseswithmembernames class * { native <methods>; } 
-keepclassmembers enum * { 
    public static **[] values(); 
    public static ** valueOf(java.lang.String); 
} 
-keepclassmembers class * extends android.app.Activity { 
    public void *(android.view.View); 
} 
-keepclassmembers class * { 
    @com.google.inject.Inject <init>(...); 
    @com.google.inject.Inject <fields>; 
    @javax.annotation.Nullable <fields>; 
} 
-keepclassmembers class * { 
    void *(net.eworldui.videouploader.events.*); 
} 
-keepclassmembers class * { 
    void *(roboguice.activity.event.*); 
} 

我的ProGuard配置工作,如果我添加一個空的構造函數,但隨後道不會加載爲空被傳遞到數據庫幫手。

如果我從我的pom.xml中刪除ProGuard步驟,一切都按預期工作。

的問題是如何使proguard的,這樣的模塊類可以與上下文中傳遞啓動。

謝謝。

回答

2

嘗試下面的行添加到您的Proguard.config:

-keep public class * extends com.project.modules.ClientServicesModule { 
    <fields>; 
    <methods>; 
} 

,看看問題是否解決

編輯:

您可以通過定義保持整個命名空間:

-keep class com.project.modules.** {*;} 

如果有效,您可以嘗試排除其他不需要的人。看看我的第一個編輯

+0

沒有工作,我假設行-keep public class * extends com.google.inject.AbstractModule會照顧這個嗎? – user1859465 2013-02-15 17:15:39

+0

對不起,我不知道'ClientServicesModule'實際上是'AbstractServerModule'的一個子類...,它們也有不同的命名空間。呦可以保留一個完整的命名空間,只是看看我的編輯 – 2013-02-15 17:20:39

+0

作品一種享受......猜我會不得不慢慢建立我的測試與proguard因爲有更多的錯誤... – user1859465 2013-02-15 17:40:53