#!/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 annotationVersion="1.0.1-alpha01" monitorVersion="1.6.0-alpha05" runnerVersion="1.5.0-alpha04" rulesVersion="1.4.1-alpha07" espressoVersion="3.5.0-alpha07" coreVersion="1.5.0-alpha02" extJUnitVersion="1.1.4-alpha07" extTruthVersion="1.5.0-alpha07" servicesVersion="1.4.2-alpha04" jankTestHelperVersion="1.0.1" uiAutomatorVersion="2.2.0" mavenToBpPatternMap = { "androidx.test:" : "androidx.test.", "androidx.test.annotation:annotation" : "androidx.test.annotation", "androidx.test.ext:": "androidx.test.ext.", "androidx.test.espresso:espresso-":"androidx.test.espresso.", "androidx.test.janktesthelper:janktesthelper":"androidx.test.janktesthelper", "androidx.test.uiautomator:uiautomator":"androidx.test.uiautomator", "androidx.test.services:storage":"androidx.test.services.storage", "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", "androidx.test.uiautomator" : "android.test.base", } 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 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-test") chdir(prebuiltDir) cmd("rm -rf androidx/test") cmd("rm -rf manifests") downloadArtifact("androidx.test", "annotation", annotationVersion) downloadArtifact("androidx.test", "core", coreVersion) 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.uiautomator", "uiautomator", uiAutomatorVersion) downloadArtifact("androidx.test.services", "storage", servicesVersion) atxRewriteStr = "" for name in mavenToBpPatternMap: atxRewriteStr += "-rewrite %s=%s " % (name, mavenToBpPatternMap[name]) for name in extraLibs: atxRewriteStr += "-extra-libs %s=%s " % (name, extraLibs[name]) cmd("pom2bp " + atxRewriteStr + # map external maven dependencies to Android module names "-rewrite com.google.truth:truth=truth-prebuilt " + "-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 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 " + "-sdk-version current " + "-static-deps " + ". > Android.bp")