为什么使用proguard构建的apk无法正常工作?

3

当我从我的IDE(Android Studio)创建并启动应用程序时,该应用程序运作良好。但是,当我生成APK文件后,应用程序会崩溃,但我无法弄清楚原因。我看到有错误日志,发现出现了分段错误(SIGSEGV),但如何找出问题所在呢?

10-21 10:14:00.323  29764-29764/? I/Vitamio﹕ LIB ROOT: /data/data/com.iptviq.mobile.android.skynettv/libs/
10-21 10:14:00.323  29764-29764/? D/dalvikvm﹕ Trying to load lib /data/data/com.iptviq.mobile.android.skynettv/libs/libstlport_shared.so 0x418308b0
10-21 10:14:00.323  29764-29764/? D/dalvikvm﹕ Added shared lib /data/data/com.iptviq.mobile.android.skynettv/libs/libstlport_shared.so 0x418308b0
10-21 10:14:00.323  29764-29764/? D/dalvikvm﹕ No JNI_OnLoad found in /data/data/com.iptviq.mobile.android.skynettv/libs/libstlport_shared.so 0x418308b0, skipping init
10-21 10:14:00.323  29764-29764/? D/dalvikvm﹕ Trying to load lib /data/data/com.iptviq.mobile.android.skynettv/libs/libvplayer.so 0x418308b0
10-21 10:14:00.323  29764-29764/? D/dalvikvm﹕ Added shared lib /data/data/com.iptviq.mobile.android.skynettv/libs/libvplayer.so 0x418308b0
10-21 10:14:00.323  29764-29764/? W/dalvikvm﹕ Exception thrown (Ljava/lang/NoSuchMethodError;) while throwing internal exception (Ljava/lang/NoSuchMethodError;)
10-21 10:14:00.323  29764-29764/? W/dalvikvm﹕ Exception thrown (Ljava/lang/NoSuchMethodError;) while throwing internal exception (Ljava/lang/NoSuchMethodError;)
10-21 10:14:00.323  29764-29764/? A/libc﹕ Fatal signal 11 (SIGSEGV) at 0x0000002c (code=1), thread 29764 (ndroid.skynettv)

我的Proguard:

-dontwarn org.xmlpull.**
-keep class org.acra.ReportingInteractionMode { *; }

-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

-dontobfuscate
-dontoptimize


-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose

-keep public class org.spongycastle.** {
  <fields>;
  <methods>;
}

-keep public class org.apache.** {
  <fields>;
  <methods>;
}

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

ProGuard警告:
ProGuard: [SkynetMobile] Note: there were 4 duplicate class definitions.
ProGuard: [SkynetMobile]       You should check if you need to specify additional program jars.
ProGuard: [SkynetMobile] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [vitamio.jar:META-INF/MANIFEST.MF])
ProGuard: [SkynetMobile] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [gson-2.2.2.jar:META-INF/MANIFEST.MF])
ProGuard: [SkynetMobile] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [nineoldandroids-2.4.0.jar:META-INF/MANIFEST.MF])
ProGuard: [SkynetMobile] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [libGoogleAnalyticsServices.jar:META-INF/MANIFEST.MF])
ProGuard: [SkynetMobile] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [android-support-v4.jar:META-INF/MANIFEST.MF])
ProGuard: [SkynetMobile] Warning: can't write resource [META-INF/MANIFEST.MF] (Duplicate zip entry [ksoap2-android-assembly-3.0.0-jar-with-dependencies.jar:META-INF/MANIFEST.MF])
2个回答

2
右键单击您的项目,转到属性,然后从左侧面板中选择Android。然后检查您的项目使用了哪个库? 对于这些库,请在您的proguard.cfg文件中使用以下方式:
-keepclassmembers class * extends com.actionbarsherlock.ActionBarSherlock {
<init>(android.app.Activity, int);
}

如果您在项目中使用的是Java库文件,请在proguard.cfg中使用以下命令:

-libraryjars /libs/libmessaging.jar

1
谢谢,你帮我找到了解决方案。我发现vitamio有bug,所以将vitamio的起始包名(-keep class io.** { *; })添加到proguard配置文件中,然后它就可以工作了! - Ragaisis

0
将以下内容添加到您的proguard.cfg文件中:

-ignorewarnings 

或许这可以帮助你


不行,情况一样:/ 实际上程序开始了,但在视频加载时崩溃了。但如果我通过 USB 从 Android Studio 运行它,它就可以正常工作。 - Ragaisis
我认为Proguard对你的应用程序中使用的某些库进行了编码。因此,你必须找到它并防止Proguard对其进行编码。 - Majid Daeinejad
@Ragaisis 你是在使用jar库还是Android项目库? - Majid Daeinejad
是的,实际上我尝试了取消ProGuard复选框,然后apk构建成功了。哦...很难通过谷歌找出问题所在。 嗯...我是这个项目的新手。有很多库——actionbarSherlock、sliding menu、gson、vtamio... 我怎么才能识别Android项目库呢? - Ragaisis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接