5

达到(下面的代码)VerifyError时抛出A。使用 Instant RunXpInsetDrawable.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;
    }
}
4

1 回答 1

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 子类是在 23 中添加的 DrawableWrapper。该应用程序使用 CompileSdkVersion 23 编译,因此我们为 DrawableWrapper 方法生成方法访问。

现在在 <23 上运行时,这些方法不存在,实际上该类不存在所以我们炸毁了。

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

潜在的解决方法是针对目标设备 API 级别 android.jar 而不是 compileSdkVersion 进行检测。这对于 2.1 来说太涉及了,针对 2.2。

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


这意味着在 Android Studio 2.2 发布之前,我不能同时继承InsetDrawable和使用 Instant Run。

我将研究将 SDK 22InsetDrawable直接复制到我的项目中。

于 2016-04-15T08:15:14.137 回答