在 AAR 文件 java.lang.NoClassDefFoundError 中找不到 Activity Class更新的问题是

2022-09-02 22:07:35

我创建了一个Android库,它包含一个用于打开相机意图的活动类,该库工作完美,除了调用活动以显示在屏幕上的部分和应用程序崩溃引发以下错误

Suppressed: java.lang.ClassNotFoundException: com.me.scanner.ScannerViewActivity
            at java.lang.Class.classForName(Native Method)
            at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
            at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
                    ... 14 more
         Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available

以下是我将使用此库的其他项目的文件build.gradle

repositories {
    flatDir {
        dirs 'libs'
    }
}
dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    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:25.3.0'
    compile 'com.android.support.constraint:constraint-layout:1.0.2'
    compile 'com.me.app:gpio_lib@aar'
    compile ('com.me.app:scanner@aar'){ transitive = true; }
    testCompile 'junit:junit:4.12'
}

请注意:

  • 这个库可以完美地作为模块项目,

    compile project(':scannercontrol')
    

    但在项目中使用它时则不然aar

  • 我尝试过有和没有,没有变化{ transitive = true; }

  • 我已将我的 aar 文件重命名为scanner.aar
  • 我已经采取了aar文件格式/[library-project]/build/outputs/aar/scanner-release.aar

更新1 - 2017-09-14

该活动是我的库的一部分,这是从其中一个库类调用它的方式ScannerViewActivity

Intent scannerView = new Intent();
scannerView.putExtra(MESSAGE_RECEIVER, new MessageReceiver());
scannerView.setClass(context, ScannerViewActivity.class);
scannerView.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(scannerView);

这是实例,而不是任何实例contextandroid.app.ApplicationActivity

更新2 - 2017-09-14

幸运的是,在谷歌上漫游2天后,我遇到了问题类的答案,没有在aar中找到。我已经将库的依赖项添加到项目中,并能够运行它,但这不是我的问题的解决方案,aar

以下是我目前面临的流程和问题

  • 我正在开发一个与特定条形码扫描仪硬件通信的库的沙盒版本,因为开发人员不一定拥有他们将使用沙盒版本的库的硬件,该版本将允许开发人员将其设备相机用作条形码扫描仪,

  • 我们希望开发人员从提供的文件中提取文件并使用其中任何一个AARscanner.aarscanner-sandbox.aarSDK

  • 我们不希望开发人员在想要运行库的沙盒版本时向其文件添加额外的依赖项,.gradle

  • 以下是用于将设备相机模拟为条形码扫描仪的依赖项

    compile 'me.dm7.barcodescanner:zxing:1.9.8'
    

更新的问题是

分发 aar 文件而不将其发布到任何存储库(如 maven 存储库)以及开发人员同步文件时安装的库的所有依赖项的可能方法是什么?.gradle


答案 1

泽山

我遇到了同样的问题,我做了很多研究,我修复了,希望它能帮助你

为项目创建 .aar 文件:

  1. 对于库模块,.aar 文件由 Android Studio 自动创建。对于具有任何资源文件或库的项目,可以生成 .aar 文件,如后续步骤中所述。
  2. 检查插件。它应该在下面,如果它在应用程序中,请更改为库,应用插件:'com.android.library'
  3. 打开打开的右边框渐变栏,转到“您的项目”->任务->构建,然后双击组合发布。在构建项目时,您将在 app/build/outputs/aar/ 目录中找到两个 .aar 文件(app-debug.aar 和 app-release.aar)。在项目中使用 .aar 文件:
  4. 获取“app-release.aar”文件并将其粘贴到项目的 libs 文件夹中。如果 libs 文件夹不存在,请在应用目录中创建一个名为“libs”的目录。

  5. 将以下内容添加到 app gradle 文件, 存储库 { flatDir { dirs 'libs' } } dependencies { compile(name:'app-release', ext:'aar') }

  6. 同步时,项目已准备好使用库文件。注意:.aar gradle 依赖项必须在您的项目应用程序 gradle 中手动添加 示例:下面

错误的假设: System.err: java.lang.NoClassDefFoundError:

溶液:





必须在项目应用程序 gradle 中手动添加 .aar gradle 依赖项


答案 2

您的“Update2 - 2017-09-14”的答案 - 可以简单地构建一个胖aar文件。它将包含所有依赖项,您可能需要处理的一件事是依赖项中的冲突有时可能会产生问题。此外,脂肪aar的大小可能很大。所以试一试。


推荐