2015-12-28 10 views
2

Я переношу приложение из Eclipse в Android Studio и выполняю проверку ошибок при попытке запустить приложение на эмуляторах с API менее чем 17. Я был бы признателен за любые рекомендации по как справиться с этим. Вот что показывает в LogCat на API 8 эмулятора:Android Studio проверяет ошибку на API <17

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; 

Это сразу же следует (не удивительно) с помощью приложения разбивая с 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 <i>n</i> upper 
    * (say) zones, the upper array has length length 2*<i>n</i>. 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, соответственно.)

Я строю это с помощью Android Studio 2.0 Preview 4 с Gradle плагин com.android.tools.build:gradle:2.0.0-alpha3 и JDK 1.7.0_80. Вот 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 не на картинке в этой точке.

+0

Возможно, ответ на эту ссылку может помочь, это первый раз, когда я видел VerifyError, поэтому я думал, что id попытается помочь http://stackoverflow.com/questions/100107/reasons-of-getting-a-java-lang -verifyerror – JRowan

+0

@JRowan - Я не видел эту конкретную ссылку, но я видел много подобных. Там нет ничего, что я не пробовал (очистка проекта, добавление 'sourceCompatibility JavaVersion.VERSION_1_7' и' targetCompatibility JavaVersion.VERSION_1_7' в блок 'compileOptions' в build.gradle, проверка версий библиотеки, перезапуск среды IDE и т. Д.). Спасибо, в любом случае. –

+0

oh just подумал, что я вставил это, я все еще использую eclipse, не переключился на андроид-студию, но я думал, что его еще относительно новый, возможно, это был идеал, даже не ошибка программирования, извините, что это не солидное лидерство :( – JRowan

ответ

5

Проведя несколько дней на этом, я только что узнал, что понижение плагина градации от 2.0.0-alpha3 до 1.5.0 заставляет проблему исчезнуть.

Это цена, которую мы платим, пытаясь остаться на переднем крае.

+0

Спасибо! Цена, заплаченная в полном объеме, я полагаю. : - / –