web-dev-qa-db-ja.com

Android Java.lang.AssertionErrorでAPKクラッシュをリリース:Java.lang.Enumでは不可能

Gradle for release(ProGuard 4.9および署名済み)を使用してAPKを作成しました。アプリを起動すると、このエラーでクラッシュします:

E/AndroidRuntime( 8662): Java.lang.AssertionError: impossible
E/AndroidRuntime( 8662):    at Java.lang.Enum$1.create(Enum.Java:44)
E/AndroidRuntime( 8662):    at Java.lang.Enum$1.create(Enum.Java:35)
E/AndroidRuntime( 8662):    at libcore.util.BasicLruCache.get(BasicLruCache.Java:54)
E/AndroidRuntime( 8662):    at Java.lang.Enum.getSharedConstants(Enum.Java:210)
E/AndroidRuntime( 8662):    at Java.lang.Enum.valueOf(Enum.Java:190)
E/AndroidRuntime( 8662):    at kr.infli.s.Z(Inflikr.Java:390)
E/AndroidRuntime( 8662):    at kr.infli.a.ev(Inflikr.Java:409)
E/AndroidRuntime( 8662):    at kr.infli.activity.InflikrActivity.onResume(InflikrActivity.Java:231)
E/AndroidRuntime( 8662):    at Android.app.Instrumentation.callActivityOnResume(Instrumentation.Java:1192)
E/AndroidRuntime( 8662):    at Android.app.Activity.performResume(Activity.Java:5310)
E/AndroidRuntime( 8662):    at Android.app.ActivityThread.performResumeActivity(ActivityThread.Java:2778)
E/AndroidRuntime( 8662):    at Android.app.ActivityThread.handleResumeActivity(ActivityThread.Java:2817)
E/AndroidRuntime( 8662):    at Android.app.ActivityThread.handleLaunchActivity(ActivityThread.Java:2250)
E/AndroidRuntime( 8662):    at Android.app.ActivityThread.access$800(ActivityThread.Java:135)
E/AndroidRuntime( 8662):    at Android.app.ActivityThread$H.handleMessage(ActivityThread.Java:1196)
E/AndroidRuntime( 8662):    at Android.os.Handler.dispatchMessage(Handler.Java:102)
E/AndroidRuntime( 8662):    at Android.os.Looper.loop(Looper.Java:136)
E/AndroidRuntime( 8662):    at Android.app.ActivityThread.main(ActivityThread.Java:5017)
E/AndroidRuntime( 8662):    at Java.lang.reflect.Method.invoke(Native Method)
E/AndroidRuntime( 8662):    at com.Android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.Java:779)
E/AndroidRuntime( 8662):    at com.Android.internal.os.ZygoteInit.main(ZygoteInit.Java:595)
E/AndroidRuntime( 8662): Caused by: Java.lang.NoSuchMethodException: values []
E/AndroidRuntime( 8662):    at Java.lang.Class.getMethod(Class.Java:661)
E/AndroidRuntime( 8662):    at Java.lang.Class.getDeclaredMethod(Class.Java:623)
E/AndroidRuntime( 8662):    at Java.lang.Enum$1.create(Enum.Java:41)
E/AndroidRuntime( 8662):    ... 20 more

このエラーは発生しないようです: https://Android.googlesource.com/platform/libcore/+/9edf43dfcc35c761d97eb9156ac4254152ddbc55/libdvm/src/main/Java/java/lang/Enum.Java

私のbuild.gradleには以下が含まれています:

buildTypes {
    release {
        runProguard true
        proguardFile file('./proguard-project.txt')
        signingConfig signingConfigs.release
    }
}

私のproguard-project.txtには

-useuniqueclassmembernames
-keepattributes SourceFile,LineNumberTable

+ a bunch of keep class, dontnote, dontwarn,...

Build.gradleからProGuardを削除しても、クラッシュしません。

AntビルドからProGuardを使用していたとき、それは機能しました(最近、Gradleに移行しました)。

Gradle + ProGuardに関する既知の問題はありますか?

ありがとう

31
ebtokyo

いくつかのenumメソッドを保持するようにProGuardに指示する必要があります。

Android SDKツールは、このProGuard構成を使用して次のことを実現します。

# For enumeration classes, see http://proguard.sourceforge.net/manual/examples.html#enumerations
-keepclassmembers enum * {
    public static **[] values();
    public static ** valueOf(Java.lang.String);
}

上記のルールをProGuard構成に追加するか、(私が好む)デフォルトのAndroidルール:

minifyEnabled true
proguardFile getDefaultProguardFile('proguard-Android.txt')
proguardFile file('./proguard-project.txt')
50
still_learning

エラーのログ

E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.zonaprop.Android, PID: 20337
Java.lang.AssertionError: Missing field in 
...
Caused by: Java.lang.NoSuchFieldException: 
    at Java.lang.Class.getField

次の答えは私のために働いた https://stackoverflow.com/a/30167048/5279996

0
CORONEL Braian