繁体   English   中英

在 AAR 文件 java.lang.NoClassDefFoundError 中找不到活动类

[英]Activity Class cannot be found in AAR file java.lang.NoClassDefFoundError

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

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; } { 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.Application的实例,而不是任何Activity

更新 2 - 2017-09-14

幸运的是,在谷歌漫游 2 天后,我遇到了问题Class not found in aar的答案。 我已将库的依赖项添加到项目中并能够使用aar运行它,但这不是我的问题的解决方案,

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

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

  • 我们希望开发人员从提供的SDK中提取AAR文件scanner.aarscanner-sandbox.aar并使用它们中的任何一个

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

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

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

更新的问题是

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

泽山

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

为项目创建 .aar 文件:

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

  5. 将以下内容添加到应用程序 gradle 文件中,repositories { flatDir { dirs 'libs' } } dependencies { compile(name:'app-release', ext:'aar') }

  6. 同步后,您的项目就可以使用库文件了。 注意:.aar gradle 依赖项必须手动添加到您的项目应用程序 gradle 示例:下面

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

解决方案:

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

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

有 3 种方法可以分发您的库:

  1. 创建一个本地 maven 库,然后分发生成的 aar。
    您可以使用Gradle Android Maven 插件创建本地 aar。 如何制作:

    一个。 将插件类路径添加到root build.gradle

     buildscript { repositories { jcenter() mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:2.2.3' classpath 'com.github.dcendents:android-maven-gradle-plugin:1.5' } } allprojects { repositories { jcenter() } }

    湾。 设置 maven 插件,并将组和版本名称添加到库 build.gradle:

     apply plugin: 'com.android.library' apply plugin: 'com.github.dcendents.android-maven' group = 'com.your.packagename' version = '1.0.0' ext.versionCode = 1000 android { compileSdkVersion 25 buildToolsVersion "25.0.3" defaultConfig { minSdkVersion 9 targetSdkVersion 25 versionCode versionCode versionName version } buildTypes { ... } } dependencies { ... }

    C。 设置artifactId是在settings.gradle中设置的:

     rootProject.name = 'yourlibraryname'

    d。 构建库并将其安装到本地 maven。
    您可以在项目文件夹上运行./gradlew install 或使用

    Gradle -> YourLibrary -> Other -> 从 Android Studio 安装(在 Android Studio 的右侧)

    e. 将已安装的库直接用于您的项目。
    您可以通过将mavenLocal()添加到build.gradle 来使用该库

    allprojects { repositories { jcenter() mavenLocal() // for local maven. } }

    然后在项目中添加依赖:

     compile 'com.your.packagename:modulename:1.0.0'

    或者您可以从本地 maven 路径复制生成的 .aar。 在 Linux 中,您可以从/your/userpath/.m2/repository/~/.m2/repository/获取它

  2. 在数字 1 中使用相同的技术,但为每台开发人员计算机创建本地 maven 路径指向~/.m2/repository/ central。

  3. 使用私有 Maven 存储库。 您可以使用JFrog Artifactory ossNexus Repository OSS

问题的原因是类ScannerViewActivity在您的一个 AAR 中作为依赖项被调用,例如:

apply plugin: 'com.android.library'
android{...}
dependencies {
    compile 'com.me.scanner:otherscanner@aar' //library which contains ScannerViewActivity
}

但是当您使用 aar 时(传递不会添加此 aar 依赖项!),您必须添加其他依赖项,例如:

dependencies {
...
compile ('com.me.app:scanner@aar')// remove{ transitive = true; }
compile ('com.me.scanner:otherscanner@aar')
...
}

虽然我不知道根本原因,但你可以试试这个解决方案:在你的app项目中,定义一个从ScannerViewActivity扩展的activity,并在AndroidManifest.xml中声明它。

class MyScannerViewActivity extends ScannerViewActivity {
    // do nothing or something you want
}

然后你应该按意图启动 MyScannerViewActivity 而不是 ScannerViewActivity 。

您可以尝试如下吗?

  1. 禁用 Instant Run 并清理构建您的 AAR。
  2. 再次部署它,无论您在哪里托管您的 AAR。
  3. 使用 AAR 作为依赖项再次测试应用程序。

由于缓存,即时运行有时会导致问题。

编辑:用于添加本地 AAR。 您可以按照此处提到的答案进行操作

我遇到了同样的问题。 您可以尝试使用fat-aar来解决这个问题,它可以将库代码合并到 aar 中。 https://github.com/kezong/fat-aar-android

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM