私のプロジェクトには、いくつかのライブラリプロジェクトが含まれています。ライブラリはいくつかのaarファイルを使用しており、そのdependecnyはモジュール:gradleファイルですでに定義されています。このライブラリをプロジェクトに含める際に問題が発生しています。
App-> libにaarファイルの複製を保持し、それらの依存関係をapp-> gradleファイルに定義した場合、問題はありません。しかし、それは正しいアプローチではありません。
エラーの下を見つけてください:
プロジェクト ':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
以下のプロジェクト構造を見つけてください:
sample
|-- app
|-- misnapworkflow
|
|-- lib
|-- api-release.aar
アプリのgradleファイルでは、プロジェクトを含めるために以下が言及されています
依存関係{プロジェクトのコンパイル( ':misnapworkflow')}
以下のmisnapworkflow gradleファイルを見つけてください。
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'
}
}
aarファイルには transitive dependencyが含まれておらず、pomファイルがありませんライブラリが使用する依存関係について説明します。
つまり、flatDir
リポジトリを使用してaarファイルをインポートする場合は、プロジェクトでも依存関係を指定する必要があります。
mavenリポジトリを使用する必要があります(ライブラリをプライベートまたはパブリックのmavenリポジトリで公開する必要があります)。同じ問題は発生しません。
この場合、gradleは依存関係リストを含むpomファイルを使用して依存関係をダウンロードします。
Android studioの場合
次の手順に従ってください:
ステップ1:
インポート.aar
ファイル--->新規--->新規モジュール--->(選択)インポート.JAR/.AARパッケージ--->次へ--->(選択.aar
file then)Finish
これで、既存のプロジェクトがインポートされます。
ステップ2:
dependencies
を追加
ファイル--->プロジェクトの構造--->(モジュールリストが左側の下部に表示されます。)--->(app
モジュールを選択)--->依存関係タブを選択---> (+)ボタンをクリックします--->モジュールの依存関係を選択します--->(追加したモジュールを選択します)---> ok ---> ok
注:依存関係を確認するために追加されました
君の build.gradle
は次のようになります
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')
}
App-> libにaarファイルの複製を保持し、それらの依存関係をapp-> gradleファイルに定義した場合、問題はありません。しかし、それは正しいアプローチではありません。
そうです、app
は_build.gradle
_でAARライブラリの依存関係を定義するべきではありません。これは、OkHttp、Picasso、RxJavaなどのサードパーティライブラリの一般的な方法です。これらのライブラリは、実際には、AARライブラリと同じように、独自の依存関係を持っています。
では、なぜOkHttp、Picasso、またはRxJavaがアプリに依存関係を含めるように要求しないのですか? POMファイル への依存関係が含まれているためです。 POMファイルには、アーティファクト、グループ名、バージョン、およびその依存関係を含む、AARの構成ファイルが含まれています。
OkHttpを例にとってみましょう。 OkHttpとその依存関係は他の人のコンピューターに保存されます。 mvnrepository.comにアクセスして、OkHttpを検索します。
OkHttpとその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>
_
ライブラリをbuild.gradle()
に含めると、Gradleは最上位の_build.gradle
_で定義されたリポジトリでそのライブラリを検索します。 OkHttpの場合、mavenCentral()
に格納されていました。
_repositories {
google()
mavenCentral()
jcenter()
}
_
Gradleは依存関係を自動的にダウンロードします。アプリプロジェクトでライブラリの依存関係を指定する必要はありません。
しかし、それは正しいアプローチではありません。
正しいアプローチは次のとおりです。
ローカルのMavenリポジトリを使用するか、独自のMavenリポジトリをホストするか、ライブラリをMaven CentralまたはBintrayで公開できます。 inthecheesefactory には、そのための優れたチュートリアルがあります。
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/"
_
または Android-maven-publish Gradleプラグインを使用します。
_gradle yourlibrary:assembleRelease yourlibrary:publishMavenReleaseAarPublicationToMavenRepository
_
アプリレベルの_build.gradle
_で、ライブラリの [〜#〜] gav [〜#〜] を追加します。
_dependencies{
implementation "com.example:yourlibrary:1.0.1"
}
_
これで、あなたとあなたの同僚はyourlibrary
を使用できるようになります。
私の場合、次のことがうまくいきました:
.aarファイルをlibsディレクトリに配置し(必要に応じて作成)、次のコードをbuild.gradle(アプリレベル)に追加します。
repositories {
flatDir {
dirs 'libs'
}
}
dependencies {
compile fileTree(dir: 'libs', include: ['*.jar'])
compile(name:'your_arr_filename', ext:'aar')
}
Jcenterリポジトリを含める必要があります。アプリレベルのbuild.gradleで次のように入力します。
repositories {
jcenter()
}
dependencies {
compile 'com.package.youraarpackagename@aar'
}
これらの依存関係は他の依存関係とは異なります。
Monika Moonは私を正しい道に導きましたが、上のインラインでコメントするのに十分な担当者ポイントがありません。はぁ
したがって、デフォルトのAndroid 2020年にAndroid Studio 3.5.3でビルドされたアプリは、プロジェクトビューを介して次のプロジェクト構造になります。
--[yourAppName]
--[app]
--[gradle]
build.gradle <this is the TOP LEVEL one and NOT the one you normally mess with>
トップレベルのbuild.gradleファイルに 'flatDir'アイテムを追加します:
allprojects {
repositories {
google()
jcenter()
// needed so it picks up my aar files
flatDir {
dirs 'libs'
}
}
}
次に、上記の「app」フォルダにあります。次の2つの重要なリソースがあります。
-- [libs] folder where you should drop your aar files
build.gradle file that is the one you add your aar dependencies to.
デフォルトのプロジェクトビルドには、すでに「libs」インクルードが含まれていますが、バージョンに含まれていない場合に備えて、これを追加する必要があります。
dependencies {
implementation fileTree(dir: './libs', include: ['*.jar'])
implementation(name: 'fileNameBeforeExtension', ext:'aar')
これはクリーンで期待どおりに動作します。
私が使用しているAARファイルは、内部ハードウェア用に構築された社内のカスタムファイルであり、パブリックレポに配置されることはありません。