Импорт библиотеки Android AAR - без определения класса
Я использую Android Studio. Я пишу библиотеку Android под названием детектор. Он отлично работает в проекте, из которого он был создан.
compile project(':detector')
Я хочу импортировать файл AAR, который он генерирует, в другой проект. Я делаю так:
File > New > New Module > Import .JAR/.AAR Package
Затем я добавляю ту же строку в приложение новых проектов build.gradle:
compile project(':detector')
После очистки и сборки я запускаю приложение и получаю эту ошибку:
11-18 06:32:14.151 21283-21283/testing.com.test D/ResourcesManager: For user 0 new overlays fetched Null
11-18 06:32:14.161 21283-21283/testing.com.test W/System: ClassLoader referenced unknown path: /data/app/testing.com.test-1/lib/arm
11-18 06:32:15.131 21283-21283/testing.com.test W/System: ClassLoader referenced unknown path: /data/app/testing.com.test-1/lib/arm
11-18 06:32:15.131 21283-21283/testing.com.test D/ContextRelationManager: ContextRelationManager() : FEATURE_ENABLED=true
11-18 06:32:15.131 21283-21283/testing.com.test D/RelationGraph: garbageCollect()
11-18 06:32:15.301 21283-21283/testing.com.test D/RelationGraph: garbageCollect()
11-18 06:32:15.501 21283-21283/testing.com.test W/art: Before Android 4.1, method android.graphics.PorterDuffColorFilter android.support.graphics.drawable.VectorDrawableCompat.updateTintFilter(android.graphics.PorterDuffColorFilter, android.content.res.ColorStateList, android.graphics.PorterDuff$Mode) would have incorrectly overridden the package-private method in android.graphics.drawable.Drawable
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.621 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.631 21283-21283/testing.com.test I/art: Rejecting re-init on previously-failed class java.lang.Class<detector.Manager>
11-18 06:32:15.631 21283-21283/testing.com.test D/AndroidRuntime: Shutting down VM
11-18 06:32:15.631 21283-21283/testing.com.test E/AndroidRuntime: FATAL EXCEPTION: main
Process: testing.com.test, PID: 21283
java.lang.NoClassDefFoundError: detector.Manager
at detector.Detector.<clinit>(Detector.java:39)
at testing.com.test.MainActivity.onCreate(MainActivity.java:17)
at android.app.Activity.performCreate(Activity.java:6904)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1136)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3266)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3415)
at android.app.ActivityThread.access$1100(ActivityThread.java:229)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1821)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:7325)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
Я распаковываю AAR и декомпилирую файл Classes.jar, чтобы найти, что файл Manager существует:
Manager.class
Manager$3.class
Manager$2.class
Manager$1.class
Вот библиотеки build.gradle
apply plugin: 'com.android.library'
android {
compileSdkVersion 23
buildToolsVersion "23.0.3"
defaultConfig {
minSdkVersion 10
targetSdkVersion 23
versionCode 1
versionName '1'
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile ('org.altbeacon:android-beacon-library:2.8.1')
compile ('com.google.android.gms:play-services-ads:9.6.1')
compile 'com.android.support:appcompat-v7:23.4.0'
}
buildscript {
repositories {
jcenter()
mavenCentral()
flatDir {
dirs 'libs'
}
}
}
Кроме того, я могу развернуть библиотеку в jCenter и успешно запустить библиотеку в других проектах при подключении к установке jCenter. Эта проблема вызвана только прямым импортом AAR.
Посоветуйте, пожалуйста, создание библиотеки Android AAR и импортируйте ее в другой проект Android.
====== ======UPDATE
Благодаря помощи @bwt я обнаружил, что проблема будет решена, если я включу зависимости библиотек в приложение build.gradle, которое загружает AAR. Как я могу гарантировать, что зависимости (которые google-play и altbeacon) включены в AAR? Установка их в качестве переходных зависимостей перед построением AAR не помогла.
5 ответов
Я не уверен, что проблема в том, что класс не импортируется (иначе вы не смогли бы скомпилировать), но на всякий случай, что произойдет, если вы импортируете локальный aar
без дополнительного модуля?
Положить
aar
в каталоге внутри модуля, где вы хотите его использовать (например,aarlibs
в модуле приложения)Объявите этот каталог как хранилище (в приложении
build.gradle
):repositories{ flatDir{ dirs 'aarlibs' } } android { ...
Ссылка на это как зависимость (также в приложении
build.gradle
):dependencies { compile(name:'aar_file_name', ext:'aar') ...
Файл aar не имеет транзитивных зависимостей и не имеет pom-файла, который описывает зависимости, используемые библиотекой.
означает, что если вы импортируете aar-файл, то вы должны указать зависимости также в вашем проекте.
Вы должны использовать репозиторий Maven (вы должны опубликовать библиотеку в частном или публичном репозитории Maven).
Способ импорта .AAR / JAR в Android Studio v-4.2 изменился, поэтому используйте этот https://developer.android.com/studio/projects/android-library#psd-add-aar-jar-dependency
Допустим, у вас есть 2 проекта:
- Проект AAR - это тот, где вы создаете и создаете файл aar.
- Рабочий проект - здесь вы запускаете код, которому нужен сгенерированный файл aar из (1).
В вашем рабочем проекте (2) вам нужно будет добавить новый модуль для вашего файла (1). Для этого выполните следующие действия: нажмите правую кнопку мыши на одном из существующих модулей и выберите "Открыть настройки модуля", затем нажмите знак "+", чтобы добавить новый модуль, выберите "Импорт jar/aar" и выберите соответствующий файл, который был создан в разделе 1.
Вы заметите, что новый файл Gradle для вашего нового модуля был создан со следующим кодом:
configurations.maybeCreate("default")
artifacts.add("default", file('name_of_you_aar_file.aar'))
После создания модуля вам нужно будет связать новый модуль с модулем приложения, используя то, что вы уже написали в build.gradle, который относится к вашему модулю: compile project(':name_of_your_module')
Дайте мне знать, если это работает для вас.
- Во-первых, возьмите все необходимые файлы.AAR из папки библиотеки sdk.
- Создайте новые модули для каждой из этих библиотек. Используя графический интерфейс Android Studio, это можно сделать через File -> New -> New Module. Выберите Импорт пакета .JAR/.AAR. Найдите один из файлов.AAR и импортируйте его.
- Затем добавьте этот новый модуль в качестве зависимости к основному приложению через " Файл"> "Структура проекта"> "Модули" (в списке разделов слева) > "ИМЯ МОДУЛЯ" вашего приложения > "Зависимости" (в списке вкладок справа) -> "+" -> "Модуль". Зависимость
Выполнение вышеуказанных шагов приведет к тому, что Android Studio сгенерирует новые модули и автоматически отредактирует ваши файлы .gradle. Кроме того, вы можете напрямую включить файлы.AAR в модуль вашего приложения, отредактировав файл build.gradle этого конкретного модуля.
Ссылка: https://developers.google.com/vr/android/get-started