Android发布APK获取错误NoSuchFieldError

时间:2016-10-04 08:54:35

标签: android android-studio android-gradle apk android-proguard

请帮忙,

这是我第一次使用android studio生成发布APK,尝试了几天后,我可以签署我的项目但是当我安装apk时我总是得到这个错误 ..

7290-7290/? E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.enma.app, PID: 7290
            java.lang.NoSuchFieldError
                at libcore.reflect.AnnotationAccess.decodeValue(AnnotationAccess.java:688)
                at libcore.reflect.AnnotationAccess.toAnnotationInstance(AnnotationAccess.java:663)
                at libcore.reflect.AnnotationAccess.toAnnotationInstance(AnnotationAccess.java:641)
                at libcore.reflect.AnnotationAccess.getDeclaredAnnotation(AnnotationAccess.java:171)
                at libcore.reflect.AnnotationAccess.getAnnotation(AnnotationAccess.java:72)
                at java.lang.Class.getAnnotation(Class.java:359)
                at com.c.a.c.f.al.<clinit>(Unknown Source)
                at com.c.a.c.f.al.a(Unknown Source)
                at com.c.a.c.z.<clinit>(Unknown Source)
                at com.zopim.android.sdk.data.Parser.<init>(Unknown Source)
                at com.zopim.android.sdk.data.Path.<init>(Unknown Source)
                at com.zopim.android.sdk.data.ConnectionPath.<init>(Unknown Source)
                at com.zopim.android.sdk.data.ConnectionPath.<clinit>(Unknown Source)
                at com.zopim.android.sdk.data.PathDataSource.<init>(Unknown Source)
                at com.zopim.android.sdk.api.ZopimChat.<clinit>(Unknown Source)
                at com.enma.app.MyApp.onCreate(Unknown Source)
                at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1018)
                at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4914)
                at android.app.ActivityThread.-wrap1(ActivityThread.java)
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1526)
                at android.os.Handler.dispatchMessage(Handler.java:111)
                at android.os.Looper.loop(Looper.java:207)
                at android.app.ActivityThread.main(ActivityThread.java:5683)
                at java.lang.reflect.Method.invoke(Native Method)
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
            Caused by: java.lang.NoSuchFieldException: No field PUBLIC_ONLY in class Lcom/c/a/a/g; (declaration of 'com.c.a.a.g' appears in /data/app/com.enma.app-1/base.apk)
                at java.lang.Class.getDeclaredField(Native Method)
                at libcore.reflect.AnnotationAccess.decodeValue(AnnotationAccess.java:685)
                at libcore.reflect.AnnotationAccess.toAnnotationInstance(AnnotationAccess.java:663) 
                at libcore.reflect.AnnotationAccess.toAnnotationInstance(AnnotationAccess.java:641) 
                at libcore.reflect.AnnotationAccess.getDeclaredAnnotation(AnnotationAccess.java:171) 
                at libcore.reflect.AnnotationAccess.getAnnotation(AnnotationAccess.java:72) 
                at java.lang.Class.getAnnotation(Class.java:359) 
                at com.c.a.c.f.al.<clinit>(Unknown Source) 
                at com.c.a.c.f.al.a(Unknown Source) 
                at com.c.a.c.z.<clinit>(Unknown Source) 
                at com.zopim.android.sdk.data.Parser.<init>(Unknown Source) 
                at com.zopim.android.sdk.data.Path.<init>(Unknown Source) 
                at com.zopim.android.sdk.data.ConnectionPath.<init>(Unknown Source) 
                at com.zopim.android.sdk.data.ConnectionPath.<clinit>(Unknown Source) 
                at com.zopim.android.sdk.data.PathDataSource.<init>(Unknown Source) 
                at com.zopim.android.sdk.api.ZopimChat.<clinit>(Unknown Source) 
                at com.enma.app.MyApp.onCreate(Unknown Source) 
                at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1018) 
                at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4914) 
                at android.app.ActivityThread.-wrap1(ActivityThread.java) 
                at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1526) 
                at android.os.Handler.dispatchMessage(Handler.java:111) 
                at android.os.Looper.loop(Looper.java:207) 
                at android.app.ActivityThread.main(ActivityThread.java:5683) 
                at java.lang.reflect.Method.invoke(Native Method) 
                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789) 
                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679) 

