Как ссылаться на пакеты зависимостей в библиотеку Android, например файл .aar?

У меня есть плагин для библиотеки Android, который использует несколько библиотек Android, включенных в виде файлов .jar и ссылающихся непосредственно на мой файл build.gradle:

compile fileTree(dir: 'libs', include: '*.jar')

Затем я бы выполнил команду gradlew assembleRelease, чтобы создать файл .aar, который можно было бы использовать в приложении Android. Это всегда хорошо работало для меня до сих пор.

Теперь мне нужно использовать службы Google Play в моей библиотеке Android. Как указано в официальной документации Android (http://developer.android.com/google/play-services/setup.html#Setup), мне нужно включить службы Google Play в качестве проекта библиотеки, импортировав его из maven:

compile 'com.google.android.gms:play-services:4.3.23'

Но когда я создаю свой файл .aar, кажется, что сервисы Google Play не включены в него (мой файл .aar составляет всего 200 КБ, а библиотека .jar сервисов Google Play > 1 МБ).

Я читал, что на службы Google Play следует ссылаться как на модуль библиотеки Android, но мне не удается импортировать его таким образом без ошибок компиляции. Может ли кто-нибудь помочь мне упаковать службы Google Play в мою библиотеку Android?

Мой файл android-library build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
    }
}
apply plugin: 'android-library'

repositories {
    mavenCentral()
}

dependencies {
    compile 'com.google.android.gms:play-services:4.3.23'
    compile fileTree(dir: 'libs', include: '*.jar')
}

android {
    compileSdkVersion 19
    buildToolsVersion '19.0.1'

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 19
    }
    release {
        runProguard false
    }
}

Мой файл приложения для Android build.gradle:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.6.+'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
    flatDir {
        dirs 'libs'
    }
}

android {
    compileSdkVersion 19
    buildToolsVersion "19.0.1"

    defaultConfig {
        minSdkVersion 9
        targetSdkVersion 19
    }
    buildTypes {
        release {
            runProguard true
            proguardFile getDefaultProguardFile('proguard-android-optimize.txt')
        }
    }
    productFlavors {
        defaultFlavor {
            proguardFile 'proguard-rules.txt'
        }
    }
}

dependencies {
    compile 'com.android.support:appcompat-v7:+'
    compile 'novom.anyware.anywaresdk:anywaresdk:0.1.0@aar'
}

При выдаче gradle dependencies из корня моего основного модуля вот мой результат:

Relying on packaging to define the extension of the main artifact has been depre
cated and is scheduled to be removed in Gradle 2.0
:MyOldApp:dependencies

------------------------------------------------------------
Project :MyOldApp
------------------------------------------------------------

_DefaultFlavorDebugApk
+--- com.android.support:appcompat-v7:+ -> 19.1.0
|    \--- com.android.support:support-v4:19.1.0
\--- novom.anyware.anywaresdk:anywaresdk:0.1.0

_DefaultFlavorDebugCompile
+--- com.android.support:appcompat-v7:+ -> 19.1.0
|    \--- com.android.support:support-v4:19.1.0
\--- novom.anyware.anywaresdk:anywaresdk:0.1.0

_DefaultFlavorReleaseApk
+--- com.android.support:appcompat-v7:+ -> 19.1.0
|    \--- com.android.support:support-v4:19.1.0
\--- novom.anyware.anywaresdk:anywaresdk:0.1.0

_DefaultFlavorReleaseCompile
+--- com.android.support:appcompat-v7:+ -> 19.1.0
|    \--- com.android.support:support-v4:19.1.0
\--- novom.anyware.anywaresdk:anywaresdk:0.1.0

_DefaultFlavorTestApk
No dependencies

_DefaultFlavorTestCompile
No dependencies

apk - Classpath packaged with the compiled main classes.
+--- com.android.support:appcompat-v7:+ -> 19.1.0
|    \--- com.android.support:support-v4:19.1.0
\--- novom.anyware.anywaresdk:anywaresdk:0.1.0

archives - Configuration for archive artifacts.
No dependencies

compile - Classpath for compiling the main sources.
+--- com.android.support:appcompat-v7:+ -> 19.1.0
|    \--- com.android.support:support-v4:19.1.0
\--- novom.anyware.anywaresdk:anywaresdk:0.1.0

debugApk - Classpath packaged with the compiled debug classes.
No dependencies

debugCompile - Classpath for compiling the debug sources.
No dependencies

default - Configuration for default artifacts.
No dependencies

defaultFlavorApk - Classpath packaged with the compiled defaultFlavor classes.
No dependencies

defaultFlavorCompile - Classpath for compiling the defaultFlavor sources.
No dependencies

instrumentTestApk - Classpath packaged with the compiled instrumentTest classes.

No dependencies

instrumentTestCompile - Classpath for compiling the instrumentTest sources.
No dependencies

instrumentTestDefaultFlavorApk - Classpath packaged with the compiled instrument
TestDefaultFlavor classes.
No dependencies

instrumentTestDefaultFlavorCompile - Classpath for compiling the instrumentTestD
efaultFlavor sources.
No dependencies

releaseApk - Classpath packaged with the compiled release classes.
No dependencies

releaseCompile - Classpath for compiling the release sources.
No dependencies

BUILD SUCCESSFUL

Total time: 7.388 secs

