xref: /aosp_15_r20/prebuilts/misc/common/androidx-media3/update-from-gmaven.py (revision 847dbab7980efcc7f5706bb9c6d844b91a680afd)
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