Ошибка с значением google_play_services_version из aar library
У меня есть библиотека и проект, который зависит от этой библиотеки. Библиотека хранится в моем приватном репозитории maven как файл aar. Библиотека имеет разные зависимости, а одна из них - карты Google. Поэтому я указал его в файле build.gradle и установил тег метаданных внутри манифеста lib как
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
Когда я пытаюсь скомпилировать мой проект, появляется ошибка
Не найден ресурс, который соответствует указанному имени (по значению "значение" со значением @Целое число /google _play_services_version ')
Это обычная ошибка, но я никогда не видел проблемы, описанной в файле aar.
Мой файл lib build.gradle
apply plugin: 'com.android.library'
apply plugin: 'com.jfrog.artifactory'
apply plugin: 'maven-publish'
def packageName = 'com.myapplib'
def libraryVersion = '1.0.3'
android {
compileSdkVersion 22
buildToolsVersion "22.0.1"
publishNonDefault true
defaultConfig {
minSdkVersion 15
targetSdkVersion 21
}
buildTypes {
def BOOLEAN = "boolean"
def TRUE = "true"
def FALSE = "false"
def LOG_HTTP_REQUESTS = "LOG_HTTP_REQUESTS"
def LOG_IMAGES_REQUESTS = "LOG_IMAGES_REQUESTS"
def REPORT_CRASHES = "REPORT_CRASHES"
def TRACK_GTM = "TRACK_GTM"
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt'
buildConfigField BOOLEAN, LOG_IMAGES_REQUESTS, FALSE
buildConfigField BOOLEAN, LOG_HTTP_REQUESTS, FALSE
buildConfigField BOOLEAN, TRACK_GTM, TRUE
buildConfigField BOOLEAN, LOG_ERRORS_WITH_GTM, TRUE
buildConfigField BOOLEAN, REPORT_CRASHES, TRUE
}
debug {
ext.enableCrashlytics = false
buildConfigField BOOLEAN, LOG_IMAGES_REQUESTS, TRUE
buildConfigField BOOLEAN, LOG_HTTP_REQUESTS, TRUE
buildConfigField BOOLEAN, TRACK_GTM, FALSE
buildConfigField BOOLEAN, LOG_ERRORS_WITH_GTM, FALSE
buildConfigField BOOLEAN, REPORT_CRASHES, FALSE
}
}
}
dependencies {
compile 'org.apache.commons:commons-lang3:3.1'
compile('com.crashlytics.sdk.android:crashlytics:[email protected]') {
transitive = true;
}
compile 'com.android.support:support-v4:22.1.+'
//Explicitly specified maps version
compile('com.google.android.gms:play-services-maps:[email protected]') {
transitive = true;
}
}
publishing {
publications {
aar(MavenPublication) {
groupId packageName
version = libraryVersion
artifactId project.getName()
// Tell maven to prepare the generated "*.aar" file for publishing
artifact("$buildDir/outputs/aar/${project.getName()}-release.aar")
}
}
}
artifactory {
contextUrl = 'http://myapp.com/artifactory'
publish {
repository {
// The Artifactory repository key to publish to
repoKey = 'libs-release-local'
username = "admin"
password = "password"
}
defaults {
// Tell the Artifactory Plugin which artifacts should be published to Artifactory.
publications('aar')
publishArtifacts = true
// Properties to be attached to the published artifacts.
properties = ['qa.level': 'basic', 'dev.team': 'core']
// Publish generated POM files to Artifactory (true by default)
publishPom = true
}
}
}
lib Манифест
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.myapplib"
android:versionCode="4"
android:versionName="1.0.3">
<uses-sdk
android:minSdkVersion="15"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<application
android:name="com.myapplib.app.MyApplication"
android:allowBackup="true"
android:icon="@drawable/ic_logo"
android:theme="@style/AppTheme" >
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
<activity
android:name="com.myapplib.gui.LaunchActivity"
android:label="@string/app_name" >
</activity>
<activity
android:name="com.myapplib.gui.LandingPageActivity"
android:noHistory="true"
android:label="@string/app_name" >
</activity>
<activity
android:name="com.myapplib.gui.PreferenceActivity"
android:noHistory="true"
android:label="@string/app_name" >
</activity>
</application>
</manifest>
Мой манифест проекта
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.myapp"
android:versionCode="8"
android:versionName="1.0.7">
<application
android:name="com.myapp.app.MyApplication"
android:allowBackup="true"
android:icon="@drawable/app_logo"
android:label="@string/app_name"
android:largeHeap="true"
android:theme="@style/AppTheme"
tools:replace="icon">
<meta-data
android:name="com.google.android.maps.v2.API_KEY"
android:value="@string/google_api_key" />
<meta-data
android:name="com.crashlytics.ApiKey"
android:value="${crashlytics-api-key}" />
</application>
</manifest>
мое приложение build.gradle
apply plugin: 'com.android.application'
apply plugin: 'io.fabric'
android {
compileSdkVersion 15
buildToolsVersion "22.0.1"
defaultConfig {
applicationId "com.myapp"
minSdkVersion 15
targetSdkVersion 22
}
}
dependencies {
compile(group: 'com.myapplib', name: 'myapplib', version: '1.0.3', ext: 'aar')
}
Итак, основная логика внутри библиотеки. Проект просто имеет некоторые изменения стиля. Как я вижу внутри файла aar, есть файл R.txt со всеми значениями и параметрами из библиотеки, а также есть строка
int integer google_play_services_version 0x7f080002
но в любом случае каждый раз, когда я компилирую проект, я получаю ошибку. Как я могу это решить?
Одним из самых простых и плохих решений является жесткое кодирование этого значения внутри моей библиотеки, но я считаю это ужасным.
Еще один большой вопрос, почему мне нужно указать внутри моего значения манифеста из библиотеки, которая используется только внутри этой библиотеки? Почему просто не использовать его внутри и оставить развиваться без этой проблемы
Ответы
Ответ 1
Я думаю, что это не соблюдение игровых ресурсов, потому что у вас нет временных зависимостей от вас. Вы импортируете свой собственный aar
только с нотной записью артефакта (см. Раздел 52.4.1.2). Если вы хотите, чтобы зависимости были транзитивными, вы должны явно установить их так (как это было в файле сборки библиотеки.
dependencies {
compile(group: 'com.myapplib', name: 'myapplib', version: '1.0.3', ext: 'aar') {
transitive = true;
}
}
Ответ 2
Попробуйте добавить
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
в ваш основной файл манифеста
Ответ 3
May be library not work properly. Try to add your library from extras/google/google_play_services again and then add in your manifest file May be help this one :
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
Ответ 4
Но вы не упомянули версию сервисов Google Play.
создайте xml файл (например, version.xml)
<?xml version ="1.0" encoding = "utf-8"?>
<resources>
<integer name ="google_play_services_version">your_version_here</integer>
</resources>
также добавить
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
в файле манифеста.