From 4a949058e288d4d4fd74f4c01c139d4cabf2c49e Mon Sep 17 00:00:00 2001 From: Yang Chen Date: Thu, 5 Mar 2020 14:05:05 +1100 Subject: [PATCH] Use new cmdline-tools with support for running sdkmanager and avdmanager with Java 8+. --- .github/workflows/workflow.yml | 1 + lib/emulator-manager.js | 18 +++++----- lib/java-version-manager.js | 60 ---------------------------------- lib/main.js | 6 ---- lib/sdk-installer.js | 16 ++++++--- src/emulator-manager.ts | 18 +++++----- src/java-version-manager.ts | 39 ---------------------- src/main.ts | 8 ----- src/sdk-installer.ts | 18 +++++++--- 9 files changed, 43 insertions(+), 141 deletions(-) delete mode 100644 lib/java-version-manager.js delete mode 100644 src/java-version-manager.ts diff --git a/.github/workflows/workflow.yml b/.github/workflows/workflow.yml index 33871066..5833f838 100644 --- a/.github/workflows/workflow.yml +++ b/.github/workflows/workflow.yml @@ -45,5 +45,6 @@ jobs: working-directory: ./test-fixture/ script: | echo $GITHUB_REPOSITORY + adb devices ./gradlew help ./gradlew connectedDebugAndroidTest diff --git a/lib/emulator-manager.js b/lib/emulator-manager.js index d2ef920a..2b7910c7 100644 --- a/lib/emulator-manager.js +++ b/lib/emulator-manager.js @@ -17,8 +17,6 @@ var __importStar = (this && this.__importStar) || function (mod) { Object.defineProperty(exports, "__esModule", { value: true }); const exec = __importStar(require("@actions/exec")); const EMULATOR_BOOT_TIMEOUT_SECONDS = 300; -const AVD_MANAGER_PATH = `${process.env.ANDROID_HOME}/tools/bin/avdmanager`; -const ADB_PATH = `${process.env.ANDROID_HOME}/platform-tools/adb`; /** * Creates and launches a new AVD instance with the specified configurations. */ @@ -27,11 +25,11 @@ function launchEmulator(apiLevel, target, arch, profile, emulatorOptions, disabl // create a new AVD if (profile.trim() !== '') { console.log(`Creating AVD with custom profile ${profile}`); - yield exec.exec(`${AVD_MANAGER_PATH} create avd --force -n test --abi "${target}/${arch}" --package "system-images;android-${apiLevel};${target};${arch}" --device "${profile}"`); + yield exec.exec(`avdmanager create avd --force -n test --abi "${target}/${arch}" --package "system-images;android-${apiLevel};${target};${arch}" --device "${profile}"`); } else { console.log(`Creating AVD without custom profile.`); - yield exec.exec(`sh -c \\"echo no | ${AVD_MANAGER_PATH} create avd --force -n test --abi '${target}/${arch}' --package 'system-images;android-${apiLevel};${target};${arch}'"`); + yield exec.exec(`sh -c \\"echo no | avdmanager create avd --force -n test --abi '${target}/${arch}' --package 'system-images;android-${apiLevel};${target};${arch}'"`); } // start emulator console.log('Starting emulator.'); @@ -46,13 +44,13 @@ function launchEmulator(apiLevel, target, arch, profile, emulatorOptions, disabl }); // wait for emulator to complete booting yield waitForDevice(); - yield exec.exec(`${ADB_PATH} shell input keyevent 82`); + yield exec.exec(`adb shell input keyevent 82`); // disable animations if (disableAnimations) { console.log('Disabling animations.'); - yield exec.exec(`${ADB_PATH} shell settings put global window_animation_scale 0.0`); - yield exec.exec(`${ADB_PATH} shell settings put global transition_animation_scale 0.0`); - yield exec.exec(`${ADB_PATH} shell settings put global animator_duration_scale 0.0`); + yield exec.exec(`adb shell settings put global window_animation_scale 0.0`); + yield exec.exec(`adb shell settings put global transition_animation_scale 0.0`); + yield exec.exec(`adb shell settings put global animator_duration_scale 0.0`); } }); } @@ -63,7 +61,7 @@ exports.launchEmulator = launchEmulator; function killEmulator() { return __awaiter(this, void 0, void 0, function* () { try { - yield exec.exec(`${ADB_PATH} -s emulator-5554 emu kill`); + yield exec.exec(`adb -s emulator-5554 emu kill`); } catch (error) { console.log(error.message); @@ -83,7 +81,7 @@ function waitForDevice() { while (!booted) { try { let result = ''; - yield exec.exec(`${ADB_PATH} shell getprop sys.boot_completed`, [], { + yield exec.exec(`adb shell getprop sys.boot_completed`, [], { listeners: { stdout: (data) => { result += data.toString(); diff --git a/lib/java-version-manager.js b/lib/java-version-manager.js deleted file mode 100644 index d7c6fdc7..00000000 --- a/lib/java-version-manager.js +++ /dev/null @@ -1,60 +0,0 @@ -"use strict"; -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k]; - result["default"] = mod; - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -const core = __importStar(require("@actions/core")); -const exec = __importStar(require("@actions/exec")); -/** - * Returns the current $JAVA_HOME path. - */ -function getCurrentJavaHome() { - return __awaiter(this, void 0, void 0, function* () { - let defaultJavaHome = ''; - yield exec.exec(`sh -c \\"echo $JAVA_HOME"`, [], { - listeners: { - stdout: (data) => { - defaultJavaHome += data.toString(); - } - } - }); - return defaultJavaHome.trim(); - }); -} -exports.getCurrentJavaHome = getCurrentJavaHome; -/** - * Returns the Java 8 $JAVA_HOME path. - */ -function getJavaHomeV8() { - return __awaiter(this, void 0, void 0, function* () { - let javaHomeV8 = ''; - yield exec.exec(`/usr/libexec/java_home -v 1.8`, [], { - listeners: { - stdout: (data) => { - javaHomeV8 += data.toString(); - } - } - }); - return javaHomeV8.trim(); - }); -} -exports.getJavaHomeV8 = getJavaHomeV8; -/** - * Sets $JAVA_HOME to the specified path. - */ -function setJavaHome(path) { - core.exportVariable('JAVA_HOME', path); -} -exports.setJavaHome = setJavaHome; diff --git a/lib/main.js b/lib/main.js index ff851be1..597ea20c 100644 --- a/lib/main.js +++ b/lib/main.js @@ -21,7 +21,6 @@ const input_validator_1 = require("./input-validator"); const emulator_manager_1 = require("./emulator-manager"); const exec = __importStar(require("@actions/exec")); const script_parser_1 = require("./script-parser"); -const java_version_manager_1 = require("./java-version-manager"); function run() { return __awaiter(this, void 0, void 0, function* () { try { @@ -73,9 +72,6 @@ function run() { scripts.forEach((script) => __awaiter(this, void 0, void 0, function* () { console.log(`${script}`); })); - // use Java 8 for sdkmanager and avdmanager - const defaultJavaHome = yield java_version_manager_1.getCurrentJavaHome(); - java_version_manager_1.setJavaHome(yield java_version_manager_1.getJavaHomeV8()); // install SDK yield sdk_installer_1.installAndroidSdk(apiLevel, target, arch, emulatorBuild); try { @@ -85,8 +81,6 @@ function run() { catch (error) { core.setFailed(error.message); } - // use default JAVA_HOME for running custom script - java_version_manager_1.setJavaHome(defaultJavaHome); // execute the custom script try { // move to custom working directory if set diff --git a/lib/sdk-installer.js b/lib/sdk-installer.js index ab03a0c7..a0974a4a 100644 --- a/lib/sdk-installer.js +++ b/lib/sdk-installer.js @@ -15,17 +15,25 @@ var __importStar = (this && this.__importStar) || function (mod) { return result; }; Object.defineProperty(exports, "__esModule", { value: true }); +const core = __importStar(require("@actions/core")); const exec = __importStar(require("@actions/exec")); const BUILD_TOOLS_VERSION = '29.0.3'; +const CMDLINE_TOOLS_URL = 'https://dl.google.com/android/repository/commandlinetools-linux-6200805_latest.zip'; /** * Installs & updates the Android SDK for the macOS platform, including SDK platform for the chosen API level, latest build tools, platform tools, Android Emulator, * and the system image for the chosen API level, CPU arch, and target. */ function installAndroidSdk(apiLevel, target, arch, emulatorBuild) { return __awaiter(this, void 0, void 0, function* () { - const sdkmanagerPath = `${process.env.ANDROID_HOME}/tools/bin/sdkmanager`; + console.log('Installing new cmdline-tools.'); + yield exec.exec(`mkdir ${process.env.ANDROID_HOME}/cmdline-tools`); + yield exec.exec(`curl -fo commandlinetools.zip ${CMDLINE_TOOLS_URL}`); + yield exec.exec(`unzip -q commandlinetools.zip -d ${process.env.ANDROID_HOME}/cmdline-tools`); + yield exec.exec(`rm -f commandlinetools.zip`); + // add paths for commandline-tools and platform-tools + core.addPath(`${process.env.ANDROID_HOME}/cmdline-tools/tools:${process.env.ANDROID_HOME}/cmdline-tools/tools/bin:${process.env.ANDROID_HOME}/platform-tools`); console.log('Installing latest build tools, platform tools, and platform.'); - yield exec.exec(`sh -c \\"${sdkmanagerPath} --install 'build-tools;${BUILD_TOOLS_VERSION}' platform-tools 'platforms;android-${apiLevel}' > /dev/null"`); + yield exec.exec(`sh -c \\"sdkmanager --install 'build-tools;${BUILD_TOOLS_VERSION}' platform-tools 'platforms;android-${apiLevel}' > /dev/null"`); if (emulatorBuild) { console.log(`Installing emulator build ${emulatorBuild}.`); yield exec.exec(`curl -fo emulator.zip https://dl.google.com/android/repository/emulator-darwin-${emulatorBuild}.zip`); @@ -35,10 +43,10 @@ function installAndroidSdk(apiLevel, target, arch, emulatorBuild) { } else { console.log('Installing latest emulator.'); - yield exec.exec(`sh -c \\"${sdkmanagerPath} --install emulator > /dev/null"`); + yield exec.exec(`sh -c \\"sdkmanager --install emulator > /dev/null"`); } console.log('Installing system images.'); - yield exec.exec(`sh -c \\"${sdkmanagerPath} --install 'system-images;android-${apiLevel};${target};${arch}' > /dev/null"`); + yield exec.exec(`sh -c \\"sdkmanager --install 'system-images;android-${apiLevel};${target};${arch}' > /dev/null"`); }); } exports.installAndroidSdk = installAndroidSdk; diff --git a/src/emulator-manager.ts b/src/emulator-manager.ts index 49a33f3f..727fc265 100644 --- a/src/emulator-manager.ts +++ b/src/emulator-manager.ts @@ -1,8 +1,6 @@ import * as exec from '@actions/exec'; const EMULATOR_BOOT_TIMEOUT_SECONDS = 300; -const AVD_MANAGER_PATH = `${process.env.ANDROID_HOME}/tools/bin/avdmanager`; -const ADB_PATH = `${process.env.ANDROID_HOME}/platform-tools/adb`; /** * Creates and launches a new AVD instance with the specified configurations. @@ -11,10 +9,10 @@ export async function launchEmulator(apiLevel: number, target: string, arch: str // create a new AVD if (profile.trim() !== '') { console.log(`Creating AVD with custom profile ${profile}`); - await exec.exec(`${AVD_MANAGER_PATH} create avd --force -n test --abi "${target}/${arch}" --package "system-images;android-${apiLevel};${target};${arch}" --device "${profile}"`); + await exec.exec(`avdmanager create avd --force -n test --abi "${target}/${arch}" --package "system-images;android-${apiLevel};${target};${arch}" --device "${profile}"`); } else { console.log(`Creating AVD without custom profile.`); - await exec.exec(`sh -c \\"echo no | ${AVD_MANAGER_PATH} create avd --force -n test --abi '${target}/${arch}' --package 'system-images;android-${apiLevel};${target};${arch}'"`); + await exec.exec(`sh -c \\"echo no | avdmanager create avd --force -n test --abi '${target}/${arch}' --package 'system-images;android-${apiLevel};${target};${arch}'"`); } // start emulator @@ -31,14 +29,14 @@ export async function launchEmulator(apiLevel: number, target: string, arch: str // wait for emulator to complete booting await waitForDevice(); - await exec.exec(`${ADB_PATH} shell input keyevent 82`); + await exec.exec(`adb shell input keyevent 82`); // disable animations if (disableAnimations) { console.log('Disabling animations.'); - await exec.exec(`${ADB_PATH} shell settings put global window_animation_scale 0.0`); - await exec.exec(`${ADB_PATH} shell settings put global transition_animation_scale 0.0`); - await exec.exec(`${ADB_PATH} shell settings put global animator_duration_scale 0.0`); + await exec.exec(`adb shell settings put global window_animation_scale 0.0`); + await exec.exec(`adb shell settings put global transition_animation_scale 0.0`); + await exec.exec(`adb shell settings put global animator_duration_scale 0.0`); } } @@ -47,7 +45,7 @@ export async function launchEmulator(apiLevel: number, target: string, arch: str */ export async function killEmulator(): Promise { try { - await exec.exec(`${ADB_PATH} -s emulator-5554 emu kill`); + await exec.exec(`adb -s emulator-5554 emu kill`); } catch (error) { console.log(error.message); } @@ -64,7 +62,7 @@ async function waitForDevice(): Promise { while (!booted) { try { let result = ''; - await exec.exec(`${ADB_PATH} shell getprop sys.boot_completed`, [], { + await exec.exec(`adb shell getprop sys.boot_completed`, [], { listeners: { stdout: (data: Buffer) => { result += data.toString(); diff --git a/src/java-version-manager.ts b/src/java-version-manager.ts deleted file mode 100644 index 0998428c..00000000 --- a/src/java-version-manager.ts +++ /dev/null @@ -1,39 +0,0 @@ -import * as core from '@actions/core'; -import * as exec from '@actions/exec'; - -/** - * Returns the current $JAVA_HOME path. - */ -export async function getCurrentJavaHome(): Promise { - let defaultJavaHome = ''; - await exec.exec(`sh -c \\"echo $JAVA_HOME"`, [], { - listeners: { - stdout: (data: Buffer) => { - defaultJavaHome += data.toString(); - } - } - }); - return defaultJavaHome.trim(); -} - -/** - * Returns the Java 8 $JAVA_HOME path. - */ -export async function getJavaHomeV8(): Promise { - let javaHomeV8 = ''; - await exec.exec(`/usr/libexec/java_home -v 1.8`, [], { - listeners: { - stdout: (data: Buffer) => { - javaHomeV8 += data.toString(); - } - } - }); - return javaHomeV8.trim(); -} - -/** - * Sets $JAVA_HOME to the specified path. - */ -export function setJavaHome(path: string) { - core.exportVariable('JAVA_HOME', path); -} diff --git a/src/main.ts b/src/main.ts index d20255c0..7aa10e75 100644 --- a/src/main.ts +++ b/src/main.ts @@ -4,7 +4,6 @@ import { checkApiLevel, checkTarget, checkArch, checkDisableAnimations, checkEmu import { launchEmulator, killEmulator } from './emulator-manager'; import * as exec from '@actions/exec'; import { parseScript } from './script-parser'; -import { getCurrentJavaHome, getJavaHomeV8, setJavaHome } from './java-version-manager'; async function run() { try { @@ -66,10 +65,6 @@ async function run() { console.log(`${script}`); }); - // use Java 8 for sdkmanager and avdmanager - const defaultJavaHome = await getCurrentJavaHome(); - setJavaHome(await getJavaHomeV8()); - // install SDK await installAndroidSdk(apiLevel, target, arch, emulatorBuild); @@ -80,9 +75,6 @@ async function run() { core.setFailed(error.message); } - // use default JAVA_HOME for running custom script - setJavaHome(defaultJavaHome); - // execute the custom script try { // move to custom working directory if set diff --git a/src/sdk-installer.ts b/src/sdk-installer.ts index f182ea24..343e8ad8 100644 --- a/src/sdk-installer.ts +++ b/src/sdk-installer.ts @@ -1,15 +1,25 @@ +import * as core from '@actions/core'; import * as exec from '@actions/exec'; const BUILD_TOOLS_VERSION = '29.0.3'; +const CMDLINE_TOOLS_URL = 'https://dl.google.com/android/repository/commandlinetools-linux-6200805_latest.zip'; /** * Installs & updates the Android SDK for the macOS platform, including SDK platform for the chosen API level, latest build tools, platform tools, Android Emulator, * and the system image for the chosen API level, CPU arch, and target. */ export async function installAndroidSdk(apiLevel: number, target: string, arch: string, emulatorBuild?: string): Promise { - const sdkmanagerPath = `${process.env.ANDROID_HOME}/tools/bin/sdkmanager`; + console.log('Installing new cmdline-tools.'); + await exec.exec(`mkdir ${process.env.ANDROID_HOME}/cmdline-tools`); + await exec.exec(`curl -fo commandlinetools.zip ${CMDLINE_TOOLS_URL}`); + await exec.exec(`unzip -q commandlinetools.zip -d ${process.env.ANDROID_HOME}/cmdline-tools`); + await exec.exec(`rm -f commandlinetools.zip`); + + // add paths for commandline-tools and platform-tools + core.addPath(`${process.env.ANDROID_HOME}/cmdline-tools/tools:${process.env.ANDROID_HOME}/cmdline-tools/tools/bin:${process.env.ANDROID_HOME}/platform-tools`); + console.log('Installing latest build tools, platform tools, and platform.'); - await exec.exec(`sh -c \\"${sdkmanagerPath} --install 'build-tools;${BUILD_TOOLS_VERSION}' platform-tools 'platforms;android-${apiLevel}' > /dev/null"`); + await exec.exec(`sh -c \\"sdkmanager --install 'build-tools;${BUILD_TOOLS_VERSION}' platform-tools 'platforms;android-${apiLevel}' > /dev/null"`); if (emulatorBuild) { console.log(`Installing emulator build ${emulatorBuild}.`); await exec.exec(`curl -fo emulator.zip https://dl.google.com/android/repository/emulator-darwin-${emulatorBuild}.zip`); @@ -18,8 +28,8 @@ export async function installAndroidSdk(apiLevel: number, target: string, arch: await exec.exec(`rm -f emulator.zip`); } else { console.log('Installing latest emulator.'); - await exec.exec(`sh -c \\"${sdkmanagerPath} --install emulator > /dev/null"`); + await exec.exec(`sh -c \\"sdkmanager --install emulator > /dev/null"`); } console.log('Installing system images.'); - await exec.exec(`sh -c \\"${sdkmanagerPath} --install 'system-images;android-${apiLevel};${target};${arch}' > /dev/null"`); + await exec.exec(`sh -c \\"sdkmanager --install 'system-images;android-${apiLevel};${target};${arch}' > /dev/null"`); }