Создайте 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 автоматически загрузит ваши транзитивные зависимости библиотеки.