我正在将一个应用程序从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;.(SSS[S)V 12-27 01:48:27.189 431-431/com.zigzagworld.icjl.tanachbible W/dalvikvm: Verifier rejected class Lcom/zigzagworld/fonts/GlyphMetrics;
紧接着就是应用程序崩溃后立即(毫不奇怪)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 short[] EMPTY_EXCLUSION = new short[0]; public static final short[][] EMPTY_EXCLUSIONS = { EMPTY_EXCLUSION, EMPTY_EXCLUSION }; /** The width of the glyph image, in pixels. */ public short width; /** The height of the glyph image, in pixels. */ public short height; /** * The distance in pixels between the top of the glyph image and the * baseline of the line. A positive value means that the top of the glyph * should be above the baseline of the line; a negative value means that the * top of the glyph should be below the baseline of the line. */ public short baseline; /** * The upper and lower axes for placement of diacriticals. Each axis is the * distance from the left of the glyph image at which diacriticals should be * centered. (The formatting algorithm for the font may move diacriticals * from this position to avoid interference between glyphs.) */ public short[] axes; /** * The upper and lower exclusion zone arrays. If there are n upper * (say) zones, the upper array has length length 2*n. The array has * the left edge of the first zone, the right edge of the first zone, the * left edge of the second zone, etc. The lower zone data are organized in * the same way. */ public short[][] zones; public GlyphMetrics(short width, short height, short baseline, short[] layoutData) { this.width = width; this.height = height; this.baseline = baseline; axes = new short[2]; width >>= 1; // for the rest of this, we need the half-width if (layoutData == null || layoutData.length == 0) { axes[UPPER_DIACRITIC] = axes[LOWER_DIACRITIC] = width; zones = EMPTY_EXCLUSIONS; } else { axes[UPPER_DIACRITIC] = layoutData[0]; if (layoutData.length < 2) { axes[LOWER_DIACRITIC] = width; } else { axes[LOWER_DIACRITIC] = layoutData[1]; } if (layoutData.length < 5) { zones = EMPTY_EXCLUSIONS; } else { int nUpper = layoutData[2] << 1; zones = new short[2][]; zones[UPPER_DIACRITIC] = new short[nUpper]; System.arraycopy(layoutData, 3, zones[UPPER_DIACRITIC], 0, nUpper); int lowerStart = 3 + nUpper; if (layoutData.length < 2 + lowerStart) { zones[LOWER_DIACRITIC] = EMPTY_EXCLUSION; } else { int nLower = layoutData[lowerStart++] << 1; zones[LOWER_DIACRITIC] = new short[nLower]; System.arraycopy(layoutData, lowerStart, zones[LOWER_DIACRITIC], 0, nLower); } } } } }
(导入UPPER_DIACRITIC
并LOWER_DIACRITIC
分别是常量0和1.)
我正在使用带有Gradle插件com.android.tools.build:gradle:2.0.0-alpha3
和JDK 1.7.0_80的Android Studio 2.0 Preview 4来构建它.这是build.gradle
.apk模块的文件:
apply plugin: 'com.android.application' android { compileSdkVersion 23 buildToolsVersion '23.0.2' defaultConfig { applicationId "com.zigzagworld.icjl.tanachbible" minSdkVersion 8 targetSdkVersion 23 versionCode 10800310 versionName "3.1.0" manifestPlaceholders = [ appName: "App", v8TOCActivityName: "BaseTOCActivity", v8PurchaseActivityName: "PurchaseActivity", v17TOCActivityName: "TOCActivity", v17PurchaseActivityName: "PurchaseActivity", ] } signingConfigs { // redacted for this post } buildTypes { release { minifyEnabled true proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' //noinspection GroovyAssignabilityCheck signingConfig // redacted } } flavorDimensions "market" productFlavors { google { dimension "market" manifestPlaceholders = [ appName: "App_Google", v8TOCActivityName: "TOCActivity_Google", v8PurchaseActivityName: "GooglePurchaseActivity", v17TOCActivityName: "TOCActivity_Google", v17PurchaseActivityName: "GooglePurchaseActivity" ] } amazon { dimension "market" manifestPlaceholders = [ appName: "App_Amazon", v8TOCActivityName: "BaseTOCActivity", v8PurchaseActivityName: "PurchaseActivity", v17TOCActivityName: "TOCActivity", v17PurchaseActivityName: "PurchaseActivity" ] } sideLoad { dimension "market" manifestPlaceholders = [ appName: "App_Unlicensed", v8TOCActivityName: "BaseTOCActivity", v8PurchaseActivityName: "PurchaseActivity", v17TOCActivityName: "TOCActivity", v17PurchaseActivityName: "PurchaseActivity" ] } } } dependencies { compile fileTree(include: ['*.jar'], dir: 'libs') testCompile 'junit:junit:4.12' compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:support-annotations:23.1.1' compile project(':Tanach Data') googleCompile project(':Google Vending') amazonCompile project(':Amazon Vending') }
问题出现在调试版本类型中,因此此时ProGuard不在图片中.
愿意花几天之后,我才发现,从降级gradle这个插件2.0.0-alpha3
,以1.5.0
使问题消失.
这是我们努力保持在最前沿的代价.