From 4c343ba0fc1a8a18382c9c971a34d835d558b525 Mon Sep 17 00:00:00 2001 From: tonihei Date: Wed, 22 Dec 2021 12:46:46 +0000 Subject: [PATCH] Add workaround for missing aar tags in POM There is an open Gradle bug that dependencies with AARs are not marked as such in the created POM files (https://github.com/gradle/gradle/issues/3170). This causes issues building ExoPlayer with Maven POMs only. (Issue: google/ExoPlayer#8353). This change adds the workaround suggested on the Gradle bug until the bug is fixed. As we have a mixture of JAR and AAR dependencies, we need to maintain a lookup table to know which dependencies have AARs. The current code throws when a new dependency is added and it's not classified. #minor-release PiperOrigin-RevId: 417797407 --- RELEASENOTES.md | 2 + missing_aar_type_workaround.gradle | 97 ++++++++++++++++++++++++++++++ publish.gradle | 5 ++ 3 files changed, 104 insertions(+) create mode 100644 missing_aar_type_workaround.gradle diff --git a/RELEASENOTES.md b/RELEASENOTES.md index cfde3aa0ac4..42041d90209 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -24,6 +24,8 @@ * Amend logic in `AdaptiveTrackSelection` to allow a quality increase under sufficient network bandwidth even if playback is very close to the live edge ((#9784)[https://github.com/google/ExoPlayer/issues/9784]). + * Fix Maven dependency resolution + ((#8353)[https://github.com/google/ExoPlayer/issues/8353]). * Android 12 compatibility: * Upgrade the Cast extension to depend on `com.google.android.gms:play-services-cast-framework:20.1.0`. Earlier diff --git a/missing_aar_type_workaround.gradle b/missing_aar_type_workaround.gradle new file mode 100644 index 00000000000..2bbbd3c2e32 --- /dev/null +++ b/missing_aar_type_workaround.gradle @@ -0,0 +1,97 @@ +// Copyright 2021 The Android Open Source Project +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// Workaround for https://github.com/gradle/gradle/issues/3170, adding +// aar in the POM to all dependencies that have AAR files. +def addMissingAarTypeToXml(xml) { + // Dependencies that have JARs only (=don't contain an AAR file). + def jar_only_dependencies = [ + "androidx.annotation:annotation", + "androidx.collection:collection", + "androidx.concurrent:concurrent-futures", + "junit:junit", + "com.google.ads.interactivemedia.v3:interactivemedia", + "com.google.guava:guava", + "com.google.truth:truth", + "com.squareup.okhttp3:okhttp", + "com.squareup.okhttp3:mockwebserver", + "org.mockito:mockito-core", + "org.robolectric:robolectric", + ] + // Dependencies that have AAR files. + def aar_dependencies = [ + "androidx.annotation:annotation-experimental", + "androidx.appcompat:appcompat", + "androidx.core:core", + "androidx.core:core-ktx", + "androidx.leanback:leanback", + "androidx.media:media", + "androidx.media2:media2-session", + "androidx.multidex:multidex", + "androidx.recyclerview:recyclerview", + "androidx.test:core", + "androidx.test.ext:junit", + "androidx.test.ext:truth", + "androidx.work:work-runtime", + "com.google.android.gms:play-services-cast-framework", + "com.google.android.gms:play-services-cronet", + "com.google.android.material:material", + "io.antmedia:rtmp-client", + ] + xml.asNode().children().stream() + .filter { it.name().toString().endsWith("dependencies") } + .forEach { + it.children().stream() + .forEach { + String groupId = + it.children().stream() + .filter { it.name().toString().endsWith("groupId") } + .findFirst() + .get() + .children()[0] + String artifactId = + it.children().stream() + .filter { + it.name().toString().endsWith("artifactId") + } + .findFirst() + .get() + .children()[0] + String dependencyName = groupId + ":" + artifactId + boolean isProjectLibrary = + groupId == 'com.google.android.exoplayer' + boolean hasJar = + jar_only_dependencies.contains(dependencyName) + boolean hasAar = + isProjectLibrary + || aar_dependencies.contains(dependencyName) + if (!hasJar && !hasAar) { + throw new IllegalStateException( + dependencyName + " is not on the JAR or AAR list in missing_aar_type_workaround.gradle") + } + boolean hasTypeDeclaration = + it.children().stream() + .filter { it.name().toString().endsWith("type") } + .findFirst() + .isPresent() + if (hasAar && !hasTypeDeclaration) { + it.appendNode("type", "aar") + } + } + } +} + +ext { + addMissingAarTypeToXml = this.&addMissingAarTypeToXml +} diff --git a/publish.gradle b/publish.gradle index 693a6856a33..44720c32c44 100644 --- a/publish.gradle +++ b/publish.gradle @@ -13,6 +13,8 @@ // limitations under the License. apply plugin: 'maven-publish' +apply from: "$gradle.ext.exoplayerSettingsDir/missing_aar_type_workaround.gradle" + afterEvaluate { publishing { repositories { @@ -46,6 +48,9 @@ afterEvaluate { connection = 'scm:git:https://github.com/google/ExoPlayer.git' url = 'https://github.com/google/ExoPlayer' } + withXml { + addMissingAarTypeToXml(it) + } } } }