1

Android アプリの起動時に次の例外がスローされます。

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 構成が機能しますが、null がデータベース ヘルパーに渡されるため、dao が読み込まれません。

Pom.xml から ProGuard ステップを削除すると、すべてが期待どおりに機能します。

問題は、渡されたコンテキストでモジュール クラスを起動できるように、proguard を有効にする方法です。

ありがとうございました。

4

1 に答える 1

2

次の行を Proguard.config に追加してみてください。

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

エラーが続くかどうかを確認します

編集:

以下を定義することで、名前空間全体を保持できます。

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

それが機能する場合は、その後、必要のない他のユーザーを除外してみてください。私の最初の編集も見てください

于 2013-02-15T16:34:04.633 に答える