I have library and project which depends on that library. Library is stored in my private maven repo as aar file. Library has different dependencies and one of them is google maps. So I specified it in build.gradle file and set meta-data tag inside lib manifest as
<meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />
When I try to compile my project there is an error
No resource found that matches the given name (at 'value' with value '@integer/google_play_services_version')
This is common error but I never saw problem as I described with aar file.
My lib build.gradle file
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:2.3.2@aar') {
transitive = true;
}
compile 'com.android.support:support-v4:22.1.+'
//Explicitly specified maps version
compile('com.google.android.gms:play-services-maps:7.5.0@aar') {
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
<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>
My project 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>
my app 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')
}
So main logic is inside library. Project just have some style changes. As I can see inside aar file there is R.txt file with all values and params from library and also there is line
int integer google_play_services_version 0x7f080002
but anyway everytime when I'm compiling project I'm getting error. How can I solve this?
One easiest and bad solution is to hardcode this value inside my library, but I think it's awful.
Another big question is why do I need to specify inside my manifest value from library, which uses only inside that library? Why just don't use it inside and leave developes without that problem
I think it is not honoring the play resources, because you don't have transient dependencies on you aar. You are importing your own aar
with the artifact only notation (see Section 52.4.1.2). If you want the dependencies to be transitive you have to explicitly set them to be so (as you did in your library build file.
dependencies {
compile(group: 'com.myapplib', name: 'myapplib', version: '1.0.3', ext: 'aar') {
transitive = true;
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With