2015-12-23 2 views
6

Я видел вопросы (Android Studio combine 2 .aar into one и другие), размещенные различными разработчиками, но я не видел окончательного ответа, который позволяет мне создать AAR, который включает в себя 1 или более AAR или JAR (I может работать с JAR, поскольку мне не нужно делиться никакими ресурсами, а только с классами). Вот app.gradle моей библиотеки проекта:Создайте AAR с несколькими AAR/JAR

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') 
} 

Опять же, это приложение является проект библиотеки, который нуждается в двух других проектов библиотеки («ядро-релиз», «midware-релиз») и в то время как я был в состоянии для создания одного файла AAR, который я могу использовать в своем приложении, приложение не смогло найти классы зависимых библиотек, поэтому мне пришлось добавить AAR в два проекта библиотеки в мое приложение.

Вот app.gradle проект приложения (без добавления JARs вручную), который не может найти классы проектов зависимых:

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.

+1

Я пробовал, но я не могу пройти мимо 'Нет такого свойства: переходный для класса: org.gradle.api.internal.project.DefaultProject_Decorated' error. Даже переключение на оболочку градиента по умолчанию в Build Tools -> Настройки Gradle из локального распределения градиентов не помогли –

+2

Можете ли вы попробовать: compile (project (': sdk3-debug')) {transitive = true} –

+0

Этот новый формат обеспечивает град теперь счастлив. Однако мой проект приложения не может найти классы в проекте библиотеки (middleware), который находится в файле AAR. Доступны классы, которые находятся непосредственно в файле AAR. Как я уже упоминал, у моего файла AAR есть два зависимых проекта (core и middleware). –

1

Я был в состоянии решить проблему, следуя Stan Kurdziel «s предложение: stackoverflow.com/questions/30052058/multiple-aar-files и вот шаги, которые я сделал, чтобы прийти к решению:

  • Я создал AAR, который я опубликовал в локальный репозиторий Maven
  • Теперь этот AAR был доступен в прикладном проекте
  • Этот AAR также имел ссылку на классы в библиотеках ядра и промежуточной среды. Я последовал за Stan Kurdziel Подход # 2:

вручную добавить зависимость от библиотеки проекта 2 к проекту приложения - так что ваше приложение имеет ряд зависимостей для обеих библиотек. В зависимости от конкретной ситуации это может быть или не быть приемлемым решением.

Надеюсь, что это поможет другим, которые могут столкнуться с подобной проблемой.

1

Я не видел окончательного ответа, который позволяет мне создать AAR, который включает в себя 1 или более AAR или JAR.

Да, я думаю, потому что эта тема не ограничивается AAR или JAR, но как Maven управляет зависимостью.

https://maven.apache.org/guides/introduction/introduction-to-dependency-mechanism.html

в то время как я был в состоянии произвести один файл AAR, который можно использовать в моем приложении, приложение не удалось найти классы зависимых библиотечных проектов так, мне пришлось добавить два библиотечные проектов «AARs в мое приложение.

Это не ваша ответственность AAR за включение ваших зависимостей, ваш файл POM должен содержать информацию об зависимостях.

https://maven.apache.org/pom.html

Я не думаю, что файл AAR проекта библиотеки тянет в зависимых проектов (AAR или JAR) и, следовательно, приложение не может найти классы.

Правильно, вам все равно необходимо включить зависимость библиотек в приложении.

Я предполагаю, что вы хотите, чтобы ваша библиотека могла использоваться приложением, без указания зависимостей вашей библиотеки core-release и midware-release. Я сделал полное объяснение здесь android studio generate aar with dependency, но вот то, что вам нужно сделать:

  1. Загрузить core-release и midware-release в репозиторий Maven
  2. Создайте файл 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> 
    
  3. Публикация 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 автоматически загрузит ваши транзитные зависимости библиотеки.