这是我的 gradle

apply plugin: 'com.android.application'

android {

    compileSdkVersion 'Google Inc.:Google APIs:23'
    buildToolsVersion "23.0.2"
    defaultConfig {
        applicationId "com.enma.app"
        minSdkVersion 9
        targetSdkVersion 17
        multiDexEnabled true
        signingConfig signingConfigs.HPAY
    }
    buildTypes {
        release {
            shrinkResources true
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
        }
    }
    packagingOptions {
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/DEPENDENCIES'
    }
    productFlavors {
    }
}

dependencies {
    compile project(':volley')
    compile 'com.android.support:support-v4:18.0.0'
    compile files('libs/disklrucache-2.0.1.jar')
    compile 'com.zopim.android:sdk:1.1.1'
    compile 'com.android.support:appcompat-v7:23.1.1'
    compile files('libs/httpcore-4.4.3.jar')
    compile files('libs/httpclient-4.5.1.jar')
    compile 'com.android.support:multidex:1.0.0'
}

非常感谢任何帮助。

谢谢

感谢回复这是我的计划,现在我的应用程序可以正常工作,但为什么混淆不适用于某些来源。

enter image description here

Proguard的

# This is a configuration file for ProGuard.
# http://proguard.sourceforge.net/index.html#manual/usage.html
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-verbose

# Optimization is turned off by default. Dex does not like code run
# through the ProGuard optimize and preverify steps (and performs some
# of these optimizations on its own).
#-dontoptimize
#-dontpreverify

# If you want to enable optimization, you should include the
# following:
-optimizations !code/simplification/arithmetic,!code/simplification/cast,!field/*,!class/merging/*
-optimizationpasses 5
-allowaccessmodification
#
# Note that you cannot just include these flags in your own
# configuration file; if you are including this file, optimization
# will be turned off. You'll need to either edit this file, or
# duplicate the contents of this file and remove the include of this
# file from your project's proguard.config path property.
-dontwarn **

-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 public class * implements java.io.Serializable
-keep public class * extends android.support.v4.app.Fragment
-keep public class * extends android.support.v4.app.ListFragment

-keep class com.android.volley.** { *; }
-keep interface com.android.volley.** { *; }
-keep class com.fasterxml.jackson.** {*;}
-keep class com.zopim.android.** {*;}
-keep class org.apache.http.** {*;}

-ignorewarnings

-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 *;
}

-keepclassmembers class * implements java.io.Serializable {
    static final long serialVersionUID;
    private static final java.io.ObjectStreamField[] serialPersistentFields;
    private void writeObject(java.io.ObjectOutputStream);
    private void readObject(java.io.ObjectInputStream);
    java.lang.Object writeReplace();
    java.lang.Object readResolve();
}

1 个答案:

答案 0 :(得分:10)

问题显然在班级com.c.a.c.f.al的一个注释中。它似乎试图访问类PUBLIC_ONLY中出现的名为com.c.a.a.g的字段。

要弄清楚com.c.a.c.f.alcom.c.a.a.g是什么,只需查看ProGuard生成的mappings.txt文件(通常出现在 build / outputs / mapping /.../中mapping.txt )并在混淆之前搜索显示这些类的名称的行。映射会有这样的条目:

com.yourapp.class1 -> com.c.a.c.f.al

找到包含PUBLIC_ONLY的类后,请确保通过在ProGuard配置文件中添加与此类似的行来将其排除在混淆之外:

-keep class com.yourapp.class1 { *; }

如果此方法有效,则应尝试将PUBLIC_ONLY替换为*;

之类的*** PUBLIC_ONLY;字段。