Класс активности не найден в файле 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
Ответы
Ответ 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
Попробуйте это,
Отключить мгновенный запуск
Файл → Настройки → Сборка, выполнение, развертывание → Мгновенный запуск
Если это не сработает, сообщите мне.