2016-10-04 94 views
1

请帮帮忙,的Android版本APK得到错误NoSuchFieldError

这是我第一次使用机器人工作室生成发布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' 
} 

任何帮助将不胜感激。

谢谢


感谢您的响应,这是我ProGuard的,现在我的应用程序可以正常工作,但为什么混淆了一些来源无法正常工作。

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(); 
} 
+2

后保护档案。 – Shane

+0

您是否创建了一个Application类来扩展MultidexApplication? –

+2

** compileSdkVersion'Google Inc.:Google API:23'** to ** compileSdkVersion“23”** –

回答

9

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

找出com.c.a.c.f.alcom.c.a.a.g是,只认准mappings.txt文件ProGuard的产生(通常出现在构建/输出/映射/...../的mapping.txt)和搜索,显示的线条是什么这些类在被混淆之前被命名。映射会有这样的条目:

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

一旦你找到包含PUBLIC_ONLY类,请确保您通过添加类似这样一行到您的ProGuard配置文件被混淆排除:

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

如果此方法有效,则应尝试仅针对PUBLIC_ONLY字段替换*;,类似*** PUBLIC_ONLY;