diff --git a/.gitignore b/.gitignore index 66b9c47..1074548 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ developmentConfig.json npm-debug.log .vscode .idea +.DS_Store \ No newline at end of file diff --git a/src/aemm-config.js b/src/aemm-config.js old mode 100644 new mode 100755 diff --git a/src/android-emulator.js b/src/android-emulator.js old mode 100644 new mode 100755 index 31d589e..a52a7f5 --- a/src/android-emulator.js +++ b/src/android-emulator.js @@ -1,5 +1,5 @@ /** - Copyright (c) 2016 Adobe Systems Incorporated. All rights reserved. + Copyright (c) 2018 Adobe Systems Incorporated. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -37,7 +37,7 @@ module.exports = { // launch emulator in the orientation specified in the config var avdName = name + '.avd'; - var avdConfigIni = path.join(userHome, ".android/avd/", avdName, 'config.ini'); + var avdConfigIni = path.join(userHome, ".android", "avd", avdName, 'config.ini'); var avdConfig = ini.parse(fs.readFileSync(avdConfigIni, 'utf-8')); avdConfig['hw.initialOrientation'] = orientation; @@ -49,14 +49,13 @@ module.exports = { spinner.stop(); return; } - var checkCmd = null; var serialNum = 'emulator-' + port; if (process.platform == 'win32') { - checkCmd = path.join(userHome, 'platforms/android/sdk/platform-tools/adb') + ' -s ' + serialNum + + checkCmd = path.join(userHome,'platforms', 'android', 'sdk', 'platform-tools', 'adb') + ' -s ' + serialNum + ' shell pm path android | findstr package:/system/framework/framework-res.apk'; } else if (process.platform == 'darwin') { - checkCmd = path.join(userHome, 'platforms/android/sdk/platform-tools/adb') + ' -s ' + serialNum + + checkCmd = path.join(userHome, 'platforms', 'android', 'sdk', 'platform-tools', 'adb') + ' -s ' + serialNum + ' shell pm path android | grep package:/system/framework/framework-res.apk'; } else { spinner.stop(); @@ -79,7 +78,7 @@ module.exports = { }); } - var cmd = userHome + '/platforms/android/sdk/tools/emulator -wipe-data -avd ' + name + ' -port ' + port + ' -gpu on'; + var cmd = path.join(userHome,'platforms','android','sdk','emulator','emulator') + ' -wipe-data -avd ' + name + ' -port ' + port + ' -gpu host'; shell.exec(cmd, { async: true diff --git a/src/app-android.js b/src/app-android.js old mode 100644 new mode 100755 diff --git a/src/app-ios.js b/src/app-ios.js old mode 100644 new mode 100755 diff --git a/src/build-android.js b/src/build-android.js old mode 100644 new mode 100755 diff --git a/src/build-ios.js b/src/build-ios.js old mode 100644 new mode 100755 diff --git a/src/build.js b/src/build.js old mode 100644 new mode 100755 diff --git a/src/config.js b/src/config.js old mode 100644 new mode 100755 diff --git a/src/help.js b/src/help.js old mode 100644 new mode 100755 diff --git a/src/package-android.js b/src/package-android.js old mode 100644 new mode 100755 diff --git a/src/package-ios.js b/src/package-ios.js old mode 100644 new mode 100755 diff --git a/src/package.js b/src/package.js old mode 100644 new mode 100755 diff --git a/src/platform-android.js b/src/platform-android.js old mode 100644 new mode 100755 index b13eda6..9644061 --- a/src/platform-android.js +++ b/src/platform-android.js @@ -1,5 +1,5 @@ /** - Copyright (c) 2016 Adobe Systems Incorporated. All rights reserved. + Copyright (c) 2019 Adobe Systems Incorporated. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -18,8 +18,8 @@ * Module dependencies. */ var Q = require('q'); -var path = require("path"); -var fs = require("fs"); +var path = require('path'); +var fs = require('fs'); var FS = require('q-io/fs'); var shell = require('shelljs'); var os = require('os'); @@ -33,13 +33,18 @@ var spinner = require('simple-spinner'); var cordova_lib = require('../lib/cordova').lib; var events = cordova_lib.events; var cordova = cordova_lib.cordova; -const skinName = "Nexus-7"; + +const skinName = 'Nexus-7'; + +var sdkInstallPath = path.join(getUserHome(), 'platforms','android','sdk'); +var androidToolsPath = path.join(sdkInstallPath, 'tools'); +var pathToBin = path.join(androidToolsPath,'bin'); module.exports.install = install; module.exports.post_add = post_add; function install() { - return installSdk() + return downloadSdk() .then( () => { return updateSdk(); }) @@ -54,97 +59,111 @@ function install() { }); } -function installSdk() { +function downloadSdk() { var deferred = Q.defer(); var sdkDownloadUrl = null; - var sdkInstallPath = path.join(getUserHome(), 'platforms/android/sdk'); - var tempSdkDownloadFilePath = path.join(os.tmpdir(), 'android_sdk.zip'); - var tempSdkUnzipRoot = path.join(os.tmpdir(), 'platform'); - var tempSdkUnzipPath = null; - - // It's ok to hard code specific SDK download link since we will attempt to update - // to the latest SDK each time user runs "aemm platform install android". - // - // We just need to install an initial version to begin with. Android community keeps - // download links for all prior version of SDKs since it's introduction at: - // http://developer.android.com/tools/sdk/tools-notes.html + var toolsDownloadUrl = null; + var tmpSdkZip = path.join(os.tmpdir(), 'android_sdk.zip'); + var tmpSdkUnzipFolder = path.join(os.tmpdir(), 'android_sdk'); + var tmpToolsZip = path.join(os.tmpdir(), 'studio_tools.zip'); + var tmpToolsUnzipFolder = path.join(os.tmpdir(), 'studio_tools'); + //var sdkInstallPath = path.join(getUserHome(), 'platforms','android','sdk'); + //var toolsInstallPath = path.join(getUserHome(), 'platforms/android/sdk/tools'); + if (process.platform == 'win32') { - sdkDownloadUrl = 'http://dl.google.com/android/android-sdk_r24.4.1-windows.zip'; - tempSdkUnzipPath = path.join(tempSdkUnzipRoot, 'android-sdk-windows'); + //sdkDownloadUrl = 'http://dl.google.com/android/android-sdk_r24.4.1-windows.zip'; + toolsDownloadUrl = 'http://dl.google.com/android/repository/sdk-tools-windows-4333796.zip'; + var sdkContents = path.join(tmpSdkUnzipFolder, 'android-sdk-windows'); } else if (process.platform == 'darwin') { - sdkDownloadUrl = 'http://dl.google.com/android/android-sdk_r24.4.1-macosx.zip'; - tempSdkUnzipPath = path.join(tempSdkUnzipRoot, 'android-sdk-macosx'); + //sdkDownloadUrl = 'http://dl.google.com/android/android-sdk_r24.4.1-macosx.zip'; + toolsDownloadUrl = 'http://dl.google.com/android/repository/sdk-tools-darwin-4333796.zip'; + var sdkContents = path.join(tmpSdkUnzipFolder, 'android-sdk-macosx'); } else { - events.emit("log", "Unsupported OS: %s", process.platform); + events.emit('log', 'Unsupported OS: %s', process.platform); return; } - // Check whether SDK is installed already - fs.access(sdkInstallPath, fs.F_OK, function(err) { + fs.access(androidToolsPath, fs.F_OK, function(err) { if (!err) { - deferred.resolve(); + // do download, just update + deferred.resolve() } else { - spinner.start(); - - FS.makeTree(sdkInstallPath) + spinner.start(); + FS.makeTree(androidToolsPath) + //}) .then( () => { - return downloadFile(sdkDownloadUrl, tempSdkDownloadFilePath); + return downloadFile(toolsDownloadUrl, tmpToolsZip) }) .then( () => { - return unzip(tempSdkDownloadFilePath, tempSdkUnzipRoot); + return unzip(tmpToolsZip, tmpToolsUnzipFolder); }) .then( () => { - return FS.copyTree(tempSdkUnzipPath, sdkInstallPath); + // copy contents of the folder, not the folder itself + var tt = path.join(tmpToolsUnzipFolder, 'tools'); + return FS.copyTree(tt, androidToolsPath); }) .then ( () => { - return FS.removeTree(tempSdkUnzipRoot) - .catch( (err) => false ); // We don't care if it does not exist when we try to delete it + return FS.removeTree(tmpToolsUnzipFolder) + .catch( (err) => false ); }) .then( () => { spinner.stop(); - - events.emit("log", "Android SDK is installed successfully."); + events.emit('log', '******** Android Studio Tools added successfully ********\n'); deferred.resolve(); }); } }); - return deferred.promise; } function updateSdk() { var deferred = Q.defer(); - var command = null; - var script = null; - + // ./android is deprecated after 25.2.3 and higher, so will use ./sdkmanager instead; + // This replaces the gradle folder that was being added with older version, and since it + // was used on 'platform install', we need to make it available from other source if (process.platform == 'win32') { - command = "powershell"; - script = path.join(getUserHome(), 'platforms/android/sdk/tools/android.bat'); + var script= path.join(pathToBin, 'sdkmanager.bat'); + var proc = spawn('powershell', [script, '--install', + 'sources;android-27', + 'platform-tools', + 'patcher;v4', + 'build-tools;27.0.1', + 'emulator', + 'system-images;android-27;default;x86', + 'platforms;android-27', + 'extras;android;m2repository', + 'extras;google;m2repository', + 'extras;intel;Hardware_Accelerated_Execution_Manager', + 'extras;google;google_play_services'], { stdio: 'inherit' }); } else if (process.platform == 'darwin') { - command = "sh"; - script = path.join(getUserHome(), 'platforms/android/sdk/tools/android'); + var script = path.join(pathToBin, 'sdkmanager'); + var proc = spawn('sh', [script, '--install', + 'sources;android-27', + 'platform-tools', + 'patcher;v4', + 'build-tools;27.0.1', + 'emulator', + 'system-images;android-27;default;x86', + 'platforms;android-27', + 'extras;android;m2repository', + 'extras;google;m2repository', + 'extras;intel;Hardware_Accelerated_Execution_Manager', + 'extras;google;google_play_services'], { stdio: 'inherit' }); } else { - events.emit("log", "Platform not supported: " + process.platform); + events.emit('log', 'Platform not supported: ' + process.platform); return; } - - var proc = spawn(command, [script, '--silent', 'update', 'sdk', '--all', - '--no-ui', '--filter', 'build-tools-27.0.1,platform-tools,tools,android-27,sys-img-x86-google_apis-27,' + - 'extra-android-m2repository,extra-android-support,extra-google-m2repository,' + - 'extra-intel-Hardware_Accelerated_Execution_Manager'], { stdio: 'inherit' }); - - proc.on("error", function (error) { - deferred.reject(new Error("Installing Android platform encountered error " + error.message)); + proc.on('error', function (error) { + deferred.reject(new Error('Installing Android platform encountered error ' + error.message)); }); - proc.on("exit", function(code) { + proc.on('exit', function(code) { if (code !== 0) { - deferred.reject(new Error("Installing Android platform exited with code " + code)); + deferred.reject(new Error('Installing Android platform exited with code ' + code)); } else { - events.emit("log", "Android SDK is updated successfully."); + events.emit('log', '******** Android SDK added successfully. ********\n'); deferred.resolve(); } }); - return deferred.promise; } @@ -154,7 +173,7 @@ function setupEnv() { } else if (process.platform == 'darwin') { return setupEnv_mac(); } else { - events.emit("log", "Unsupported OS: %s", process.platform); + events.emit('log', 'Unsupported OS: %s', process.platform); return; } } @@ -162,51 +181,58 @@ function setupEnv() { function installHAXM() { var deferred = Q.defer(); var command = null; + var haxm_path = path.join(sdkInstallPath,'extras', + 'intel','Hardware_Accelerated_Execution_Manager'); if (process.platform == 'win32') { - command = path.join(getUserHome(), 'platforms/android/sdk/extras/intel/Hardware_Accelerated_Execution_Manager/silent_install.bat'); + command = path.join(haxm_path,'silent_install.bat'); } else if (process.platform == 'darwin') { - command = 'sudo ' + path.join(getUserHome(), 'platforms/android/sdk/extras/intel/Hardware_Accelerated_Execution_Manager/silent_install.sh'); + command = 'sudo ' + path.join(haxm_path, 'silent_install.sh'); + } else { - events.emit("log", "Unsupported OS: %s", process.platform); + events.emit('log', 'Unsupported OS: %s', process.platform); return; } - spinner.start(); - var workingDir = path.join(getUserHome(), 'platforms/android/sdk/extras/intel/Hardware_Accelerated_Execution_Manager'); - shell.cd(workingDir); + shell.cd(haxm_path); shell.exec(command, { silent: false }, function (code, output) { spinner.stop(); if (code === 0) { + events.emit('log', '******** HAXM successfully. ********\n'); deferred.resolve(); } else { - deferred.reject(new Error("Installing Intel HAXM failed.")); + deferred.reject(new Error('Installing Intel HAXM failed.')); } }); - return deferred.promise; } function createAvd() { - var skinFrom = path.join(__dirname, '..', 'platforms/android/skins', skinName); - var skinTo = path.join(getUserHome(), 'platforms/android/sdk/platforms/android-27/skins', skinName); - + var skinFrom = path.join(__dirname, '..', 'platforms','android', 'skins', skinName); + var skinTo = path.join(sdkInstallPath, 'platforms', 'android-27','skins', skinName); return FS.makeTree(skinTo) .then( () => { return FS.copyTree(skinFrom, skinTo); }) .then( () => { var deferred = Q.defer(); - var command = null; + // ./android is deprecated, so will use ./avdmanager from Adnroid Studio Tools instead if (process.platform == 'win32') { - command = 'echo "no" | ' + path.join(getUserHome(), 'platforms/android/sdk/tools/android.bat') + ' create avd --force -n AEMM_Tablet --device "Nexus 7" -t "android-23" --abi default/x86_64 --skin "Nexus-7" --sdcard 1024M'; + command = path.join(androidToolsPath,'bin','avdmanager.bat') + + ' -s create avd -f -n AEMM_Tablet -b default/x86 ' + + '-k "system-images;android-27;default;x86" -c 1024M -d "Nexus 7"'; } else if (process.platform == 'darwin') { - command = 'echo "no" | ' + path.join(getUserHome(), 'platforms/android/sdk/tools/android') + ' create avd --force -n AEMM_Tablet --device "Nexus 7" -t "android-23" --abi default/x86_64 --skin "Nexus-7" --sdcard 1024M'; + // seems that the exec files become TextEdit format after unzip + command = 'chmod -R 755 ' + androidToolsPath + ' && ' + + path.join(androidToolsPath,'bin','avdmanager') + + ' -s create avd -f -n AEMM_Tablet -b default/x86 ' + + '-k "system-images;android-27;default;x86" -c 1024M -d "Nexus 7"' + ' && ' + + 'chmod -R 755 ' + sdkInstallPath; } else { - deferred.reject(new Error("Platform not supported: " + process.platform)); + deferred.reject(new Error('Platform not supported: ' + process.platform)); return; } @@ -214,13 +240,12 @@ function createAvd() { silent: false }, function (code, output) { if (code === 0) { - events.emit("log", "AVD is created successfully."); + events.emit('log', '\n******** AVD is created successfully ********\n'); deferred.resolve(); } else { - deferred.reject(new Error("Creating AVD failed")); + deferred.reject(new Error('Creating AVD failed')); } }); - return deferred.promise; }); } @@ -229,10 +254,10 @@ function post_add() { return Q.fcall( () => { // add aemm-plugin-navto by default to be consistent with our viewer app behavior. - var targets = ["aemm-plugin-navto"]; - return cordova.raw.plugin("add", targets); + var targets = ['aemm-plugin-navto']; + return cordova.raw.plugin('add', targets); }) .then(() => { - events.emit("results", "Finished adding Android platform."); + events.emit('results', 'Finished adding Android platform.'); }); } diff --git a/src/platform-ios.js b/src/platform-ios.js old mode 100644 new mode 100755 diff --git a/src/platform.js b/src/platform.js old mode 100644 new mode 100755 diff --git a/src/plugin.js b/src/plugin.js old mode 100644 new mode 100755 diff --git a/src/project.js b/src/project.js old mode 100644 new mode 100755 diff --git a/src/random-port.js b/src/random-port.js old mode 100644 new mode 100755 diff --git a/src/run-android.js b/src/run-android.js old mode 100644 new mode 100755 diff --git a/src/run-ios.js b/src/run-ios.js old mode 100644 new mode 100755 diff --git a/src/run.js b/src/run.js old mode 100644 new mode 100755 diff --git a/src/serve.js b/src/serve.js old mode 100644 new mode 100755 diff --git a/utils/constants.js b/utils/constants.js old mode 100644 new mode 100755 diff --git a/utils/debugHelper.js b/utils/debugHelper.js old mode 100644 new mode 100755 diff --git a/utils/downloadFile.js b/utils/downloadFile.js old mode 100644 new mode 100755 diff --git a/utils/getUserHome.js b/utils/getUserHome.js old mode 100644 new mode 100755 diff --git a/utils/ip.js b/utils/ip.js old mode 100644 new mode 100755 diff --git a/utils/platformRequire.js b/utils/platformRequire.js old mode 100644 new mode 100755 diff --git a/utils/setupEnv-android-mac.js b/utils/setupEnv-android-mac.js old mode 100644 new mode 100755 index 96cf38d..7606a9a --- a/utils/setupEnv-android-mac.js +++ b/utils/setupEnv-android-mac.js @@ -1,12 +1,9 @@ /** - Copyright (c) 2016 Adobe Systems Incorporated. All rights reserved. - + Copyright (c) 2019 Adobe Systems Incorporated. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 - Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @@ -15,82 +12,62 @@ */ var Q = require('q'); -var path = require("path"); var shell = require('shelljs'); -var spawn = require('cross-spawn-async'); -var getUserHome = require('../utils/getUserHome'); var cordova_lib = require('../lib/cordova').lib; var events = cordova_lib.events; +var android_home = process.env['HOME'] + '/platforms/android/sdk'; +var platform_tools = android_home + '/platform-tools'; +var sdk_tools = android_home + '/tools'; +var entire_path = process.env['PATH'] + ':' + platform_tools + ':' + sdk_tools; + module.exports = function() { return setEnvVariables(); } function setEnvVariables() { - return setAndroid_Home() - .then( () => { - setPaths(); - }); + if (process.env['ANDROID_HOME'] != android_home){ + return setAndroid_Home() + .then( () => { + if (process.env['PATH'].includes('platform-tools') && process.env['PATH'].includes('tools')){ + return + } else { return setEnvVariable('PATH', entire_path) } + }); + } else {return} } function setAndroid_Home() { - var android_home = path.join(getUserHome(), 'Library/Android/sdk'); - - return isEnvVariableSet("ANDROID_HOME", android_home) + return isEnvVariableSet('ANDROID_HOME', android_home) .then( (code) => { - // 0 == true, otherwise false if (code != 0) { - return setEnvVariable("ANDROID_HOME", android_home); + return setEnvVariable('ANDROID_HOME', android_home); } }); } -function setPaths() { - var platform_tools = "/Library/Android/sdk/platform-tools"; - var tools = "/platforms/android/sdk/tools"; - var platform_tools_path = "/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:" + getUserHome() + platform_tools + ":" + getUserHome() + tools + ":" + getUserHome(); - var tools_path = platform_tools_path + '/Library/Android/sdk/tools'; - return setPath(tools_path) - .then ( () => { - var platformtools_path = platform_tools_path + platform_tools; - return setPath(platformtools_path); - }); -} - -function setPath(path) { - return isEnvVariableSet("PATH", path) - .then( (code) => { - return setEnvVariable("PATH", path); - }); -} - function isEnvVariableSet(name, value) { var deferred = Q.defer(); - var command = "echo $" + name + " | grep -q " + '"' + value + '"'; shell.exec(command, { silent: false }, function (code, output) { deferred.resolve(code); }); - return deferred.promise; } function setEnvVariable(name, value) { var deferred = Q.defer(); - - var command = "echo " + '"export ' + name + '=' + value + '"' + " >> ~/.bash_profile" + " && " + "source" + " ~/.bash_profile"; + var command = 'echo export ' + name + '=\'"' + value + '"\' >> ~/.bash_profile && source ~/.bash_profile'; shell.exec(command, { silent: false }, function (code, output) { if (code !== 0) { - deferred.reject(new Error("Setup environment variable(" + name + ") exited with code " + code)); + deferred.reject(new Error('Setting up environment variable (' + name + ') failed: exited with code ' + code)); } else { - events.emit("log", "Setup environment variable(" + name + ") successfully"); + events.emit('log', 'Setting up environment variable (' + name + '): success'); deferred.resolve(); } }); - return deferred.promise; } diff --git a/utils/setupEnv-android-win.js b/utils/setupEnv-android-win.js old mode 100644 new mode 100755 diff --git a/utils/unzip.js b/utils/unzip.js old mode 100644 new mode 100755