16

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

kandroidj
  • 13,784
  • 5
  • 64
  • 76
cooperok
  • 4,249
  • 3
  • 30
  • 48

4 Answers4

1

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;
    }
}
iagreen
  • 31,470
  • 8
  • 76
  • 90
  • Actually I tried this and it didn't work. But you forced me to think in right direction. Problem was in not full pom.xml file for library aar, stored in my private repo. It has only data about version, group and name, without dependencies. I don't know why, but so it generates by Gradle. So I tried to manually add dependencies in pom.xml and it really helps. This problem is solved but now I should find a way to generate correct pom.xml for library – cooperok Aug 24 '15 at 15:32
0

Try to add

    <meta-data
    android:name="com.google.android.gms.version"
    android:value="@integer/google_play_services_version" />

into your main manifest file

Ivan V
  • 3,024
  • 4
  • 26
  • 36
0
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" />
parik dhakan
  • 787
  • 4
  • 19
-1

But you didn't mention google play services version. create an xml file (i.e version.xml)

   <?xml version ="1.0" encoding = "utf-8"?>
   <resources>
   <integer name ="google_play_services_version">your_version_here</integer>
   </resources>

also add

 <meta-data
android:name="com.google.android.gms.version"
android:value="@integer/google_play_services_version" />

in your manifest file.

yank
  • 1
  • 2