#!/usr/bin/python3 # Helper script for updating androidx.media3 prebuilts from maven # # Usage: # a. Initialize android environment: $ . ./build/envsetup.sh; lunch # b. Build pom2bp (needed by this script): $ m pom2bp # * If this fails with 'fatal error: thread exhaustion' # (and then an *enormous* thread dump), retry the command. # b. Update the version numbers in this file (and ensure any new modules are added below) # c. $ ./prebuilts/misc/common/androidx-media3/update-from-gmaven.py # # The script will then: # 1. Remove the previous artifacts # 2. Download the aars and poms into a file structure mirroring their maven # path # 3. Extract the AndroidManifest from the aars into the manifests folder # 4. Run pom2bp to generate the Android.bp # # The visibility restrictions in Android.bp must be manually restored. # # Manual verification steps: # 1. Build the imported modules, e.g. # $ m androidx.media3.media3-common androidx.media3.media3-session import os import subprocess import sys media3Version="1.0.0-beta03" mavenToBpPatternMap = { "androidx.media3:" : "androidx.media3.", } def cmd(args): print(args) out = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) if (out.returncode != 0): print(out.stderr.decode("utf-8")) sys.exit(out.returncode) out_string = out.stdout.decode("utf-8") print(out_string) return out_string def chdir(path): print("cd %s" % path) os.chdir(path) def getAndroidRoot(): if os.path.isdir(".repo/projects"): return os.getcwd() elif 'TOP' in os.environ: return os.environ['TOP'] else: print("Error: Run from android source root or set TOP envvar") sys.exit(-1) def downloadArtifact(groupId, artifactId, version): """Downloads an aar, sources.jar and pom from google maven""" groupPath = groupId.replace('.', '/') artifactDirPath = os.path.join(groupPath, artifactId, version) artifactPath = os.path.join(artifactDirPath, "%s-%s" % (artifactId, version)) cmd("mkdir -p " + artifactDirPath) # download aar cmd("wget -O %s.aar https://dl.google.com/dl/android/maven2/%s.aar" % (artifactPath, artifactPath)) # extract AndroidManifest.xml from aar, into path expected by pom2bp manifestDir = getManifestPath("%s:%s" % (groupId,artifactId)) cmd("mkdir -p " + manifestDir) cmd("unzip -o %s.aar AndroidManifest.xml -d %s" % (artifactPath, manifestDir)) # download pom cmd("wget -O %s.pom https://dl.google.com/dl/android/maven2/%s.pom" % (artifactPath, artifactPath)) # download sources.jar cmd("wget -O %s-sources.jar https://dl.google.com/dl/android/maven2/%s-sources.jar" % (artifactPath, artifactPath)) def downloadApk(groupId, artifactId, version): """Downloads an apk from google maven""" groupPath = groupId.replace('.', '/') artifactDirPath = os.path.join(groupPath, artifactId, version) artifactPath = os.path.join(artifactDirPath, "%s-%s" % (artifactId, version)) cmd("mkdir -p " + artifactDirPath) # download apk cmd("wget -O %s.apk https://dl.google.com/dl/android/maven2/%s.apk" % (artifactPath, artifactPath)) # download pom cmd("wget -O %s.pom https://dl.google.com/dl/android/maven2/%s.pom" % (artifactPath, artifactPath)) def getManifestPath(mavenArtifactName): """Get the path to the aar's manifest as generated by pom2bp.""" manifestPath = mavenArtifactName for searchPattern in mavenToBpPatternMap: manifestPath = manifestPath.replace(searchPattern, mavenToBpPatternMap[searchPattern]) return "manifests/%s" % manifestPath prebuiltDir = os.path.join(getAndroidRoot(), "prebuilts/misc/common/androidx-media3") chdir(prebuiltDir) cmd("rm -rf androidx/media3") cmd("rm -rf manifests") downloadArtifact("androidx.media3", "media3-common", media3Version) downloadArtifact("androidx.media3", "media3-session", media3Version) atxRewriteStr = "" for name in mavenToBpPatternMap: atxRewriteStr += "-rewrite %s=%s " % (name, mavenToBpPatternMap[name]) cmd("pom2bp " + atxRewriteStr + # map external maven dependencies to Android module names "-rewrite androidx.annotation:annotation=androidx.annotation_annotation " + "-rewrite androidx.annotation:annotation-experimental=androidx.annotation_annotation-experimental " + "-rewrite androidx.collection:collection=androidx.collection_collection " + "-rewrite androidx.media:media=androidx.media_media " + "-rewrite com.google.guava:guava=guava " + "-sdk-version current " + "-static-deps " + "-prepend prepend-license.txt " + ". > Android.bp")