这是我试图在Android 1.6上运行的内容:
package com.healthlogger.test;
public class AllTests extends TestSuite
{
public static Test suite()
{
return new TestSuiteBuilder(AllTests.class).includeAllPackagesUnderHere().build();
}
}
Run Code Online (Sandbox Code Playgroud)
和:
package com.healthlogger.test;
public class RecordTest extends AndroidTestCase
{
/**
* Ensures that the constructor will not take a null data tag.
*/
@Test(expected=AssertionFailedError.class)
public void testNullDataTagInConstructor()
{
Record r = new Record(null, Calendar.getInstance(), "Data");
fail("Failed to catch null data tag.");
}
}
Run Code Online (Sandbox Code Playgroud)
主要项目是HealthLogger.这些是从单独的测试项目(HealthLoggerTest)运行的.HealthLogger和jUnit4位于HealthLoggerTest的构建路径中.jUnit4也在HealthLogger的构建路径中."Record"类位于com.healthlogger中.
注释掉"@Test ..."和"Record r ..."行可以运行此测试.取消注释后,我会收到VerifyError异常.我严重受阻了; 为什么会这样?
编辑:崩溃后来自logcat的一些信息:
E/AndroidRuntime( 3723): Uncaught handler: thread main exiting due to uncaught …Run Code Online (Sandbox Code Playgroud) 我在使用Guava库运行一个简单的主程序时遇到了一些麻烦.
我已经使用我的代码从类中检测了类以获取方法参数:ASM中的Java方法参数值
问题是,虽然代码适用于小型项目(也就是河内之塔),但是使用Guava我有错误和例外.
特别是,在测试Joiner.join方法时,我有这个错误:
Exception in thread "Jalen Agent" java.lang.VerifyError: (class: com/google/common/base/Joiner, method: withKeyValueSeparator signature: (Ljava/lang/String;)Lcom/google/common/base/Joiner$MapJoiner;) Incompatible argument to function
at Main.joinBench(Main.java:42)
at Main.main(Main.java:20)
Run Code Online (Sandbox Code Playgroud)
当使用-noverify运行示例时,我有一个例外:
Exception in thread "Jalen Agent" java.lang.ArrayIndexOutOfBoundsException: 1
at com.google.common.base.Joiner.<init>(Joiner.java)
at com.google.common.base.Joiner.on(Joiner.java:71)
at Main.joinBench(Main.java:42)
at Main.main(Main.java:20)
Run Code Online (Sandbox Code Playgroud)
该方法的字节码是一致的:
public static com.google.common.base.Joiner on(java.lang.String);
Code:
0: bipush 1
2: anewarray #4 // class java/lang/Object
5: astore_1
6: aload_1
7: bipush 0
9: aload_0
10: aastore
11: ldc #20 // int 369
13: ldc #21 // String com/google/common/base/Joiner
15: …Run Code Online (Sandbox Code Playgroud) java bytecode bytecode-manipulation verifyerror java-bytecode-asm
我在Web应用程序启动时遇到异常,因为guice正在尝试构建所提到的类.
java.lang.VerifyError: Inconsistent stackmap frames at branch target 2770 in method com.aptusi.apps.magazine.api.servlet.internal.EditorServlet.service(Ljavax/servlet/http/HttpServletRequest;Ljavax/servlet/http/HttpServletResponse;Ljava/lang/String;Lcom/aptusi/persistence/runtime/framework/DboSession;)V at offset 200
at java.lang.Class.getDeclaredConstructors0(Native Method)
at java.lang.Class.privateGetDeclaredConstructors(Class.java:2483)
at java.lang.Class.getDeclaredConstructors(Class.java:1891)
at com.google.inject.spi.InjectionPoint.forConstructorOf(InjectionPoint.java:243)
at com.google.inject.internal.ConstructorBindingImpl.create(ConstructorBindingImpl.java:96)
at com.google.inject.internal.InjectorImpl.createUninitializedBinding(InjectorImpl.java:629)
at com.google.inject.internal.InjectorImpl.createJustInTimeBinding(InjectorImpl.java:845)
at com.google.inject.internal.InjectorImpl.createJustInTimeBindingRecursive(InjectorImpl.java:772)
at com.google.inject.internal.InjectorImpl.getJustInTimeBinding(InjectorImpl.java:256)
at com.google.inject.internal.InjectorImpl.getBindingOrThrow(InjectorImpl.java:205)
at com.google.inject.internal.InjectorImpl.getBinding(InjectorImpl.java:146)
at com.google.inject.internal.InjectorImpl.getBinding(InjectorImpl.java:66)
at com.google.inject.servlet.ServletDefinition.init(ServletDefinition.java:103)
at com.google.inject.servlet.ManagedServletPipeline.init(ManagedServletPipeline.java:82)
at com.google.inject.servlet.ManagedFilterPipeline.initPipeline(ManagedFilterPipeline.java:102)
at com.google.inject.servlet.GuiceFilter.init(GuiceFilter.java:172)`
Run Code Online (Sandbox Code Playgroud)
我知道-XX:-UseSplitVerifier和-noverify jvm选项,但我不想使用,因为我想确保这个项目中的所有代码至少是java版本7.
为了做到这一点,了解我的代码中究竟发生了什么是有用的,我不清楚所提到的200的偏移是什么,但是它可以与行号相关吗?
也有人知道一种方法,我可以找到我的类路径上的所有类的Java版本,我使用maven所以有很多依赖项,所以我正在寻找一种自动方式在类路径上查找任何类可能已编译为低于1.7的java版本?
我正在使用 powermock.mockstatic 这条线,这样我就可以控制它的返回值,因为它是唯一的摆动,我不必测试它。
@Before
public void setUp() throws Exception
RelatedIntelligencePanel rel = Mockito.mock(RelatedIntelligencePanel.class);
PowerMockito.mockStatic(RelatedIntelligencePanel.class);
PowerMockito.whenNew(RelatedIntelligencePanel.class).withNoArguments().thenReturn(rel);
...
.. some other unrelated code
}
...........
........ some other code and Tests
......
@Test
public class SomeClass{
RelatedIntelligencePanel relIntPanel = new RelatedIntelligencePanel();
Run Code Online (Sandbox Code Playgroud)
但它会抛出java.lang.VerifyError。我曾经嘲笑过很多这样的事情,没有一个例外。删除 @PrepareForTest 和 @Runwith 有帮助,但当我这样做时我会失去 powermock。我的详细错误也在下面;
java.lang.VerifyError: Bad return type
Exception Details:
Location:
javax/swing/plaf/metal/MetalLookAndFeel.getLayoutStyle()Ljavax/swing/LayoutStyle @3: areturn
Reason:
Type 'javax/swing/plaf/metal/MetalLookAndFeel$MetalLayoutStyle' (current frame, stack[0]) is not assignable to 'javax/swing/LayoutStyle' (from method signature)
Current Frame:
bci: @3
flags: { }
locals: { 'javax/swing/plaf/metal/MetalLookAndFeel'}
stack …Run Code Online (Sandbox Code Playgroud) 我修改了下面字节代码的第15行,并将其从invokevirtual更改为invokespecial(JAVA 8)。不幸的是,我收到验证错误(操作数堆栈上的类型错误)
我知道操作数堆栈的值必须是objectref中指定的类的子类,但是在这种情况下,#18是Type而不是Type $ ClassType,如错误提示所示。或者换句话说,第15行的stackmapframe不应在stack [0]中具有Type而不具有Type $ ClassType吗?我想念什么?
编辑:更改前后的stackmapframes相同。(以防我使用的ASM COMPUTE FRAMES更改了它们)
Exception Details:
Location:
com/sun/tools/javac/code/Type$ClassType.toString()Ljava/lang/String; @15: invokespecial
Reason:
Type 'com/sun/tools/javac/code/Type' (current frame, stack[0]) is not assignable to 'com/sun/tools/javac/code/Type$ClassType'
Current Frame:
bci: @15
flags: { }
locals: { 'com/sun/tools/javac/code/Type$ClassType', 'java/lang/StringBuilder' }
stack: { 'com/sun/tools/javac/code/Type', 'com/sun/tools/javac/code/TypeTag' }
...
Stackmap Table:
append_frame(@71,Object[#108])
same_frame(@85)
same_frame(@121)
Run Code Online (Sandbox Code Playgroud)
这是代码。Type $ ClassType是Type的直接子类,com / sun / tools / javac / code / Type $ ClassType是当前的类,它允许我们使用invokespecial调用超类(如Type)
public class com.sun.tools.javac.code.Type$ClassType extends com.sun.tools.javac.code.Type implements
javax.lang.model.type.DeclaredType
....
public java.lang.String toString();
descriptor: ()Ljava/lang/String;
flags: …Run Code Online (Sandbox Code Playgroud) 第三方库升级后,我在应用程序启动时遇到了新的崩溃:
java.lang.VerifyError: Verifier rejected class ly.img.android.e: void ly.img.android.e.<init>(java.lang.String, boolean) failed to verify: void ly.img.android.e.<init>(java.lang.String, boolean): [0x5C] 'this' arg must be initialized (declaration of 'ly.img.android.e' appears in base.apk!classes2.dex)
at ly.img.android.b.<clinit>(Unknown Source:46)
at ly.img.android.c.b(Unknown Source:0)
at ly.img.android.PESDK.initSDK(Unknown Source:0)
at ly.img.android.IMGLYAutoInit.onCreate(IMGLYAutoInit.java:41)
at android.content.ContentProvider.attachInfo(ContentProvider.java:2092)
at android.content.ContentProvider.attachInfo(ContentProvider.java:2066)
at android.app.ActivityThread.installProvider(ActivityThread.java:6983)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:6528)
Run Code Online (Sandbox Code Playgroud)
是的,我知道那里有很多类似的问题,但我没有找到任何解决方案或建议。
所以,也许那里的某个人可以为我提供提示或建议那里出了什么问题。谢谢
我使用jdk 1.7,jekins,maven,当我构建项目时,单元测试失败,错误是:
java.lang.VerifyError:在分支目标处期望堆栈映射表73异常详细信息:Location:com/DataDictDao.save(Lcom/DataDict;)Ljava/lang/Long; @ 25:ldc原因:此位置的预期堆栈图帧.字节代码:0000000:033d 2:11最强音FF3E 1212 1100 25b8 0018 2ab4 0000010:0022 122D B900 3302 0012 1211 0027 B800 0000020:182A B400 352B B900 3A02 0012 1211 0028 0000030:B800 182A B400 2212 3cb9 0033 0200 1212 0000040:1100 2cb8 0018 A700 2D12 1211 0029 B800 0000050:183A 0412 1211 002A B800 182A B400 2212 0000060:3e19 04b9 0042 0300 1212 1100 2bb8 0018 0000070:1904 BF12 1211架002D B800 182B B600 48b8 0000080:004E B0异常处理程序表:BCI [25,62] =>处理程序: 73 Stackmap表:same_locals_1_stack_item_extended(@ 81,Object [#43])same_frame(@ 123)
at java.lang.Class.getDeclaredConstructors0(Native Method)at java.lang.Class.privateGetDeclaredConstructors(Class.java:2493)at java.lang.Class.getDeclaredConstructors(Class.java:1901)at …
我正在将一个应用程序从Eclipse移植到Android Studio,并且在尝试在API小于17的模拟器上运行应用程序时遇到验证错误.我很感激有关如何处理此问题的任何指导.这是在API 8仿真器上的logcat中显示的内容:
12-27 01:48:27.189 431-431/com.zigzagworld.icjl.tanachbible W/dalvikvm: VFY: register1 v10 type 12, wanted 10
12-27 01:48:27.189 431-431/com.zigzagworld.icjl.tanachbible W/dalvikvm: VFY: rejecting opcode 0x70 at 0x005e
12-27 01:48:27.189 431-431/com.zigzagworld.icjl.tanachbible W/dalvikvm: VFY: rejected Lcom/zigzagworld/fonts/GlyphMetrics;.<init> (SSS[S)V
12-27 01:48:27.189 431-431/com.zigzagworld.icjl.tanachbible W/dalvikvm: Verifier rejected class Lcom/zigzagworld/fonts/GlyphMetrics;
Run Code Online (Sandbox Code Playgroud)
紧接着就是应用程序崩溃后立即(毫不奇怪)java.lang.VerifyError.相同的.apk文件将在API级别17及更高级别上正常运行.API 17及更高版本有不同的代码路径,但GlyphMetrics无论API级别如何,都会在某些时候使用该类.(如果不同的代码路径可以对类在加载时是否生成验证错误产生影响,有人请告诉我!)
本GlyphMetrics类是关于我们在应用程序中使用一个自造的位图字体的一些规格信息,非常简单的容器:
package com.zigzagworld.fonts;
import static com.zigzagworld.fonts.Diacritics.LOWER_DIACRITIC;
import static com.zigzagworld.fonts.Diacritics.UPPER_DIACRITIC;
/**
* Represents the layout metrics for a glyph.
*
* @author Ted Hopp
*/
public final class GlyphMetrics {
public static final …Run Code Online (Sandbox Code Playgroud) 我最近向市场推出了我的应用程序,我一直在与一位用户联系,该用户报告说,当他启动我的应用程序时,它会显示强制关闭/报告对话框.我让用户报告错误,以便我可以看到正在发生的堆栈跟踪,并且我得到了java.lang.VerifyError.
根据我的阅读,这与外部库有关,或者在java.lang中的某些方法与目标Android SDK版本不兼容.
用户使用的是Android 2.2.1,但该应用程序目前可以在许多其他2.2设备上运行,所以我试图找出从哪里开始挖掘.
问题: 是否有人建议开始寻找问题的最佳方法是什么?如果需要,我可以提供代码或更多信息,所以请告诉我.
这是堆栈跟踪:
java.lang.VerifyError: com.app.myapp.MainActivity
at java.lang.Class.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1429)
at android.app.Instrumentation.newActivity(Instrumentation.java:1034)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2749)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2866)
at android.app.ActivityThread.access$2300(ActivityThread.java:140)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2181)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:143)
at android.app.ActivityThread.main(ActivityThread.java:5097)
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:868)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
提前致谢!
编辑
根据康斯坦丁的要求添加
MainActivity.java
package com.app.myapp;
//Imports removed
public class MainActivity extends BaseActivity implements Runnable {
private LayoutInflater mInflater;
private SharedPreferences prefs;
private SharedPreferences.Editor prefsEditor;
....
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
loadActivity(savedInstanceState);
}
private …Run Code Online (Sandbox Code Playgroud) 我构建了一个Android应用程序.出于某种原因,我在某些设备(例如Samsung Galaxy)上获得VerifyError,而在其他设备上没有(例如在Nexus 5上).
抛出此行的异常:
AdManager.getInstance().preInit();
Run Code Online (Sandbox Code Playgroud)
exeption堆栈是:
java.lang.VerifyError: org/example/crossword/Ads/AdManager
at org.example.crossword.PuzzleActivity.onCreate(PuzzleActivity.java:55)
at android.app.Activity.performCreate(Activity.java:5255)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1097)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2213)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2299)
at android.app.ActivityThread.access$700(ActivityThread.java:154)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1284)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5306)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
at dalvik.system.NativeStart.main(Native Method)
Run Code Online (Sandbox Code Playgroud)
在尝试找出导致问题的原因之后,我注意到我有这条线:
catch (ReflectiveOperationException e) { ...
Run Code Online (Sandbox Code Playgroud)
当我删除此行,并使用常规Exception时,不会发生VerifyError.
所以,我想知道为什么ReflectiveOperationException会在某些设备上导致此错误?
verifyerror ×10
java ×7
android ×5
bytecode ×2
java-7 ×2
maven ×2
.class-file ×1
eclipse ×1
exception ×1
gradle ×1
gson ×1
java-8 ×1
junit ×1
jvm ×1
powermock ×1
powermockito ×1
reflection ×1
unit-testing ×1
verification ×1