Mon projet inclut un projet de bibliothèque. Library utilise des fichiers aar et sa dépendance est déjà définie dans le module: fichier gradle. J'ai du mal à inclure cette bibliothèque dans mon projet.
Si je garde les fichiers aar en double dans app-> lib et que je définit leur dépendance dans app-> fichier gradle, il n'y a pas de problème. Mais cela ne devrait pas être la bonne approche.
Veuillez trouver ci-dessous l'erreur:
Un problème est survenu lors de la configuration du projet ': app'.
Could not resolve all dependencies for configuration ':app:_qaDebugCompile'. Could not find :api-release:. Searched in the following locations:
https://jcenter.bintray.com//api-release//api-release-.pom
https://jcenter.bintray.com//api-release//api-release-.aar
file:/D:/sample/sample-Android-app/app/libs/api-release-.aar
file:/D:/sample/sample-Android-app/app/libs/api-release.aar
Required by:
sample-Android-app:app:unspecified > sample-Android-app:misnapworkflow:unspecified
veuillez trouver ci-dessous la structure du projet:
sample
|-- app
|-- misnapworkflow
|
|-- lib
|-- api-release.aar
Dans l'application, le fichier suivant a été mentionné pour inclure le projet
dépendances {compile project (': misnapworkflow')}
Veuillez trouver ci-dessous le fichier de gradus misnapworkflow:
apply plugin: 'com.Android.library'
Android {
compileSdkVersion 23
buildToolsVersion "23.0.1"
defaultConfig {
minSdkVersion 10
targetSdkVersion 23
consumerProguardFiles 'proguard-rules.pro'
}
lintOptions {
abortOnError false
}
// Publish both debug and release libraries
publishNonDefault true
buildTypes {
debug {
debuggable true
jniDebuggable true
minifyEnabled false
shrinkResources false
testCoverageEnabled true
}
release {
signingConfig signingConfigs.debug
debuggable false
jniDebuggable false
minifyEnabled true
shrinkResources false
proguardFiles getDefaultProguardFile('proguard-Android-optimize.txt'), 'proguard-rules.pro'
}
}
}
task grantPermissions(type: Exec, dependsOn: 'installDebugTest') {
logger.warn('Granting permissions...')
commandLine "adb Shell pm grant com.miteksystems.misnap.misnapworkflow.test Android.permission.WRITE_EXTERNAL_STORAGE".split(' ')
commandLine "adb Shell pm grant com.miteksystems.misnap.misnapworkflow.test Android.permission.CAMERA".split(' ')
logger.warn('Permissions granted.')
}
tasks.whenTaskAdded { task ->
if (task.name.startsWith('connected')
|| task.name.startsWith('create')) {
task.dependsOn grantPermissions
}
}
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
compile 'com.Android.support:appcompat-v7:23.0.1'
// Add dependency for MiSnap external API
compile(name: 'api-release', ext: 'aar')
// Add dependency for MiSnap
compile(name: 'misnap-release', ext: 'aar') {
exclude module: 'appcompat-v7'
}
// Eventbus dependency
compile 'de.greenrobot:eventbus:2.4.0'
// Add OPTIONAL dependency for Manatee
compile(name: 'manatee-release', ext: 'aar')
compile(name: 'cardio-release', ext: 'aar')
}
repositories {
flatDir {
dirs 'libs'
}
}
Le fichier aar _ ne contient pas le transitive dependencies et n'a pas de fichier pom décrivant les dépendances utilisées par la bibliothèque.
Cela signifie que, si vous importez un fichier aar à l’aide d’un dépôt flatDir
_ vous devez également spécifier les dépendances dans votre projet}.
Vous devez utiliser un référentiel maven (vous devez publier la bibliothèque dans un référentiel maven privé ou public), vous n'aurez pas le même problème.
Dans ce cas, gradle télécharge les dépendances en utilisant le fichier pom qui contiendra la liste des dépendances.
Pour studio Android
Suivez ces étapes:
Étape 1:
Import .aar
Fichier ---> Nouveau ---> Nouveau module ---> (sélectionner) importer le package .JAR/.AAR ---> Suivant ---> (sélectionnez le fichier .aar
puis) Terminer
Maintenant votre projet existant est importé.
Étape 2:
Ajouter dependencies
Fichier ---> Structure du projet ---> (Vous obtiendrez maintenant la liste des modules en bas à gauche.) ---> (Sélectionnez le module app
) ---> onglet Sélection des dépendances ---> cliquez sur (+) bouton ---> sélectionner les dépendances de module ---> (sélectionner le module que vous avez ajouté) ---> ok ---> ok
Note: Pour vérifier la dépendance est ajouté
votre build.gradle
ressemble à
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
testCompile 'junit:junit:4.12'
compile 'com.Android.support:appcompat-v7:23.2.1'
compile 'com.Android.support:design:23.2.1'
compile 'com.squareup.picasso:picasso:2.5.0'
compile project(':ScreenSharingSDK')
}
Dans mon cas, la chose suivante a fonctionné:
Placez votre fichier .aar dans le répertoire libs (créez-le si nécessaire), puis ajoutez le code suivant dans votre build.gradle (niveau de l'application):
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile(name:'your_arr_filename', ext:'aar')
}
Vous devez inclure le référentiel jcenter. Dans le type de build.gradle de niveau application:
repositories {
jcenter()
}
dependencies {
compile 'com.package.youraarpackagename@aar'
}
Ces dépendances sont différentes des autres.
Si je garde les fichiers aar en double dans app-> lib et que je définit leur dépendance dans app-> fichier gradle, il n'y a pas de problème. Mais cela ne devrait pas être la bonne approche.
Vous avez raison, votre app
ne devrait pas définir vos dépendances de la bibliothèque AAR dans build.gradle
. C'est une pratique courante pour les bibliothèques tierces telles que OkHttp, Picasso ou RxJava. En fait, ces bibliothèques ont leurs propres dépendances, tout comme votre bibliothèque AAR.
Alors, pourquoi OkHttp, Picasso ou RxJava ne demande-t-il pas à votre application d'inclure leurs dépendances? Parce qu'ils ont inclus leurs dépendances sur un fichier POM . Un fichier POM contient un fichier de configuration pour votre AAR, y compris votre artefact, le nom du groupe, la version et ses dépendances.
Prenons OkHttp comme exemple. OkHttp et ses dépendances sont stockés dans l'ordinateur d'autres personnes. Allez sur mvnrepository.com et recherchez OkHttp.
Vous trouverez OkHttp et son fichier POM.
<project>
<modelVersion>4.0.0</modelVersion>
<parent>...</parent>
<artifactId>okhttp</artifactId>
<name>OkHttp</name>
<dependencies>
<dependency>
<groupId>com.squareup.okio</groupId>
<artifactId>okio</artifactId>
</dependency>
<dependency>
<groupId>com.google.Android</groupId>
<artifactId>Android</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.google.code.findbugs</groupId>
<artifactId>jsr305</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
<build>...</build>
</project>
Lorsque vous incluez une bibliothèque dans votre build.gradle()
, Gradle recherchera cette bibliothèque dans les référentiels définis dans le build.gradle
de niveau supérieur. Pour OkHttp, il était stocké dans mavenCentral()
.
repositories {
google()
mavenCentral()
jcenter()
}
Gradle téléchargera automatiquement les dépendances, il n'est pas nécessaire de spécifier une dépendance de bibliothèque pour votre projet App.
Mais cela ne devrait pas être la bonne approche.
La bonne approche est:
Vous pouvez utiliser le référentiel Maven local, héberger votre propre dépôt Maven ou publier votre bibliothèque sur Maven Central ou Bintray. inthecheesefactory a un bon tutoriel pour cela.
Lorsque vous déployez votre AAR, vous devez inclure le fichier POM. Cela peut être fait manuellement.
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/"
Ou en utilisant le plugin Gradle de Android-maven-publish .
gradle yourlibrary:assembleRelease yourlibrary:publishMavenReleaseAarPublicationToMavenRepository
Au niveau de l'application build.gradle
, ajoutez le GAV de votre bibliothèque.
dependencies{
implementation "com.example:yourlibrary:1.0.1"
}
Vous et vos pairs devriez pouvoir utiliser yourlibrary
maintenant.