使用“即时”运行时验证错误

时间:2016-04-13 09:23:10

标签: android instant-run

当达到VerifyError(代码如下)时,会抛出XpInsetDrawable.create(Drawable, int)。当使用“即时运行”时,不会发生这种情况。

我使用的是Android Studio 2.0.0和gradle build plugin 2.0.0。在SDK 22上测试。在SDK 19模拟器上运行时,整个模拟器重新启动。

我正在寻找除"禁用即时运行"以外的解决方案。

异常(整个堆栈跟踪无关)

Caused by: java.lang.VerifyError:
Verifier rejected class net.xpece.android.support.preference.XpInsetDrawable due to bad method
java.lang.Object net.xpece.android.support.preference.XpInsetDrawable.access$super(
    net.xpece.android.support.preference.XpInsetDrawable,
    java.lang.String,
    java.lang.Object[])
(declaration of 'net.xpece.android.support.preference.XpInsetDrawable'
appears in /data/data/net.xpece.android.support.preference.sample/files/instant-run/dex/slice-slice_7-classe

类源代码

final class XpInsetDrawable extends InsetDrawable {
    private static final boolean NEEDS_FIXING = Build.VERSION.SDK_INT < 21;

    private final Rect mInset = new Rect();

    public static InsetDrawable create(final Drawable drawable, final int insetLeft, final int insetTop, final int insetRight, final int insetBottom) {
        if (NEEDS_FIXING) {
            return new XpInsetDrawable(drawable, insetLeft, insetTop, insetRight, insetBottom);
        } else {
            return new InsetDrawable(drawable, insetLeft, insetTop, insetRight, insetBottom);
        }
    }

    public static InsetDrawable create(final Drawable drawable, final int inset) {
        if (NEEDS_FIXING) {
            return new XpInsetDrawable(drawable, inset);
        } else {
            return new InsetDrawable(drawable, inset);
        }
    }

    XpInsetDrawable(final Drawable drawable, final int inset) {
        super(drawable, inset);
        mInset.set(inset, inset, inset, inset);
    }

    XpInsetDrawable(final Drawable drawable, final int insetLeft, final int insetTop, final int insetRight, final int insetBottom) {
        super(drawable, insetLeft, insetTop, insetRight, insetBottom);
        mInset.set(insetLeft, insetTop, insetRight, insetBottom);
    }

    @Override
    public int getIntrinsicHeight() {
        return super.getIntrinsicHeight() + mInset.top + mInset.bottom;
    }

    @Override
    public int getIntrinsicWidth() {
        return super.getIntrinsicWidth() + mInset.left + mInset.right;
    }
}

1 个答案:

答案 0 :(得分:2)

更新2016-08-25:在Android Studio 2.2-beta3中发布的修补程序。

更新2016-07-15:修复目标版本现在是Android Studio 2.3。

我向Android提交了一个错误,这是dev j...@google.com对此所说的内容:

  

有趣!

     

XpInsetDrawable是InsetDrawable的子类,其父级在23中已更改。从23开始,InsetDrawable子类DrawwithWrapper在23中添加。应用程序使用CompileSdkVersion 23进行编译,因此我们为DrawableWrapper方法生成方法访问。

     

现在当运行&lt; 23时,这些方法不存在,实际上该类不存在所以我们爆炸了。

     

现在的解决方法是将compileSdkVersion设置为较低版本,或者在InstantRun模式下运行23上的应用程序。

  

潜在的修复方法是针对目标设备API级别android.jar而不是compileSdkVersion。对于2.1来说太过涉及,目标是2.2。

来源:https://code.google.com/p/android/issues/detail?id=206746

这意味着我无法将InsetDrawable子类化,并在Android Studio 2.2发布之前同时使用Instant Run。

我会考虑将SDK 22 InsetDrawable直接复制到我的项目中。