【问题标题】:App crashes while generating Signed apk with obfuscation (NoSuchMethodError)应用程序在生成带有混淆的签名 apk 时崩溃 (NoSuchMethodError)
【发布时间】:2017-04-25 04:06:10
【问题描述】:

我正面临这个特殊的问题,即我的应用程序在生成带有混淆的签名 apk (progaurd) 时一启动就崩溃。我的 progaurd 如下所示:

-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.view.View {
public <init>(android.content.Context);
public <init>(android.content.Context, android.util.AttributeSet);
public <init>(android.content.Context, android.util.AttributeSet, int);
public void set*(...);
}

-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.content.Context {
 public void *(android.view.View);
 public void *(android.view.MenuItem);
 }

-keepclassmembers class * implements android.os.Parcelable {
 static ** CREATOR;
 }

-keepclassmembers class **.R$* {
public static <fields>;
 }


 -keepattributes Exceptions,InnerClasses,Signature

  -keep class com.google.api.client.**
  -keepclassmembers class com.google.api.client.** {
  *;
   }


 -keep class com.google.android.gms.**
 -keepclassmembers class com.google.android.gms.** {
 *;
  }
 -keep class com.google.gson.**
 -keepclassmembers class com.google.gson.** {
 *;
 }



-keep class com.google.api.client.** { *; }
-dontwarn com.google.api.client.*
-keep class org.apache.http.** { *; }
-dontwarn org.apache.http.*

-dontnote org.apache.http.**
-dontwarn java.awt.**
-dontwarn org.postgresql.**

-dontwarn javax.activation.**
-dontnote javax.activation.**

-dontwarn myjava.awt.datatransfer.**
-dontnote myjava.awt.datatransfer.**


-dontwarn com.google.android.gms.**
-keep class com.google.android.gms.**
# The official support library.
-keep class android.support.v4.** { *; }
-keepclassmembers class android.support.v4.** {
 *;
 }
 -keep interface android.support.v4.** { *; }
 -keep class android.support.v7.** { *; }


-keepclassmembers class android.support.v7.** {
*;
}
-keep interface android.support.v7.** { *; }

-keep class org.apache.http.** { *; }
-keepclassmembers class org.apache.http.** {*;}
-dontwarn org.apache.**


-keep class org.codehaus.mojo.animal_sniffer.** { *; }
-keep class java.nio.file.** { *; }
-keep class java.lang.invoke.** { *; }

-keepclassmembers class com.fasterxml.jackson.core.**

-keepclassmembers class org.codehaus.mojo.animal_sniffer.**
-keepclassmembers class java.nio.file.**
-keepclassmembers class java.lang.invoke.**
-enter code here`-dontwarn retrofit2.**
-keep class retrofit2.** { *; }
-keepclasseswithmembers class * {
@retrofit2.http.* <methods>;
}

-keep class android.net.http.** { *; }
-keepclassmembers class android.net.http.** {*;}
-dontwarn android.net.**

我能够生成签名的 apk,但如果启动此应用程序,应用程序会崩溃并引发以下错误:

java.lang.NoSuchMethodError: No interface method i()I in class 
Landroid/content/res/XmlResourceParser; or its super classes (declaration of 
'android.content.res.XmlResourceParser' appears in 
/system/framework/framework.jar)
                                                   at 
android.support.v4.content.FileProvider.parsePathStrategy(Unknown Source)
                                                   at 
android.support.v4.content.FileProvider.getPathStrategy(Unknown Source)
                                                   at 
android.support.v4.content.FileProvider.attachInfo(Unknown Source)
                                                   at 
android.app.ActivityThread.installProvider(ActivityThread.java:6762)
                                                   at 
android.app.ActivityThread.installContentProviders(ActivityThread.java:6357)

如果我遗漏了 progaurd 文件或任何其他配置中的任何内容(在 build.gradle 中我提到了 minifyEnabled true 和 proguard 路径),任何人都可以提出建议。

【问题讨论】:

  • 我认为您已在应用级别的 gradle 文件中应用了 progaurd 规则。当您这样做时,所有未使用的资源和类都将被忽略,并且将根据您的请求生成 APK。所以你正面临这个问题。

标签: android android-studio obfuscation signed-apk


【解决方案1】:

你可以使用jar包包含XmlPullParser类,添加这个可以解决。

-keep class org.xmlpull.v1.** { *;} -dontwarn org.xmlpull.v1.**

【讨论】:

    【解决方案2】:

    由于某种原因,当我更改时解决了这个问题

    buildTypes {
        release { ...
         minifyEnabled true
         shrinkResources true
      }}
    

    到这里

    buildTypes {
        release { ...
         minifyEnabled false
      }}
    

    【讨论】:

    • 它完全消除了缩小和混淆。显然在添加 minify 之前,没有问题(并且没有大小崩溃,也没有安全性)
    猜你喜欢
    • 2016-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    相关资源
    最近更新 更多