Search code examples
androidmavenunity-game-engineaarprime31

play-services-base versus -basement dependencies (AAR) in Android


I found an xml file GoogleDependencyFlurryPlugin.xml

<dependencies>
<dependency><groupId>com.google.android.gms</groupId><artifactId>play-services-base</artifactId><version>8.4+</version></dependency>
<dependency><groupId>com.google.android.gms</groupId><artifactId>play-services-basement</artifactId><version>8.4+</version></dependency>
</dependencies>

and indeed an xml file GoogleDependencyPlayGameServicesPlugin.xml

<dependencies>
<dependency><groupId>com.google.android.gms</groupId><artifactId>play-services-games</artifactId><version>8.4+</version></dependency>
<dependency><groupId>com.google.android.gms</groupId><artifactId>play-services-plus</artifactId><version>8.4+</version></dependency>
</dependencies>

Now, at one point the former file had ONLY

play-services-base > OR < play-services-basement

and that seemed to cause a huge problem. AndroidJavaException: java.lang.NoSuchMethodError: once running on a device.

Android experts, is it the case that if you have "base" you must have "basement" ... or perhaps vice versa?

Indeed, WRT play-services-games or play-services-plus, perhaps one/both of those depend in some way (or contradict?) base/basement?


Solution

  • The library play-services-basement is a dependency of play-services-base. It was introduced in Google Play Service version 8.1.0 to help to reduce the size of some other libraries like play-services-ads and play-services-analytics.

    When you add play-services-base you automatically add also play-services-basement so it's not necessary to add the explicit dependency.

    You can check the dependencies of every single library in your local Google repository.

    For example for the library play-services-games open the file pom file that is located here:

    extras/google/m2repository/com/google/android/gms/play-services-games/8.4.0/play-services-games-8.4.0.pom
    

    this is the content of the file:

    <?xml version="1.0" encoding="UTF-8"?>
    <project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
      <modelVersion>4.0.0</modelVersion>
      <groupId>com.google.android.gms</groupId>
      <artifactId>play-services-games</artifactId>
      <version>8.4.0</version>
      <packaging>aar</packaging>
      <dependencies>
        <dependency>
          <groupId>com.google.android.gms</groupId>
          <artifactId>play-services-base</artifactId>
          <version>8.4.0</version>
          <scope>compile</scope>
          <type>aar</type>
        </dependency>
        <dependency>
          <groupId>com.google.android.gms</groupId>
          <artifactId>play-services-drive</artifactId>
          <version>8.4.0</version>
          <scope>compile</scope>
          <type>aar</type>
        </dependency>
      </dependencies>
    </project>
    

    As you can see play-services-games depends on play-services-base and play-services-drive