Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/186.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
应用程序在1.6上运行得很好,但为什么我在运行1.6的Xperia X10上得到java.lang.VerifyError?_Java_Android_Proguard - Fatal编程技术网

应用程序在1.6上运行得很好,但为什么我在运行1.6的Xperia X10上得到java.lang.VerifyError?

应用程序在1.6上运行得很好,但为什么我在运行1.6的Xperia X10上得到java.lang.VerifyError?,java,android,proguard,Java,Android,Proguard,我的应用程序在模拟和真实的1.6设备上都能完美运行。然而,索尼Xperia X10系列(运行1.6)因java.lang.Verify错误而崩溃。这让我相信ProGuard优化可能是罪魁祸首,但如果是这样的话,运行1.6的每个设备上都会出现问题,而不仅仅是X10吗 以下是堆栈跟踪: java.lang.VerifyError: com.twocell.walkabout.Animator at com.twocell.walkabout.Main.void onCreate(android.os

我的应用程序在模拟和真实的1.6设备上都能完美运行。然而,索尼Xperia X10系列(运行1.6)因java.lang.Verify错误而崩溃。这让我相信ProGuard优化可能是罪魁祸首,但如果是这样的话,运行1.6的每个设备上都会出现问题,而不仅仅是X10吗

以下是堆栈跟踪:

java.lang.VerifyError: com.twocell.walkabout.Animator
at com.twocell.walkabout.Main.void onCreate(android.os.Bundle)(SourceFile:197)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2390)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2443)
at android.app.ActivityThread.access$2100(ActivityThread.java:117)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1815)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:123)
at android.app.ActivityThread.main(ActivityThread.java:4263)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:521)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
at dalvik.system.NativeStart.main(Native Method)
以下是触发错误的代码(在名为“Animator”的类中):

这被称为:

LinearLayout HeaderBar_Text = (LinearLayout) findViewById(R.id.HeaderBar_Text);
Animator.setLayoutAnimation_textFadeIn(HeaderBar_Text, this); // this is line 197
下面是text_fade_in.xml:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" android:fillAfter="true">
<alpha
    android:fromAlpha="0.0" 
    android:toAlpha="1.0"
    android:duration="1000"
    />
</set>
这是动画师的名字:

static void overrideTransition(Context context)
{
    if (Build.VERSION.SDK_INT > 4)
    {
        VersionHelper.overrideTransition(context);
    }
}
这允许1.6设备运行其余的代码,而不会因不支持的方法而崩溃(多亏了MarkMurphy的这项技术)

现在,包含额外日志数据的堆栈跟踪:

07-19 23:42:29.150: ERROR/dalvikvm(705): Could not find method android.app.Activity.overridePendingTransition, referenced from method com.twocell.walkabout.Animator.overrideTransition
07-19 23:42:29.150: WARN/dalvikvm(705): VFY: unable to resolve virtual method 14: Landroid/app/Activity;.overridePendingTransition (II)V
07-19 23:42:29.150: WARN/dalvikvm(705): VFY:  rejecting opcode 0x6e at 0x0012
07-19 23:42:29.150: WARN/dalvikvm(705): VFY:  rejected Lcom/twocell/walkabout/Animator;.overrideTransition (Landroid/content/Context;)V
07-19 23:42:29.150: WARN/dalvikvm(705): Verifier rejected class Lcom/twocell/walkabout/Animator;
07-19 23:42:29.160: DEBUG/AndroidRuntime(705): Shutting down VM
07-19 23:42:29.160: WARN/dalvikvm(705): threadid=3: thread exiting with uncaught exception (group=0x4001aa28)
07-19 23:42:29.160: ERROR/AndroidRuntime(705): Uncaught handler: thread main exiting due to uncaught exception
07-19 23:42:29.160: ERROR/AndroidRuntime(705): java.lang.VerifyError: com.twocell.walkabout.Animator
07-19 23:42:29.160: ERROR/AndroidRuntime(705):     at com.twocell.walkabout.Main.onCreate(SourceFile:199)
07-19 23:42:29.160: ERROR/AndroidRuntime(705):     at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1123)
07-19 23:42:29.160: ERROR/AndroidRuntime(705):     at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2364)
07-19 23:42:29.160: ERROR/AndroidRuntime(705):     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2417)
07-19 23:42:29.160: ERROR/AndroidRuntime(705):     at android.app.ActivityThread.access$2100(ActivityThread.java:116)
07-19 23:42:29.160: ERROR/AndroidRuntime(705):     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
07-19 23:42:29.160: ERROR/AndroidRuntime(705):     at android.os.Handler.dispatchMessage(Handler.java:99)
07-19 23:42:29.160: ERROR/AndroidRuntime(705):     at android.os.Looper.loop(Looper.java:123)
07-19 23:42:29.160: ERROR/AndroidRuntime(705):     at android.app.ActivityThread.main(ActivityThread.java:4203)
07-19 23:42:29.160: ERROR/AndroidRuntime(705):     at java.lang.reflect.Method.invokeNative(Native Method)
07-19 23:42:29.160: ERROR/AndroidRuntime(705):     at java.lang.reflect.Method.invoke(Method.java:521)
07-19 23:42:29.160: ERROR/AndroidRuntime(705):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:791)
07-19 23:42:29.160: ERROR/AndroidRuntime(705):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:549)
07-19 23:42:29.160: ERROR/AndroidRuntime(705):     at dalvik.system.NativeStart.main(Native Method)
就是这样——当我使用ProGuard时,仅在X10上,它仍然看到
覆盖了Transition
并崩溃。(我确认X10/is/报告“4”为其API版本。)

