Создайте AAR с несколькими AAR/JARs
Я видел вопросы (Android Studio объединить 2.aar в один и другие), опубликованные различными разработчиками, но я не видел окончательного ответа, который позволяет мне создать AAR, который включает в себя 1 или более AAR или JAR (я могу делать с JAR, так как мне не нужно делиться никакими ресурсами, только классы). Вот проект app.gradle для моего библиотечного проекта:
apply plugin: 'com.android.library'
android {
compileSdkVersion 19
buildToolsVersion "19.1.0"
defaultConfig {
minSdkVersion 16
targetSdkVersion 21
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
}
}
}
dependencies {
compile 'com.google.code.gson:gson:2.1'
compile ('libs/eventbus.jar')
compile project(':core-release')
compile project(':midware-release')
}
Опять же, это приложение представляет собой проект библиотеки, который требует двух других проектов библиотеки ( "core-release", "middleware-release" ), и пока я смог создать один файл AAR, который я могу использовать в своем приложении, приложение не смог найти классы зависимых библиотечных проектов, поэтому мне пришлось добавить AAR в два проекта библиотеки в мое приложение.
Вот проект приложения app.gradle(без добавления JAR вручную), который не может найти классы зависимых проектов:
apply plugin: 'com.android.application'
android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
applicationId "com.app.sample"
minSdkVersion 19
targetSdkVersion 23
versionCode 1
versionName "1.0"
}
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 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile files('libs/eventbus.jar')
compile project(':sdk3-debug')
}
Я не думаю, что файл AAR проекта библиотеки вытягивает зависимые проекты (AAR или JAR), и поэтому приложение не может найти классы.
Я читал о транзитивной зависимости, но мне не удалось найти пример реализации, который может помочь в моей ситуации.
Ответы
Ответ 1
Это должно исправить вашу проблему:
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.1.1'
compile 'com.android.support:design:23.1.1'
compile files('libs/eventbus.jar')
compile project(':sdk3-debug') { transitive = true }
}
Включите транзитивный флаг в true
.
Ответ 2
Я смог решить эту проблему, следуя предложению Стэна Курдзиэля: fooobar.com/questions/45057/... и вот шаги, которые я предпринял для решения:
- Я создал AAR, который я опубликовал в локальном репозитории maven
- Теперь этот AAR был доступен в проекте приложения
- Этот AAR также ссылался на классы в основных и промежуточных библиотеках. Я последовал за приходом Стена Курдзиэля № 2:
Вручную добавьте зависимость от Библиотечного проекта 2 к Проекту приложения - чтобы ваше приложение имело строку зависимости для обоих библиотек. В зависимости от вашей конкретной ситуации это может быть или не быть приемлемым решением.
Надеемся, что это поможет другим, которые могут столкнуться с подобной проблемой.
Ответ 3
Я не видел окончательного ответа, который позволяет мне создать AAR, который включает в себя 1 или более AAR или JAR.
Да, я думаю, потому что этот вопрос не ограничивается AAR или JAR, но как Maven управляет зависимостью.
https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html
в то время как мне удалось создать один файл AAR, который я могу использовать в своем приложении, приложение не могло найти классы зависимых библиотек, поэтому мне пришлось добавить AAR в два проекта библиотеки в мое приложение.
Это не ваша ответственность AAR за включение ваших зависимостей, ваш POM файл должен содержать информацию об зависимостях.
https://maven.apache.org/pom.html
Я не думаю, что файл AAR проекта библиотеки вытягивает зависимые проекты (AAR или JAR), и поэтому приложение не может найти классы.
Правильно, вам все равно нужно включить зависимость библиотек в вашем приложении.
Я предполагаю, что вы хотите, чтобы ваша библиотека могла использоваться приложением, без указания зависимостей библиотеки core-release
и midware-release
. Я сделал полное объяснение здесь андроид-студия генерировать aar с зависимостью, но вот что вам нужно сделать:
- Загрузите
core-release
и midware-release
в репозиторий Maven
-
Создайте POM файл для вашей библиотеки, который включает ваши зависимости
<project>
<modelVersion>4.0.0</modelVersion>
<parent>...</parent>
<artifactId>okhttp</artifactId>
<name>OkHttp</name>
<dependencies>
<dependency>
<groupId>com.example</groupId>
<artifactId>core-release</artifactId>
</dependency>
<dependency>
<groupId>com.example</groupId>
<artifactId>midware-release</artifactId>
</dependency>
</dependencies>
<build>...</build>
</project>
-
Опубликуйте свой AAR с этим файлом POM
mvn deploy:deploy-file \
-DgroupId=com.example \
-DartifactId=your-library \
-Dversion=1.0.1 \
-Dpackaging=aar \
-Dfile=your-library.aar \
-DpomFile=path-to-your-pom.xml \
-DgeneratePom=true \
-DupdateReleaseInfo=true \
-Durl="https://mavenUserName:[email protected]/repository/maven-releases/"
И тогда ваше приложение может использовать вашу библиотеку. Gradle автоматически загрузит ваши транзитивные зависимости библиотеки.