web-dev-qa-db-ja.com

ライブラリプロジェクトで使用されているaarファイルをAndroid

私のプロジェクトには、いくつかのライブラリプロジェクトが含まれています。ライブラリはいくつかの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'
    }
}
11
Manish

aarファイルには transitive dependencyが含まれておらず、pomファイルがありませんライブラリが使用する依存関係について説明します。

つまり、flatDirリポジトリを使用してaarファイルをインポートする場合は、プロジェクトでも依存関係を指定する必要があります

mavenリポジトリを使用する必要があります(ライブラリをプライベートまたはパブリックのmavenリポジトリで公開する必要があります)。同じ問題は発生しません。
この場合、gradleは依存関係リストを含むpomファイルを使用して依存関係をダウンロードします。

21

Android studioの場合

次の手順に従ってください:

ステップ1:

インポート.aar

ファイル--->新規--->新規モジュール--->(選択)インポート.JAR/.AARパッケージ--->次へ--->(選択.aar file then)Finish

これで、既存のプロジェクトがインポートされます。

ステップ2:

dependenciesを追加

ファイル--->プロジェクトの構造--->(モジュールリストが左側の下部に表示されます。)--->(appモジュールを選択)--->依存関係タブを選択---> (+)ボタンをクリックします--->モジュールの依存関係を選択します--->(追加したモジュールを選択します)---> ok ---> ok

To add dependencies(1) add dependencies(2)

注:依存関係を確認するために追加されました

君の 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')
}
6
Pramod Waghmare

App-> libにaarファイルの複製を保持し、それらの依存関係をapp-> gradleファイルに定義した場合、問題はありません。しかし、それは正しいアプローチではありません。

そうです、appは_build.gradle_でAARライブラリの依存関係を定義するべきではありません。これは、OkHttp、Picasso、RxJavaなどのサードパーティライブラリの一般的な方法です。これらのライブラリは、実際には、AARライブラリと同じように、独自の依存関係を持っています。

では、なぜOkHttp、Picasso、またはRxJavaがアプリに依存関係を含めるように要求しないのですか? POMファイル への依存関係が含まれているためです。 POMファイルには、アーティファクト、グループ名、バージョン、およびその依存関係を含む、AARの構成ファイルが含まれています。

OkHttpを例にとってみましょう。 OkHttpとその依存関係は他の人のコンピューターに保存されます。 mvnrepository.comにアクセスして、OkHttpを検索します。

Ok Http Maven

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は依存関係を自動的にダウンロードします。アプリプロジェクトでライブラリの依存関係を指定する必要はありません。

しかし、それは正しいアプローチではありません。

正しいアプローチは次のとおりです。

  1. ライブラリとその依存関係をMavenリポジトリに保存します。

ローカルのMavenリポジトリを使用するか、独自のMavenリポジトリをホストするか、ライブラリをMaven CentralまたはBintrayで公開できます。 inthecheesefactory には、そのための優れたチュートリアルがあります。

  1. ライブラリのPOMファイルを作成します。

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
_
  1. ライブラリを同僚と共有します。

アプリレベルの_build.gradle_で、ライブラリの [〜#〜] gav [〜#〜] を追加します。

_dependencies{
    implementation "com.example:yourlibrary:1.0.1"
}
_

これで、あなたとあなたの同僚はyourlibraryを使用できるようになります。

1
aldok

私の場合、次のことがうまくいきました:

.aarファイルをlibsディレクトリに配置し(必要に応じて作成)、次のコードをbuild.gradle(アプリレベル)に追加します。

    repositories { 
        flatDir { 
            dirs 'libs' 
        } 
    } 

    dependencies { 
        compile fileTree(dir: 'libs', include: ['*.jar']) 
        compile(name:'your_arr_filename', ext:'aar') 
    } 
1
Monika Moon

Jcenterリポジトリを含める必要があります。アプリレベルのbuild.gradleで次のように入力します。

   repositories {
           jcenter()
    }

dependencies {
      compile 'com.package.youraarpackagename@aar'
}

これらの依存関係は他の依存関係とは異なります。

0
Rushat Rai

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ファイルは、内部ハードウェア用に構築された社内のカスタムファイルであり、パブリックレポに配置されることはありません。

0
Waxhaw