最后,我的proguard.cfg:

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-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 class com.android.vending.billing.**

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

#ACRA specifics
# we need line numbers in our stack traces otherwise they are pretty useless
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

# ACRA needs "annotations" so add this... 
-keepattributes *Annotation*

# keep this class so that logging will show 'ACRA' and not a obfuscated name like 'a'.
# Note: if you are removing log messages elsewhere in this file then this isn't necessary
-keep class org.acra.ACRA {
        *;
}

# keep this around for some enums that ACRA needs
-keep class org.acra.ReportingInteractionMode {
   *;
}

# keep this otherwise it is removed by ProGuard
-keep public class org.acra.ErrorReporter
{
public void addCustomData(java.lang.String,java.lang.String);
}

# keep this otherwise it is removed by ProGuard
-keep public class org.acra.ErrorReporter
{
public org.acra.ErrorReporter$ReportsSenderWorker   handleSilentException(java.lang.Throwable);
}

-keep class org.acra.ReportField {*;}
-优化过程5
-dontusemixedcaseclassnames
-DontskipnonPublicLibraryClass
-不要翻转
-冗长的
-优化!代码/简化/算术,!字段/*,!类/合并/*
-keep public class*扩展android.app.Activity
-keep public class*扩展android.app.Application
-keep public class*扩展了android.app.Service
-keep public class*扩展了android.content.BroadcastReceiver
-keep public class*扩展了android.content.ContentProvider
-keep public class*扩展了android.app.backup.BackupAgentHelper
-keep public class*扩展了android.preference.preference
-保持公共类com.android.vending.licensing.ILicensingService
-保留com.android.vending.billing类**
-KeepClassSwithMemberNames类*{
出生地的
}
-keepclassswithmembers类*{
public(android.content.Context、android.util.AttributeSet);
}
-keepclassswithmembers类*{
public(android.content.Context,android.util.AttributeSet,int);
}
-keepclassmembers类*扩展了android.app.Activity{
public void*(android.view.view);
}
-keepclassmembers枚举*{
公共静态**[]值();
公共静态**valueOf(java.lang.String);
}
-keep class*实现android.os.Parcelable{
公开静态最终android.os.Parcelable$Creator*;
}
#ACRA细节
#我们需要在堆栈跟踪中使用行号,否则它们将毫无用处
-重命名SourceFileAttribute源文件
-keepattributes源文件,LineNumberTable
#ACRA需要“注释”,所以添加此。。。
-keepattributes*注释*
#保留该类,以便日志记录将显示“ACRA”,而不是像“a”这样的模糊名称。
#注意:如果要删除此文件中其他位置的日志消息,则不需要这样做
-保持类org.acra.acra{
*;
}
#为ACRA需要的一些枚举保留此项
-保持类org.acra.ReportingInteractionMode{
*;
}
#保留此文件,否则ProGuard会将其删除
-保持公共类org.acra.ErrorReporter
{
public void addCustomData(java.lang.String、java.lang.String);
}
#保留此文件,否则ProGuard会将其删除
-保持公共类org.acra.ErrorReporter
{
public org.acra.ErrorReporter$ReportsUnderWorker handleSilentException(java.lang.Throwable);
}
-保持类org.acra.ReportField{*;}
有什么想法吗

编辑2
在ProGuard中使用
-dontoptimize
,应用程序可以在X10上运行。我正在潜入一个解决方案。

您的
com.twocell.walkabout.Animator
类实现指的是Xperia X10上不存在的某些类或方法。它不必局限于静态
setLayouTimation\u textFadeIn()
方法中的某些内容——它可以是该类上的任何内容。不幸的是,
VerifyError
没有说明找不到的内容

您必须仔细检查您的应用程序,并确定Xperia X10在其他地方可能缺少什么

但是如果是这样的话,问题不就存在于运行1.6的每个设备上,而不仅仅是X10吗


是的。

解决方案是添加
-优化!方法/inline/unique
到proguard.cfg,根据proguard的文档,proguard.cfg通常“内联只调用一次的方法”。我希望我能说我明白了这一点,而不排除每一个优化,然后在构建签名版本时逐个删除它们。。。但那正是我所做的

编辑(新信息)

当我继续工作时,我发现我的应用程序的其他部分在X10上崩溃,需要其他特定的优化排除才能正常工作。我还开始看到一种模式,它包含来自其他特定设备的崩溃报告,这种情况根本不应该发生,事实上,在我自己的测试设备和模拟器上也不会发生

我不得不得出结论,在这一点上我不能相信ProGuard的优化。由于问题只发生在特定的设备上,我更倾向于将责任归咎于制造商的定制,而不是ProGuard。我无法找到两者之间的实际联系

因此,我的最终解决方案是使用
-dontoptimize
,或者因为无法解决的问题而冒着获得一星级评论的风险。整洁的直到现在,我还从来没有抱怨过平台碎片。这个特别的发现令人非常失望

编辑2(后续)


由于我推动了一个更新,彻底删除了优化,所有崩溃都停止了。现在我终于可以回到功能开发了。

ProGuard的优化步骤将内联诸如VersionHelper#overrideTransition()之类的方法,这不是您想要的,因为该方法旨在隔离对1.6的依赖(尽管ProGuard不知道这一点)

暴力解决方案:关闭所有优化:

-dontoptimize
细粒度:关闭所有方法内联(如您所发现的):

-optimizationpasses 5
-dontusemixedcaseclassnames
-dontskipnonpubliclibraryclasses
-dontpreverify
-verbose
-optimizations !code/simplification/arithmetic,!field/*,!class/merging/*

-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 class com.android.vending.billing.**

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

#ACRA specifics
# we need line numbers in our stack traces otherwise they are pretty useless
-renamesourcefileattribute SourceFile
-keepattributes SourceFile,LineNumberTable

# ACRA needs "annotations" so add this... 
-keepattributes *Annotation*

# keep this class so that logging will show 'ACRA' and not a obfuscated name like 'a'.
# Note: if you are removing log messages elsewhere in this file then this isn't necessary
-keep class org.acra.ACRA {
        *;
}

# keep this around for some enums that ACRA needs
-keep class org.acra.ReportingInteractionMode {
   *;
}

# keep this otherwise it is removed by ProGuard
-keep public class org.acra.ErrorReporter
{
public void addCustomData(java.lang.String,java.lang.String);
}

# keep this otherwise it is removed by ProGuard
-keep public class org.acra.ErrorReporter
{
public org.acra.ErrorReporter$ReportsSenderWorker   handleSilentException(java.lang.Throwable);
}

-keep class org.acra.ReportField {*;}
-dontoptimize
-optimizations !method/inlining/*
-keepclassmembers,allowobfuscation,allowshrinking somepackage.VersionHelper {
  <methods>;
}