首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >突然在Android4上遗漏了很多类

突然在Android4上遗漏了很多类
EN

Stack Overflow用户
提问于 2018-09-28 09:46:06
回答 1查看 87关注 0票数 0

多年来,我的应用程序一直在Android 4.0.3及以上版本上运行得很好。在最近的一个小更新中,它突然开始在Android 4.x设备上崩溃。当我在Android4上调试它时,它的构建和安装都很好,但控制台从

代码语言:javascript
复制
W/dalvikvm: VFY: unable to find class referenced in signature (Landroid/media/midi/MidiDeviceInfo;)
I/dalvikvm: Failed resolving Lcom/arlomedia/myapp/App$4; interface 113 'Landroid/media/midi/MidiManager$OnDeviceOpenedListener;'
W/dalvikvm: Link of class 'Lcom/arlomedia/myapp/App$4;' failed
E/dalvikvm: Could not find class 'com.arlomedia.myapp.App$4', referenced from method com.arlomedia.myapp.App.addMidiPorts
W/dalvikvm: VFY: unable to resolve new-instance 447 (Lcom/arlomedia/myapp/App$4;) in Lcom/arlomedia/myapp/App;
D/dalvikvm: VFY: replacing opcode 0x22 at 0x0007

紧随其后的是我的应用程序中的许多类的类似错误。应用程序运行,直到它需要使用这些丢失的类之一,然后崩溃。

我读过几篇与Android 4的64K方法限制相关的类似问题的帖子,可以想象,在最近的更新中,我碰巧超过了64K的门槛。所以我试着根据these instructions设置multidex,但这并没有什么不同,我不知道如何判断它是否有效。当我构建一个APK文件并检查它的内容时,我只看到一个classes.dex文件。这可能意味着我的multidex设置不起作用,或者我没有超过64K的方法而我的问题出在别的地方。

我的第二个理论是,在Android6中添加的MidiDeviceInfo类的使用在Android4上造成了一个问题。然而,我使用版本检查和@TargetApi(24)注释来忽略Android4-5上的MIDI代码。这个问题在Android5上不会发生,但奇怪的是,这是每次都会弹出的第一个错误。

这些理论中的一个听起来是正确的,还是听起来像是其他的问题?

顺便问一下,“找不到签名中引用的类”--方法签名--到底是什么意思?我确实有一些方法使用了MidiDeviceInfo类型的参数,但是我用@TargetApi(24)注释了所有这些方法,并且在编译时没有任何问题。

更新

感谢homerman的提示,我可以看到方法的数量不是问题所在。这将我带回到MIDI兼容性,但我正在寻找与以前版本的不同之处,并且我没有看到MIDI代码有任何变化。我还应该寻找什么呢?

更新2

自从上一个版本以来,我在差异中找不到任何相关的东西,所以我从我的VCS中检出了上一个版本,并运行了它,它运行得很好。但我注意到,在该版本的logcat中,MIDI类也有相同的错误。所以看起来这些并不是问题的一部分。我猜这就是Android在遇到新类时所做的事情。我不断比较上一个好版本和当前版本之间的日志猫,然后我看到了不同之处:我最近在我的一个类中添加了一个OnScrollChangeListener。这产生了另一批缺少类的错误,这些错误在上一个应用程序版本中是没有的。当我移除这项新功能时,应用程序又可以在安卓4上正常运行了。

这就是问题所在:我有一个这样的类定义:

代码语言:javascript
复制
public class DocumentViewer extends RelativeLayout implements View.OnScrollChangeListener {

    if (Build.VERSION.SDK_INT >= 23) {
        textView.setOnScrollChangeListener(this);
    }

    @Override
    public void onScrollChange(final View scrollView, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
        Log.d("onScrollChange", "scroll changed: " + scrollY);
    }

}

显然,在类定义中出现View.OnScrollChangeListener是搞乱一切的原因。有没有办法只为支持的Android版本声明这一点?

显然,Android 5优雅地忽略了这个不受支持的引用,但Android 4并非如此。

EN

回答 1

Stack Overflow用户

发布于 2018-09-29 06:06:44

Ben P的回答让我走上了正确的道路,但我对将类转换为接口感到困惑,所以我想出了以下方法:

代码语言:javascript
复制
// this was the original class and I added scrollViewDidScroll() to keep all my related code in one class
public class DocumentViewer extends RelativeLayout {

    if (Build.VERSION.SDK_INT >= 23) {
        if (this instanceof DocumentViewerExtras) {
            // assign the listener on supported devices
            DocumentViewerExtras thisExtras = (DocumentViewerExtras)this;
            textView.setOnScrollChangeListener(thisExtras);
        }
    }

    public void scrollViewDidScroll(final View scrollView, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
        // do something with the scroll results
    }

}

// this is a new class that adds OnScrollChangeListener on supported devices
@RequiresApi(23)
public class DocumentViewerExtras extends DocumentViewer implements View.OnScrollChangeListener {

    public DocumentViewerExtras(Fragment fragment) {
        super(fragment);
    }

    @Override
    public void onScrollChange(final View scrollView, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
        this.scrollViewDidScroll(scrollView, scrollX, scrollY, oldScrollX, oldScrollY);
    }

}

// this method instantiates the best available class
public DocumentViewer getDocumentViewer(Fragment fragment) {
    if (Build.VERSION.SDK_INT >= 23) {
        return new DocumentViewerExtras(fragment);
    } else {
        return new DocumentViewer(fragment);
    }
}

// this is how I get a new instance of the class
DocumentViewer documentViewer = getDocumentViewer(this);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52547192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档