#!/usr/bin/python3 # Helper script for updating androidx.test prebuilts from maven # # Usage: # a. Initialize android environment eg . build/envsetup.sh; lunch # b. Update the version numbers in this file # c. ./prebuilts/misc/androidx-test/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 import os import subprocess import sys monitorVersion="1.7.0" runnerVersion="1.6.0" rulesVersion="1.6.0" espressoVersion="3.6.0" coreVersion="1.6.0" extJUnitVersion="1.2.0" extTruthVersion="1.6.0" orchestratorVersion="1.5.0" servicesVersion="1.5.0" jankTestHelperVersion="1.0.1" mavenToBpPatternMap = { "androidx.test:" : "androidx.test.", "androidx.test.ext:": "androidx.test.ext.", "androidx.test.espresso:espresso-":"androidx.test.espresso.", "androidx.test.janktesthelper:janktesthelper":"androidx.test.janktesthelper", "androidx.test.services:storage":"androidx.test.services.storage", "androidx.test.services:test-services":"androidx.test.services.test-services", "androidx.tracing:tracing":"androidx.tracing_tracing", "androidx.concurrent:concurrent-futures":"androidx.concurrent_concurrent-futures", "com.google.guava:listenablefuture":"guava-listenablefuture-prebuilt-jar", } extraLibs = { "androidx.test.rules" : "android.test.base", } prependLicenseTemplate = """ package {{ default_applicable_licenses: ["Android-Apache-2.0"], }} filegroup {{ name: "test-services.apk", srcs: ["androidx/test/services/test-services/{servicesVersion}/test-services-{servicesVersion}.apk",], path: "androidx/test/services/test-services/{servicesVersion}", visibility: [ "//tools/tradefederation/core:__pkg__", ], }} """ 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 def updatePrependLicense(): with open("prepend-license.txt", "w") as f: f.write(prependLicenseTemplate.format(servicesVersion = servicesVersion)) prebuiltDir = os.path.join(getAndroidRoot(), "prebuilts/misc/common/androidx-test") chdir(prebuiltDir) cmd("rm -rf androidx/test") cmd("rm -rf manifests") downloadArtifact("androidx.test", "core", coreVersion) downloadArtifact("androidx.test.espresso", "espresso-accessibility", espressoVersion) downloadArtifact("androidx.test.espresso", "espresso-core", espressoVersion) downloadArtifact("androidx.test.espresso", "espresso-contrib", espressoVersion) downloadArtifact("androidx.test.espresso", "espresso-idling-resource", espressoVersion) downloadArtifact("androidx.test.espresso", "espresso-intents", espressoVersion) downloadArtifact("androidx.test.espresso", "espresso-idling-resource", espressoVersion) downloadArtifact("androidx.test.espresso", "espresso-web", espressoVersion) downloadArtifact("androidx.test", "monitor", monitorVersion) downloadArtifact("androidx.test", "rules", rulesVersion) downloadArtifact("androidx.test", "runner", runnerVersion) downloadArtifact("androidx.test.ext", "junit", extJUnitVersion) downloadArtifact("androidx.test.ext", "truth", extTruthVersion) downloadArtifact("androidx.test.janktesthelper", "janktesthelper", jankTestHelperVersion) downloadArtifact("androidx.test.services", "storage", servicesVersion) downloadApk("androidx.test.services", "test-services", servicesVersion) downloadApk("androidx.test", "orchestrator", orchestratorVersion) atxRewriteStr = "" for name in mavenToBpPatternMap: atxRewriteStr += "-rewrite %s=%s " % (name, mavenToBpPatternMap[name]) for name in extraLibs: atxRewriteStr += "-extra-libs %s=%s " % (name, extraLibs[name]) updatePrependLicense() cmd("pom2bp " + atxRewriteStr + # map external maven dependencies to Android module names "-rewrite com.google.truth:truth=truth " + "-rewrite net.sf.kxml:kxml2=kxml2-android " + "-rewrite androidx.lifecycle:lifecycle-common=androidx.lifecycle_lifecycle-common " + "-rewrite androidx.annotation:annotation=androidx.annotation_annotation " + "-rewrite org.hamcrest:hamcrest-integration=hamcrest " + "-rewrite org.hamcrest:hamcrest-core=hamcrest " + "-rewrite javax.inject:javax.inject=jsr330 " + "-rewrite com.google.android.material:material=com.google.android.material_material " + "-rewrite androidx.drawerlayout:drawerlayout=androidx.drawerlayout_drawerlayout " + "-rewrite androidx.viewpager:viewpager=androidx.viewpager_viewpager " + "-rewrite androidx.recyclerview:recyclerview=androidx.recyclerview_recyclerview " + "-rewrite androidx.core:core=androidx.core_core " + "-rewrite androidx.legacy:legacy-support-core-utils=androidx.legacy_legacy-support-core-utils " + "-rewrite androidx.appcompat:appcompat=androidx.appcompat_appcompat " + "-sdk-version current " + "-static-deps " + "-prepend prepend-license.txt " + ". > Android.bp")