1*847dbab7SAndroid Build Coastguard Worker#!/usr/bin/python3 2*847dbab7SAndroid Build Coastguard Worker 3*847dbab7SAndroid Build Coastguard Worker# Helper script for updating androidx.media3 prebuilts from maven 4*847dbab7SAndroid Build Coastguard Worker# 5*847dbab7SAndroid Build Coastguard Worker# Usage: 6*847dbab7SAndroid Build Coastguard Worker# a. Initialize android environment: $ . ./build/envsetup.sh; lunch <target> 7*847dbab7SAndroid Build Coastguard Worker# b. Build pom2bp and bpfmt (needed by this script): $ m pom2bp bpfmt 8*847dbab7SAndroid Build Coastguard Worker# * If this fails with 'fatal error: thread exhaustion' 9*847dbab7SAndroid Build Coastguard Worker# (and then an *enormous* thread dump), retry the command. 10*847dbab7SAndroid Build Coastguard Worker# c. Start a new repo branch in project `prebuilts/misc`. 11*847dbab7SAndroid Build Coastguard Worker# d. Update this script: 12*847dbab7SAndroid Build Coastguard Worker# * Set `media3Version` to the target version 13*847dbab7SAndroid Build Coastguard Worker# * Extend `downloadArtifact` calls to include new modules if needed. 14*847dbab7SAndroid Build Coastguard Worker# * Extend external dependency rewrite for any new external dependencies 15*847dbab7SAndroid Build Coastguard Worker# of the imported Media3 modules. 16*847dbab7SAndroid Build Coastguard Worker# e. Run the script from the Android source root: 17*847dbab7SAndroid Build Coastguard Worker# $ ./prebuilts/misc/common/androidx-media3/update-from-gmaven.py 18*847dbab7SAndroid Build Coastguard Worker# 19*847dbab7SAndroid Build Coastguard Worker# The script will then: 20*847dbab7SAndroid Build Coastguard Worker# 1. Remove the previous artifacts 21*847dbab7SAndroid Build Coastguard Worker# 2. Download the aars and poms into a file structure mirroring their maven 22*847dbab7SAndroid Build Coastguard Worker# path 23*847dbab7SAndroid Build Coastguard Worker# 3. Extract the AndroidManifest from the aars into the manifests folder 24*847dbab7SAndroid Build Coastguard Worker# 4. Run pom2bp to generate the Android.bp 25*847dbab7SAndroid Build Coastguard Worker# 5. Amend Android.bp with the existing visibility targets, java version, and 26*847dbab7SAndroid Build Coastguard Worker# removal of unavailable dependencies. 27*847dbab7SAndroid Build Coastguard Worker# 28*847dbab7SAndroid Build Coastguard Worker# Manual verification steps: 29*847dbab7SAndroid Build Coastguard Worker# 1. Build the 'leaf' imported modules (i.e. the set that ends up depending 30*847dbab7SAndroid Build Coastguard Worker# on *everything* transitively), e.g. 31*847dbab7SAndroid Build Coastguard Worker# $ m androidx.media3.media3-exoplayer-dash androidx.media3.media3-exoplayer androidx.media3.media3-session androidx.media3.media3-test-utils androidx.media3.media3-transformer androidx.media3.media3-ui 32*847dbab7SAndroid Build Coastguard Worker 33*847dbab7SAndroid Build Coastguard Workerimport os 34*847dbab7SAndroid Build Coastguard Workerimport re 35*847dbab7SAndroid Build Coastguard Workerimport subprocess 36*847dbab7SAndroid Build Coastguard Workerimport sys 37*847dbab7SAndroid Build Coastguard Worker 38*847dbab7SAndroid Build Coastguard Workermedia3Version="1.5.0-rc01" 39*847dbab7SAndroid Build Coastguard Worker 40*847dbab7SAndroid Build Coastguard WorkermavenToBpPatternMap = { 41*847dbab7SAndroid Build Coastguard Worker "androidx.media3:" : "androidx.media3.", 42*847dbab7SAndroid Build Coastguard Worker } 43*847dbab7SAndroid Build Coastguard Worker 44*847dbab7SAndroid Build Coastguard WorkerandroidBpPath = "Android.bp" 45*847dbab7SAndroid Build Coastguard WorkerjavaVersionPattern = r'java_version:\s*"[\d\.]*",' 46*847dbab7SAndroid Build Coastguard WorkermockWebServerUnavailableComment = """// Missing a dependency on okhttp3.mockwebserver because this package is not currently 47*847dbab7SAndroid Build Coastguard Worker// available in /external/. This means the parts of this library that require this 48*847dbab7SAndroid Build Coastguard Worker// dependency are not usable.""" 49*847dbab7SAndroid Build Coastguard Worker 50*847dbab7SAndroid Build Coastguard Workerdef cmd(args): 51*847dbab7SAndroid Build Coastguard Worker print(args) 52*847dbab7SAndroid Build Coastguard Worker out = subprocess.run(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=True) 53*847dbab7SAndroid Build Coastguard Worker if (out.returncode != 0): 54*847dbab7SAndroid Build Coastguard Worker print(out.stderr.decode("utf-8")) 55*847dbab7SAndroid Build Coastguard Worker sys.exit(out.returncode) 56*847dbab7SAndroid Build Coastguard Worker out_string = out.stdout.decode("utf-8") 57*847dbab7SAndroid Build Coastguard Worker print(out_string) 58*847dbab7SAndroid Build Coastguard Worker return out_string 59*847dbab7SAndroid Build Coastguard Worker 60*847dbab7SAndroid Build Coastguard Workerdef chdir(path): 61*847dbab7SAndroid Build Coastguard Worker print("cd %s" % path) 62*847dbab7SAndroid Build Coastguard Worker os.chdir(path) 63*847dbab7SAndroid Build Coastguard Worker 64*847dbab7SAndroid Build Coastguard Workerdef getAndroidRoot(): 65*847dbab7SAndroid Build Coastguard Worker if os.path.isdir(".repo/projects"): 66*847dbab7SAndroid Build Coastguard Worker return os.getcwd() 67*847dbab7SAndroid Build Coastguard Worker elif 'TOP' in os.environ: 68*847dbab7SAndroid Build Coastguard Worker return os.environ['TOP'] 69*847dbab7SAndroid Build Coastguard Worker else: 70*847dbab7SAndroid Build Coastguard Worker print("Error: Run from android source root or set TOP envvar") 71*847dbab7SAndroid Build Coastguard Worker sys.exit(-1) 72*847dbab7SAndroid Build Coastguard Worker 73*847dbab7SAndroid Build Coastguard Workerdef downloadArtifact(groupId, artifactId, version): 74*847dbab7SAndroid Build Coastguard Worker """Downloads an aar, sources.jar and pom from google maven""" 75*847dbab7SAndroid Build Coastguard Worker groupPath = groupId.replace('.', '/') 76*847dbab7SAndroid Build Coastguard Worker artifactDirPath = os.path.join(groupPath, artifactId, version) 77*847dbab7SAndroid Build Coastguard Worker artifactPath = os.path.join(artifactDirPath, "%s-%s" % (artifactId, version)) 78*847dbab7SAndroid Build Coastguard Worker cmd("mkdir -p " + artifactDirPath) 79*847dbab7SAndroid Build Coastguard Worker # download aar 80*847dbab7SAndroid Build Coastguard Worker cmd("wget -O %s.aar https://dl.google.com/dl/android/maven2/%s.aar" % (artifactPath, artifactPath)) 81*847dbab7SAndroid Build Coastguard Worker 82*847dbab7SAndroid Build Coastguard Worker # extract AndroidManifest.xml from aar, into path expected by pom2bp 83*847dbab7SAndroid Build Coastguard Worker manifestDir = getManifestPath("%s:%s" % (groupId,artifactId)) 84*847dbab7SAndroid Build Coastguard Worker cmd("mkdir -p " + manifestDir) 85*847dbab7SAndroid Build Coastguard Worker cmd("unzip -o %s.aar AndroidManifest.xml -d %s" % (artifactPath, manifestDir)) 86*847dbab7SAndroid Build Coastguard Worker 87*847dbab7SAndroid Build Coastguard Worker # download pom 88*847dbab7SAndroid Build Coastguard Worker cmd("wget -O %s.pom https://dl.google.com/dl/android/maven2/%s.pom" % (artifactPath, artifactPath)) 89*847dbab7SAndroid Build Coastguard Worker 90*847dbab7SAndroid Build Coastguard Worker # download sources.jar 91*847dbab7SAndroid Build Coastguard Worker cmd("wget -O %s-sources.jar https://dl.google.com/dl/android/maven2/%s-sources.jar" % (artifactPath, artifactPath)) 92*847dbab7SAndroid Build Coastguard Worker 93*847dbab7SAndroid Build Coastguard Workerdef downloadApk(groupId, artifactId, version): 94*847dbab7SAndroid Build Coastguard Worker """Downloads an apk from google maven""" 95*847dbab7SAndroid Build Coastguard Worker groupPath = groupId.replace('.', '/') 96*847dbab7SAndroid Build Coastguard Worker artifactDirPath = os.path.join(groupPath, artifactId, version) 97*847dbab7SAndroid Build Coastguard Worker artifactPath = os.path.join(artifactDirPath, "%s-%s" % (artifactId, version)) 98*847dbab7SAndroid Build Coastguard Worker cmd("mkdir -p " + artifactDirPath) 99*847dbab7SAndroid Build Coastguard Worker # download apk 100*847dbab7SAndroid Build Coastguard Worker cmd("wget -O %s.apk https://dl.google.com/dl/android/maven2/%s.apk" % (artifactPath, artifactPath)) 101*847dbab7SAndroid Build Coastguard Worker # download pom 102*847dbab7SAndroid Build Coastguard Worker cmd("wget -O %s.pom https://dl.google.com/dl/android/maven2/%s.pom" % (artifactPath, artifactPath)) 103*847dbab7SAndroid Build Coastguard Worker 104*847dbab7SAndroid Build Coastguard Workerdef getManifestPath(mavenArtifactName): 105*847dbab7SAndroid Build Coastguard Worker """Get the path to the aar's manifest as generated by pom2bp.""" 106*847dbab7SAndroid Build Coastguard Worker manifestPath = mavenArtifactName 107*847dbab7SAndroid Build Coastguard Worker for searchPattern in mavenToBpPatternMap: 108*847dbab7SAndroid Build Coastguard Worker manifestPath = manifestPath.replace(searchPattern, mavenToBpPatternMap[searchPattern]) 109*847dbab7SAndroid Build Coastguard Worker return "manifests/%s" % manifestPath 110*847dbab7SAndroid Build Coastguard Worker 111*847dbab7SAndroid Build Coastguard Workerdef getJavaVersionFromAndroidBp(): 112*847dbab7SAndroid Build Coastguard Worker """Returns the java_version line of the Android.bp file""" 113*847dbab7SAndroid Build Coastguard Worker with open(androidBpPath, 'r') as f: 114*847dbab7SAndroid Build Coastguard Worker content = f.read() 115*847dbab7SAndroid Build Coastguard Worker match = re.search(javaVersionPattern, content) 116*847dbab7SAndroid Build Coastguard Worker return match.group(0) # Return the entire line 117*847dbab7SAndroid Build Coastguard Worker 118*847dbab7SAndroid Build Coastguard Workerdef getLibraryVisibilityFromAndroidBp(): 119*847dbab7SAndroid Build Coastguard Worker """Returns the entire library_visibility section of the Android.bp file""" 120*847dbab7SAndroid Build Coastguard Worker with open(androidBpPath, 'r') as f: 121*847dbab7SAndroid Build Coastguard Worker content = f.read() 122*847dbab7SAndroid Build Coastguard Worker match = re.search(r'library_visibility\s*=\s*\[([^]]*)\]', content, re.DOTALL) 123*847dbab7SAndroid Build Coastguard Worker return match.group(0) # Return the entire matched section 124*847dbab7SAndroid Build Coastguard Worker 125*847dbab7SAndroid Build Coastguard Workerdef fixAndroidBp(library_visibility, java_version): 126*847dbab7SAndroid Build Coastguard Worker """Fixes the Android.bp file by overwriting the visibility and java_version, and removes 127*847dbab7SAndroid Build Coastguard Worker unavailable mockwebserver dependency""" 128*847dbab7SAndroid Build Coastguard Worker with open(androidBpPath, 'r') as f: 129*847dbab7SAndroid Build Coastguard Worker build_content = f.read() 130*847dbab7SAndroid Build Coastguard Worker build_content = re.sub(javaVersionPattern, java_version, build_content) 131*847dbab7SAndroid Build Coastguard Worker build_content = build_content.replace( 132*847dbab7SAndroid Build Coastguard Worker r'"mockwebserver",', mockWebServerUnavailableComment) 133*847dbab7SAndroid Build Coastguard Worker # Find the end of the package section (the first closing curly bracket) 134*847dbab7SAndroid Build Coastguard Worker package_end_index = build_content.find('}') 135*847dbab7SAndroid Build Coastguard Worker # Insert the library_visibility section after the package section 136*847dbab7SAndroid Build Coastguard Worker modified_build_content = ( 137*847dbab7SAndroid Build Coastguard Worker build_content[:package_end_index + 1] 138*847dbab7SAndroid Build Coastguard Worker + '\n\n' + library_visibility 139*847dbab7SAndroid Build Coastguard Worker + build_content[package_end_index + 1:] 140*847dbab7SAndroid Build Coastguard Worker ) 141*847dbab7SAndroid Build Coastguard Worker with open(androidBpPath, 'w') as f: 142*847dbab7SAndroid Build Coastguard Worker f.write(modified_build_content) 143*847dbab7SAndroid Build Coastguard Worker 144*847dbab7SAndroid Build Coastguard Workerdef addTagsToAndroidBpTargets(targetType, newTag): 145*847dbab7SAndroid Build Coastguard Worker """Adds the specified tag to all targets of the specified type in Android.bp""" 146*847dbab7SAndroid Build Coastguard Worker with open(androidBpPath, "r") as f: 147*847dbab7SAndroid Build Coastguard Worker lines = f.readlines() 148*847dbab7SAndroid Build Coastguard Worker modified_lines = [] 149*847dbab7SAndroid Build Coastguard Worker in_target = False 150*847dbab7SAndroid Build Coastguard Worker for line in lines: 151*847dbab7SAndroid Build Coastguard Worker if line.strip().startswith(targetType + " {"): 152*847dbab7SAndroid Build Coastguard Worker in_target = True 153*847dbab7SAndroid Build Coastguard Worker modified_lines.append(line) 154*847dbab7SAndroid Build Coastguard Worker elif in_target and line.strip().startswith("}"): 155*847dbab7SAndroid Build Coastguard Worker modified_lines.append(" " + newTag + ",\n") 156*847dbab7SAndroid Build Coastguard Worker in_target = False 157*847dbab7SAndroid Build Coastguard Worker modified_lines.append(line) 158*847dbab7SAndroid Build Coastguard Worker else: 159*847dbab7SAndroid Build Coastguard Worker modified_lines.append(line) 160*847dbab7SAndroid Build Coastguard Worker with open(androidBpPath, "w") as f: 161*847dbab7SAndroid Build Coastguard Worker f.writelines(modified_lines) 162*847dbab7SAndroid Build Coastguard Worker 163*847dbab7SAndroid Build Coastguard WorkerprebuiltDir = os.path.join(getAndroidRoot(), "prebuilts/misc/common/androidx-media3") 164*847dbab7SAndroid Build Coastguard Workerchdir(prebuiltDir) 165*847dbab7SAndroid Build Coastguard Worker 166*847dbab7SAndroid Build Coastguard WorkerlibraryVisibility = getLibraryVisibilityFromAndroidBp() 167*847dbab7SAndroid Build Coastguard WorkerjavaVersion = getJavaVersionFromAndroidBp() 168*847dbab7SAndroid Build Coastguard Worker 169*847dbab7SAndroid Build Coastguard Workercmd("rm -rf androidx/media3") 170*847dbab7SAndroid Build Coastguard Workercmd("rm -rf manifests") 171*847dbab7SAndroid Build Coastguard Worker 172*847dbab7SAndroid Build Coastguard WorkerdownloadArtifact("androidx.media3", "media3-common", media3Version) 173*847dbab7SAndroid Build Coastguard WorkerdownloadArtifact("androidx.media3", "media3-container", media3Version) 174*847dbab7SAndroid Build Coastguard WorkerdownloadArtifact("androidx.media3", "media3-database", media3Version) 175*847dbab7SAndroid Build Coastguard WorkerdownloadArtifact("androidx.media3", "media3-datasource", media3Version) 176*847dbab7SAndroid Build Coastguard WorkerdownloadArtifact("androidx.media3", "media3-decoder", media3Version) 177*847dbab7SAndroid Build Coastguard WorkerdownloadArtifact("androidx.media3", "media3-effect", media3Version) 178*847dbab7SAndroid Build Coastguard WorkerdownloadArtifact("androidx.media3", "media3-exoplayer", media3Version) 179*847dbab7SAndroid Build Coastguard WorkerdownloadArtifact("androidx.media3", "media3-exoplayer-dash", media3Version) 180*847dbab7SAndroid Build Coastguard WorkerdownloadArtifact("androidx.media3", "media3-extractor", media3Version) 181*847dbab7SAndroid Build Coastguard WorkerdownloadArtifact("androidx.media3", "media3-muxer", media3Version) 182*847dbab7SAndroid Build Coastguard WorkerdownloadArtifact("androidx.media3", "media3-session", media3Version) 183*847dbab7SAndroid Build Coastguard WorkerdownloadArtifact("androidx.media3", "media3-test-utils", media3Version) 184*847dbab7SAndroid Build Coastguard WorkerdownloadArtifact("androidx.media3", "media3-transformer", media3Version) 185*847dbab7SAndroid Build Coastguard WorkerdownloadArtifact("androidx.media3", "media3-ui", media3Version) 186*847dbab7SAndroid Build Coastguard Worker 187*847dbab7SAndroid Build Coastguard WorkeratxRewriteStr = "" 188*847dbab7SAndroid Build Coastguard Workerfor name in mavenToBpPatternMap: 189*847dbab7SAndroid Build Coastguard Worker atxRewriteStr += "-rewrite %s=%s " % (name, mavenToBpPatternMap[name]) 190*847dbab7SAndroid Build Coastguard Worker 191*847dbab7SAndroid Build Coastguard Workercmd("pom2bp " + atxRewriteStr + 192*847dbab7SAndroid Build Coastguard Worker # map external maven dependencies to Android module names 193*847dbab7SAndroid Build Coastguard Worker "-rewrite androidx.annotation:annotation=androidx.annotation_annotation " + 194*847dbab7SAndroid Build Coastguard Worker "-rewrite androidx.annotation:annotation-experimental=androidx.annotation_annotation-experimental " + 195*847dbab7SAndroid Build Coastguard Worker "-rewrite androidx.collection:collection=androidx.collection_collection " + 196*847dbab7SAndroid Build Coastguard Worker "-rewrite androidx.core:core=androidx.core_core " + 197*847dbab7SAndroid Build Coastguard Worker "-rewrite androidx.exifinterface:exifinterface=androidx.exifinterface_exifinterface " + 198*847dbab7SAndroid Build Coastguard Worker "-rewrite androidx.media:media=androidx.media_media " + 199*847dbab7SAndroid Build Coastguard Worker "-rewrite androidx.recyclerview:recyclerview=androidx.recyclerview_recyclerview " + 200*847dbab7SAndroid Build Coastguard Worker "-rewrite androidx.test:core=androidx.test.core " + 201*847dbab7SAndroid Build Coastguard Worker "-rewrite androidx.test.ext:junit=androidx.test.ext.junit " + 202*847dbab7SAndroid Build Coastguard Worker "-rewrite androidx.test.ext:truth=androidx.test.ext.truth " + 203*847dbab7SAndroid Build Coastguard Worker "-rewrite com.google.guava:guava=guava " + 204*847dbab7SAndroid Build Coastguard Worker "-rewrite com.google.truth:truth=truth " + 205*847dbab7SAndroid Build Coastguard Worker "-rewrite com.google.truth.extensions:truth-java8-extension=truth-java8-extension " + 206*847dbab7SAndroid Build Coastguard Worker "-rewrite org.mockito:mockito-core=mockito-core " + 207*847dbab7SAndroid Build Coastguard Worker "-sdk-version current " + 208*847dbab7SAndroid Build Coastguard Worker "-static-deps " + 209*847dbab7SAndroid Build Coastguard Worker "-prepend prepend-license.txt " + 210*847dbab7SAndroid Build Coastguard Worker ". > Android.bp") 211*847dbab7SAndroid Build Coastguard Worker 212*847dbab7SAndroid Build Coastguard WorkerfixAndroidBp(libraryVisibility, javaVersion) 213*847dbab7SAndroid Build Coastguard WorkeraddTagsToAndroidBpTargets("android_library_import", 'visibility: ["//visibility:private"]') 214*847dbab7SAndroid Build Coastguard WorkeraddTagsToAndroidBpTargets("android_library", 'visibility: library_visibility') 215*847dbab7SAndroid Build Coastguard Workercmd("bpfmt -w " + androidBpPath) 216