Подтвердить что ты не робот

Класс активности не найден в файле AAR. Java.lang.NoClassDefFoundError

Я создал библиотеку андроида, он содержит класс активности, который использует, чтобы открыть намерение камеры, библиотека отлично работает за исключением части, которая вызывает действие, которое появляется над экраном, и приложение вылетает, бросая следующие ошибки.

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:[email protected]'
    compile ('com.me.app:[email protected]'){ 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

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);

этот context является экземпляром android.app.Application, а не любого Activity

Update2 - 2017-09-14

К счастью, после роуминга 2 дня по всему Google я сталкиваюсь с ответом на вопрос Класс, не найденный в aar. Я добавил зависимости библиотеки к проекту и смог запустить ее с помощью aar, но это не решение моей проблемы,

Ниже приведен поток и проблема, с которой я сейчас сталкиваюсь

  • Я разрабатываю версию с песочницей библиотеки, которая обменивается данными со специальным оборудованием сканера штрих-кода, поскольку разработчик не обязательно имеет аппаратное обеспечение, которое будет использовать версию библиотеки песочницы, которая позволит разработчику использовать их устройство в качестве сканера штрих-кода,

  • Мы хотим, чтобы разработчик извлекал aar файлы scanner.aar и scanner-sandbox.aar из предоставленного SDK и использовал любой из них

  • Мы не хотим, чтобы разработчик добавлял дополнительную зависимость к своему файлу .gradle, если они хотят запустить версию библиотеки для песочницы,

  • Ниже приведена зависимость, которая используется для имитации камеры устройства в качестве сканера штрих-кода.

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

Обновленный вопрос

Каков возможный способ распространения файла aar без их публикации в каком-либо репозитории, таком как maven репозиторий и все зависимости библиотеки, установленной, когда разработчик синхронизирует файл .gradle

4b9b3361

Ответ 1

Zeeshan

Я столкнулся с такой же проблемой, что и много исследований, и я решил, что это поможет вам

Создание файла .aar для проекта:

  • Для библиотечного модуля файл .aar автоматически создается Android Studio. Для проекта с любым файлом ресурса или с библиотеки, файл .aar может быть сгенерирован, как указано в следующих шагах.
  • Проверьте плагин. Он должен быть следующим образом: перейдите в библиотеку, если она находится в приложении, примените плагин: "com.android.library"
  • Откройте панель с открытыми правыми границами gradle и перейдите в "ваш проект" → "Задачи- > ", а затем дважды щелкните по сборке "Сброс". По построению проекта вы найдете два .aar файлы (app-debug.aar и app-release.aar) внутри приложения/сборки/выходов/aar/ каталог. Использование файла .aar в вашем проекте:
  • Получите файл "app-release.aar" и вставьте его в папку libs вашего проекта. Если папка libs отсутствует, создайте каталог с именем "libs" внутри каталога приложения.

  • Добавьте в приложение gradle файл, репозитории { flatDir {     dirs 'libs' }} зависимости { compile (name: 'app-release', ext: 'aar')}

  • В режиме синхронизации ваш проект готов к использованию файлов библиотеки. Примечание: зависимости .aar gradle должны быть добавлены вручную в приложении проекта gradleПример: ниже

Предположение об ошибках: System.err: java.lang.NoClassDefFoundError:

Решение:

.aar gradle зависимости должны быть добавлены вручную в приложении проекта gradle

Ответ 2

Причиной проблемы является то, что класс ScannerViewActivity вызывается внутри одного из ваших AAR как зависимость, например:

apply plugin: 'com.android.library'
android{...}
dependencies {
    compile 'com.me.scanner:[email protected]' //library which contains ScannerViewActivity
}

но когда вы используете aar (переходный не будет добавлять эти зависимости aar!), вам нужно добавить другую зависимость, например:

dependencies {
...
compile ('com.me.app:[email protected]')// remove{ transitive = true; }
compile ('com.me.scanner:[email protected]')
...
}

Ответ 3

Существует 3 способа распространения вашей библиотеки:

  • Создание локальной библиотеки maven затем распределяет сгенерированный аар.
    Вы можете создать локальный аран, используя Gradle плагин Android Maven. Как это сделать:

    а. Добавьте путь класса plugin к 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'
    

    д. Создайте и установите библиотеку на свой локальный 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'
    

    Или вы можете скопировать созданный .aar из локального пути maven. В Linux вы можете получить его от /your/userpath/.m2/repository/ или ~/.m2/repository/

  • Используйте тот же метод в номере 1, но сделайте локальный путь maven для каждого компьютера разработчика, указав на центральную часть ~/.m2/repository/.

  • Используйте приватный репозиторий maven. Вы можете использовать JFrog Artifactory oss или Nexus Repository OSS

Ответ 4

Ответ на ваш "Update2 - 2017-09-14" - может просто создать жирный файл aar. который будет содержать все зависимости, одна вещь, которую вы, возможно, придется обрабатывать, - конфликт в зависимостях, когда-то может создать проблему. также размер жира aar может быть огромным. поэтому попробуйте.

Ответ 5

Хотя я не знаю первопричины, вы можете попробовать это решение: в своем проекте приложения определите действие, выходящее из ScannerViewActivity, и объявите его в AndroidManifest.xml.

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

Затем вы должны запустить MyScannerViewActivity вместо ScannerViewActivity по намерениям.

Ответ 6

Можете ли вы попробовать, как показано ниже?

  • Отключить мгновенный запуск и очистить сборку AAR.
  • Разверните его снова, где бы вы ни разместили свой AAR.
  • Проверьте приложение снова с AAR как зависимостью.

Мгновенные действия иногда вызывают проблему из-за кэширования.

Изменить: Для добавления локального AAR. Вы можете найти ответ, как указано здесь

Ответ 7

Попробуйте это,

Отключить мгновенный запуск

Файл → Настройки → Сборка, выполнение, развертывание → Мгновенный запуск

Если это не сработает, сообщите мне.