Android 已签名的应用程序崩溃,未签名的apk正在运行

Android 已签名的应用程序崩溃,未签名的apk正在运行,android,proguard,android-proguard,Android,Proguard,Android Proguard,这个问题可能与一些问题有关,因为我在这里搜索了很多,但没有任何帖子对我有所帮助。我的应用程序在未签名时运行,但在运行已签名的APK时立即崩溃。我将其可调试true放在gradle中,并检查我发现的错误logcat java.lang.NoSuchFieldError: No static field REPLACE of type Lcom/a/a/a$a; in class Lcom/a/a/a$a; or its superclasses (declaration of 'com.a.a.a

这个问题可能与一些问题有关,因为我在这里搜索了很多,但没有任何帖子对我有所帮助。我的应用程序在未签名时运行,但在运行已签名的APK时立即崩溃。我将其
可调试true
放在gradle中,并检查我发现的错误logcat

java.lang.NoSuchFieldError: No static field REPLACE of type Lcom/a/a/a$a; in class Lcom/a/a/a$a; or its superclasses (declaration of 'com.a.a.a$a' appears in /data/app/com.aami.aruman.com-J1sPXkw9O_ZNL4zfcpqgMQ==/base.apk)
    at java.lang.reflect.Field.getAnnotationNative(Native Method)
    at java.lang.reflect.Field.getAnnotation(Field.java:847)
    at com.a.g.<init>(Unknown Source:94)
    at com.a.f.a(Unknown Source:97)
    at com.a.f.a(Unknown Source:126)
    at com.a.f.<init>(Unknown Source:27)
    at com.a.b.a(Unknown Source:22)
    at com.a.a.a(Unknown Source:3)
    at com.a.a.a(Unknown Source:1)
    at com.a.a.a(Unknown Source:9)
    at com.a.b.a.onCreate(Unknown Source:3)
    at com.aami.aruman.com.codingnation.base.DroiderApplication.onCreate(Unknown Source:0)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1120)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5747)
    at android.app.ActivityThread.-wrap1(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6501)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
07-12 22:22:18.355 13073-13073/com.aami.aruman.com E/UncaughtException: java.lang.NoSuchFieldError: No static field REPLACE of type Lcom/a/a/a$a; in class Lcom/a/a/a$a; or its superclasses (declaration of 'com.a.a.a$a' appears in /data/app/com.aami.aruman.com-J1sPXkw9O_ZNL4zfcpqgMQ==/base.apk)
    at java.lang.reflect.Field.getAnnotationNative(Native Method)
    at java.lang.reflect.Field.getAnnotation(Field.java:847)
    at com.a.g.<init>(Unknown Source:94)
    at com.a.f.a(Unknown Source:97)
    at com.a.f.a(Unknown Source:126)
    at com.a.f.<init>(Unknown Source:27)
    at com.a.b.a(Unknown Source:22)
    at com.a.a.a(Unknown Source:3)
    at com.a.a.a(Unknown Source:1)
    at com.a.a.a(Unknown Source:9)
    at com.a.b.a.onCreate(Unknown Source:3)
    at com.aami.aruman.com.codingnation.base.DroiderApplication.onCreate(Unknown Source:0)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1120)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5747)
    at android.app.ActivityThread.-wrap1(Unknown Source:0)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1656)
    at android.os.Handler.dispatchMessage(Handler.java:106)
    at android.os.Looper.loop(Looper.java:164)
    at android.app.ActivityThread.main(ActivityThread.java:6501)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
最后是
proguard

-dontwarn org.apache.**
-dontwarn javax.annotation.**
-dontwarn com.squareup.picasso.**
-dontwarn okio.**
-keep class com.google.**
-dontwarn com.google.**
-keepattributes Signature
-dontwarn retrofit2.Platform$Java8
# For using GSON @Expose annotation
-keepattributes *Annotation*
-dontwarn org.**
-dontwarn javax.**
# Gson specific classes
-keep class sun.misc.Unsafe { *; }
-keep class com.google.gson.stream.** { *; }


-keep class com.squareup.okhttp.{ *; }
-dontwarn com.squareup.okhttp.**
-keep class com.facebook.{ *; }
-dontwarn com.facebook.**
-keep class ohttp3.{ *; }
-dontwarn okhttp3.**
-keep class org.joda.{ *; }
-dontwarn org.joda.**
-keepclassmembers class * {

    private <fields>;
    }
    # Proguard configuration for Jackson 2.x (fasterxml package instead of codehaus package)
    -keep class com.fasterxml.jackson.databind.ObjectMapper {
        public <methods>;
        protected <methods>;
    }
    -keep class com.fasterxml.jackson.databind.ObjectWriter {
        public ** writeValueAsString(**);
    }
    -keepnames class com.fasterxml.jackson.** { *; }

-keepclassmembers class com.aami.aruman.com.codingnation.beans.** { *; }


