在AAR文件java.lang.NoClassDefFoundError

时间:2017-09-12 08:11:30

标签: java android android-activity aar

我创建了一个安卓库,它包含一个用于打开相机意图的活动类,该库可以完美地排除调用活动出现在屏幕上的部分,并且应用程序崩溃抛出以下错误

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
  • 我已经从/[library-project]/build/outputs/aar/scanner-release.aar
  • 获取了aar文件

Update1 - 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的实例

Update2 - 2017-09-14

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

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

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

  • 我们希望开发者从提供的AAR中提取scanner.aar个文件scanner-sandbox.aarSDK并使用其中任何一个

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

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

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

更新的问题是

分发aar文件而不将其发布到 maven repository 等任何存储库以及开发人员同步.gradle文件时安装的库的所有依赖项

的可能方法是什么?

6 个答案:

答案 0 :(得分:4)

zeeshan

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

  

为项目创建.aar文件:

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

  8.   
  9. 将以下内容添加到应用程序gradle文件,存储库{   flatDir {       dirs'libs'   依赖{   编译(名称:'app-release',分机:'aar')}

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

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

解决方案:

  

。必须在项目应用中手动添加.aar gradle依赖项   gradle这个

答案 1 :(得分:4)

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

答案 2 :(得分:2)

问题的原因是类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')
...
}

答案 3 :(得分:2)

分发图书馆有三种方式:

  1. 创建本地maven库,然后分发生成的aar 您可以使用Gradle Android Maven plugin创建本地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 {
      ...
    }
    

    ℃。设置artifactId在settings.gradle中设置:

    rootProject.name = 'yourlibraryname'
    

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

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

    即将已安装的库直接用于您的项目    您可以通过将mavenLocal()添加到 root 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. 获取
  3. 在数字1中使用相同的技术,但为每个开发人员计算机指向~/.m2/repository/中心的本地maven路径。

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

答案 4 :(得分:0)

虽然我不知道根本原因,但您可以尝试这个解决方案:在您的应用程序项目中,定义一个从ScannerViewActivity扩展的活动,并在AndroidManifest.xml中声明它。

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

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

答案 5 :(得分:0)

你能尝试如下吗?

  1. 禁用即时运行并清理构建您的AAR。
  2. 再次部署,无论您在哪里托管AAR。
  3. 使用AAR作为依赖项再次测试应用程序。
  4. 即时运行有时会因缓存而导致问题。

    编辑: 用于添加本地AAR。您可以按照here

    所述的答案进行操作