当前位置: 首页 > 知识库问答 >
问题:

Apache Commons Compress无法在Android N之前解析类SeeKableInMemoryByte通道

胡弘毅
2023-03-14

每当我尝试使用 Apache 公共压缩包中的可搜索内存字节通道类时,应用程序都会崩溃,并显示 java.lang.NoClassDefFoundEror:org.apache.commons.compress.utils.SeekableInMemoryByteChannel 异常。

至少对我来说,特别有趣的是,这个问题不会发生在运行Android 7的设备上,但会发生在我测试过的所有其他版本上。更具体地说,我观察到这个问题发生在Android 6.0.1、6.0、5.1.1上,但不会发生在Android 7.0或7.1.1上。这些设备都来自不同的供应商。

所以我正面临着一个严重的幽灵课。起初,我认为这可能与我的应用程序正在使用MultiDex或构建过程配置不正确有关。但是,在没有这些功能的全新项目上也会发生同样的情况。我尝试使用同一包中的不同类,它们已成功解决。我已将软件包添加到 ProGuard,但没有运气。

这是复制问题的代码:

package lt.kaz.compresstest;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;

import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;
import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
import org.apache.commons.compress.utils.SeekableInMemoryByteChannel;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ZipArchiveEntry zipEntry = new ZipArchiveEntry("hello");
        zipEntry.setSize(600);

        SevenZArchiveEntry sevenZipEntry = new SevenZArchiveEntry();
        sevenZipEntry.setName("sevenZip");

        try {
            MainActivity.class.getClassLoader().loadClass("org.apache.commons.compress.utils.ChecksumCalculatingInputStream");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }

        SeekableInMemoryByteChannel channel = new SeekableInMemoryByteChannel(new byte[]{5, 10, 15, 10});
        // App never gets here prior to Android N
        Log.d("lt.kaz", channel.toString());
    }
}

…和gradle文件…

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    buildToolsVersion "26.0.1"
    defaultConfig {
        applicationId 'lt.kaz.compresstest'
        minSdkVersion 19
        targetSdkVersion 25
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    productFlavors {
    }
}

dependencies {
    compile fileTree(include: ['*.jar'], dir: 'libs')
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:26.+'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.android.support:design:26.+'
    compile 'org.apache.commons:commons-compress:1.14'
    testCompile 'junit:junit:4.12'
}

...和ProGuard...

-keep public class org.apache.commons.compress

任何帮助都将不胜感激。这种行为的原因是什么?如何解决?

共有1个答案

陆翔飞
2023-03-14

显然,SeekableByteChannel接口构成了java.nio。频道包仅适用于Android API级别24(因此为Android N)。

由于我最初的意图是使用< code>SevenZFile类,我的最终解决方案是将commons-compress降级到1.12版,因为那里的实现不使用< code > seekablebytechanel 类。

 类似资料:
  • 当我通过命令行或Jenkins运行Groovy脚本时,会出现“无法解析类”错误。 我在C中的同一文件夹中有以下两个groovy文件:\Users\myuser\git\productname\mycompany build\src\main\groovy\com\mycompany\build 富。groovy公司 酒吧groovy公司 我经营Foo。groovy使用命令行。 运行Groovy时,

  • 问题内容: 这是我得到的错误: 这是我的代码: 另外,我在一个单独的类中声明了这一点: 是什么导致此错误,我该如何解决? 编辑:缩进,空格,命名约定和可读性问题已得到解决。 问题答案: 问题在于,这似乎是一个内部类(很难说,您的缩进是不好的),并且由于它不是静态的,因此您无法单独实例化它。 您要么需要自己创建一个类,要么使其成为一个类并将其实例化为(或者无论父类是什么,您的缩进在这里实际上都没有帮

  • 问题内容: 尝试遵循本教程:教程 尝试像这样使用 JSONParser : 但是Eclipse给了我。 该怎么办? 问题答案: JSONParser类在本教程的下方,它看起来像这样…… 我会考虑看看杰克逊图书馆通过http://jackson.codehaus.org/

  • 问题内容: 我从git下载了Android的Browser项目并将其导入到Eclipse。但是由于以下错误,我无法构建它: 无法解析类型java.lang.Enum。从所需的.class文件间接引用它 现在…这是一个开发环境,对于其他项目来说效果很好: Windows 7 Ultimate 64位。 JDK 64位(已安装jdk-6u23-windows-x64.exe。) Eclipse Cla

  • 我刚开始使用Android Studio一周,它对我来说非常好,但当我今天开始使用Android Studio时,我得到了一个错误:“错误:重复类:mypackage”。R’。我以前在使用Eclipse时看到过这个错误,所以我尝试过几次重建项目并重新启动Android Studio,但都没有帮助。 在阅读了一些Stackoverflow问题后,我尝试删除R.java并再次重建,现在我在重建时没有收

  • 我正在尝试将主题添加到我的项目中。它需要appcompat v7。 我按照Android开发者网站中提到的步骤添加了支持库。经过大量搜索,我知道支持库v4将与支持库v7冲突。 所以我从我的项目中删除了android库v4。因此,现在我得到了t错误()。 我必须做什么?请有人帮我解决这个问题。预先感谢