-dontwarn com.fasterxml.jackson.databind.**
-dontwarn org.springframework.**
-dontwarn org.apache**
-dontwarn javax.annotation**
-dontwarn com.squareup.picasso**
-唐特沃恩·奥基奥**
-保持类com.google**
-dontwarn com.google**
-保留署名
-dontwarn 2.Platform$Java8
#用于使用GSON@Expose注释
-keepattributes*注释*
-唐特沃恩组织**
-DontwarnJavax**
#Gson特定类
-保持类sun.misc.Unsafe{*;}
-保持类com.google.gson.stream.*{*;}
-保持类com.squareup.okhttp.{*;}
-dontwarn com.squareup.okhttp**
-保持类com.facebook.{*;}
-dontwarn com.facebook**
-保持类ohttp3.{*;}
-dontwarn okhttp3**
-保持类org.joda.{*;}
-dontwarn org.joda**
-keepclassmembers类*{
私有的
}
#Jackson 2.x的Proguard配置(fasterxml包而不是codehaus包)
-keep类com.fasterxml.jackson.databind.ObjectMapper{
平民的
受保护的;
}
-保留com.fasterxml.jackson.databind.ObjectWriter类{
公共**writeValueAsString(**);
}
-keepnames类com.fasterxml.jackson.*{*;}
-keepclassmembers类com.aami.aruman.com.codingnation.beans.*{*;}
-dontwarn com.fasterxml.jackson.databind**
-dontwarn org.springframework**

关于Proguard

Proguard主要通过做两件事使您的代码更小,更难进行反向工程:

  • 剥离未使用的代码
  • 通过将您编写的可读符号重命名为尽可能小(且难以读取)的名称来混淆包和符号名称
  • 关于您的问题

    看起来有什么东西在使用Java反射来查找名为REPLACE的字段,但是这个字段被proguard弄糊涂了

    从发布的堆栈跟踪中,可以看到:

    com.a.g.<init>(Unknown Source:94)
    
    其中:

    • mapping.txt是proguard在运行时创建的映射文件
    • stacktrace.txt包含您在问题中发布的原始堆栈跟踪
    • out.txt是接收未模糊堆栈跟踪的文件名
    一旦你明白了这一点,你就需要在你的proguard配置文件中添加一个,以防止它被混淆。或者,如果可以的话,可以去掉反射代码

    最后,如果进行反射调用的代码来自您不拥有的库,我将查看该库的文档,看看它是否调用了您应该添加到proguard配置文件中的任何保留规则,并添加它们


    有关解码模糊堆栈跟踪的更多信息,请参阅文档。

    关于Proguard

    Proguard主要通过做两件事使您的代码更小,更难进行反向工程:

  • 剥离未使用的代码
  • 通过将您编写的可读符号重命名为尽可能小(且难以读取)的名称来混淆包和符号名称
  • 关于您的问题

    看起来有什么东西在使用Java反射来查找名为REPLACE的字段,但是这个字段被proguard弄糊涂了

    从发布的堆栈跟踪中,可以看到:

    com.a.g.<init>(Unknown Source:94)
    
    其中:

    • mapping.txt是proguard在运行时创建的映射文件
    • stacktrace.txt包含您在问题中发布的原始堆栈跟踪
    • out.txt是接收未模糊堆栈跟踪的文件名
    一旦你明白了这一点,你就需要在你的proguard配置文件中添加一个,以防止它被混淆。或者,如果可以的话,可以去掉反射代码

    最后,如果进行反射调用的代码来自您不拥有的库,我将查看该库的文档,看看它是否调用了您应该添加到proguard配置文件中的任何保留规则,并添加它们



    有关解码模糊堆栈跟踪的详细信息,请参阅文档。

    在proguard规则“-keepclassmembers类com.aami.aruman.com.codingnation.beans.*{;}”中使用“-keepclassmembers类com.aami.aruman.com.codingnation.*{;}更改此行这没有帮助。这次的错误消息是相同的还是不同的?你能检查一下吗?它和以前的一样。很难解决这个问题,因为我们看不到你的类结构和你的代码。必须使用映射文件来准确地找出失败的地方:(在你的proguard规则中更改这一行)-keepclassmembers类com.aami.aruman.com.codingnation.beans.*{;}“使用此”-keepclassmembers类com.aami.aruman.com.codingnation.*{;}而trythis没有帮助。这次的错误消息是相同的还是不同的?你能检查一下吗?它和以前的一样。很难解决这个问题,因为我们看不到你的类结构和你的代码。必须使用映射文件准确地找出它失败的地方:(不管这是什么:com.a.g.(未知来源:94)。它正在进行一个反射调用。您必须解开堆栈跟踪以找出它是什么。@CodingNation这是一个模糊的包名。按照Michael的建议查找映射文件。Right-proguard通过做两件事基本上使您的代码更小,更难进行反向工程:1)剥离未使用的代码2)通过将您编写的人类可读符号重命名为尽可能小的名称来混淆符号名称。我正在尝试理解您的意思,我访问了proguard.sh和retrace.sh现在要做什么?好的,现在我也有mapping.txt。现在怎么办?不管这是什么:com.a.g.(未知来源:94)。这是一个深思熟虑的电话。您必须对堆栈跟踪进行解模糊处理,以确定它是什么
    <androidsdkroot>/tools/proguard/bin/retrace.sh -verbose mapping.txt stacktrace.txt > out.txt