person Raphael Royer-Rivard    schedule 10.04.2014    source источник
comment
Как вы думаете, почему вы хотите, чтобы службы Google Play были упакованы в [вашу] библиотеку Android?   -  person CommonsWare    schedule 10.04.2014
comment
Я хочу использовать геозону, предоставляемую сервисами Google Play.   -  person Raphael Royer-Rivard    schedule 10.04.2014
comment
Это не означает, что сервисы Play должны быть включены в AAR. Итак, я спрошу еще раз: как вы думаете, почему вы хотите, чтобы сервисы Google Play были упакованы в [вашу] библиотеку Android?   -  person CommonsWare    schedule 10.04.2014
comment
Потому что, когда я использую свою библиотеку Android в приложении Android, когда вызывается метод GooglePlayServicesUtil.isGooglePlayServicesAvailable, я получаю следующую ошибку: E/GooglePlayServicesUtil﹕ The Google Play services resources were not found. Check your project configuration to ensure that the resources are included. Если есть правильный способ включения этих ресурсов без упаковки Служб Google Play в мою библиотеку Android, пожалуйста, покажите мне, как.   -  person Raphael Royer-Rivard    schedule 10.04.2014
comment
Запустите gradle dependencies в своем проекте приложения (не в проекте библиотеки). Если у вас есть директива compile 'com.google.android.gms:play-services:4.3.23' в вашем AAR, и ваш проект приложения зависит от AAR, вы должны увидеть зависимость play-services в отчете. Я предполагаю, что вы этого не сделаете, возможно, из-за неправильной конфигурации где-то в ваших build.gradle файлах.   -  person CommonsWare    schedule 10.04.2014
comment
Поскольку я еще не эксперт по gradle, я добавил файлы build.gradle в свой пост, пока ищу неправильную конфигурацию.   -  person Raphael Royer-Rivard    schedule 10.04.2014
comment
Хммм... Я не использую flatDir, а скорее помещаю свои AAR в репозиторий Maven. В противном случае ваши файлы build.gradle выглядят нормально. Мне было бы интересно узнать, что сообщает gradle dependencies для приложения.   -  person CommonsWare    schedule 10.04.2014
comment
Вот что я получил, выполнив команду gradle dependencies из корня моего проекта: Опора на упаковку для определения расширения основного артефакта устарела и должна быть удалена в Gradle 2.0: зависимости -------- -------------------------------------------------- -- Корневой проект ------------------------------------------------------------- -------------- Нет конфигураций ПОСТРОЙКА УСПЕШНА Общее время: 7.001 сек.   -  person Raphael Royer-Rivard    schedule 10.04.2014
comment
Является ли корень вашего проекта там, где находится ваше приложение? Запустите gradle dependencies в том же месте, где вы запускаете другие команды Gradle для своего приложения (например, gradle installDebug).   -  person CommonsWare    schedule 10.04.2014
comment
да, извините за ошибку, я добавил это в свой пост   -  person Raphael Royer-Rivard    schedule 10.04.2014
comment
Хорошо, flatDir не участвует в отчете о зависимостях. Очевидно, что вы, по крайней мере, добавляете свой код AAR в сборку, иначе вы не смогли бы скомпилировать.   -  person CommonsWare    schedule 10.04.2014
comment
Да, в нем не упоминаются зависимости моего файла aar. И если это может дать вам еще одну подсказку, даже если я получаю журнал ошибок из метода GooglePlayServicesUtil.isGooglePlayServicesAvailable, он возвращает true, но зависает позже, когда я создаю экземпляр объекта LocationClient.   -  person Raphael Royer-Rivard    schedule 10.04.2014
comment
Вы нашли способ распространять свой .aar с упакованными в него необходимыми зависимостями?   -  person David    schedule 14.02.2015
comment
Нет, я заставляю пользователей моей библиотеки использовать gradle, поэтому слияние манифеста включает зависимости. Если они используют другую версию одной из моих зависимостей, я думаю, это не сработает...   -  person Raphael Royer-Rivard    schedule 14.02.2015
comment
@CommonsWare есть ли способ заставить пользователей скомпилировать определенные библиотеки в своих зависимостях gradle, если они используют мою библиотеку?   -  person 2cupsOfTech    schedule 13.05.2015
comment
@2cupsOfTech: Сила? Нет. Если вы распространяете свою библиотеку как артефакт в репозитории, метаданные (например, файл POM для репозитория Maven) будут указывать любые библиотеки, от которых вы зависите, и вы можете включить туда информацию о версии. Разработчики, использующие вашу библиотеку, в свою очередь, могут переопределить ваши пожелания. В конце концов, это их приложение, а не ваше.   -  person CommonsWare    schedule 13.05.2015
comment
@CommonsWare Я надеялся распространять свою библиотеку в виде загружаемого напрямую файла .aar без использования, например. репозиторий Maven, но мне нужно сообщить пользователю о его зависимостях, поэтому я пытаюсь найти лучший способ сделать это?   -  person 2cupsOfTech    schedule 14.05.2015
comment
@2cupsOfTech: пытаешься найти лучший способ сделать это? -- написать документацию. Разместите это на веб-сайте, на котором вы распространяете библиотеку. Объясните, что именно люди должны делать, чтобы использовать вашу библиотеку, включая наличие зависимостей.   -  person CommonsWare    schedule 14.05.2015
comment
@CommonsWare Я должен иметь возможность публиковать артефакт с закрытым исходным кодом .aar через репозиторий Maven?   -  person 2cupsOfTech    schedule 14.05.2015
comment
@2cupsOfTech: Да. Если у вас есть дополнительные вопросы в этой области, задайте новый вопрос Stack Overflow, а не продолжайте комментировать здесь.   -  person CommonsWare    schedule 14.05.2015
comment
@CommonsWare Я сделал это вчера: stackoverflow.com/q/30202718/550393   -  person 2cupsOfTech    schedule 14.05.2015