diff options
12 files changed, 156 insertions, 102 deletions
diff --git a/adtproductbuild/Android.mk b/adtproductbuild/Android.mk index 61e5c70..dd1e2e4 100644 --- a/adtproductbuild/Android.mk +++ b/adtproductbuild/Android.mk @@ -23,8 +23,8 @@ include $(BUILD_SYSTEM)/base_rules.mk ADT_IDE_MODULE_DEPS := $(TOPDIR)sdk/adtproductbuild/$(LOCAL_MODULE) -ADT_IDE_BUILD_LOG := $(TOPDIR)out/host/eclipse/adtproduct/build/adtproduct.log -ADT_IDE_ARTIFACT_DIR := $(TOPDIR)out/host/eclipse/adtproduct/build/I.RcpBuild +ADT_IDE_BUILD_LOG := $(TOPDIR)out/host/eclipse/adtproduct/adtproduct.log +ADT_IDE_ARTIFACT_DIR := $(TOPDIR)out/host/eclipse/adtproduct/pbuild/I.RcpBuild ADT_IDE_RELEASE_DIR := $(TOPDIR)out/host/eclipse/adtproduct/release ADT_IDE_JAVA_LIBS := $(shell $(TOPDIR)sdk/eclipse/scripts/create_all_symlinks.sh -d) @@ -45,7 +45,8 @@ $(ADT_IDE_JAVA_TARGET) : $(TOPDIR)sdk/adtproductbuild/adt_eclipse_ide \ echo "*** [adt_eclipse_ide] ERROR: Missing prebuilts/eclipse-build-deps directory. Make sure to run 'repo init -g all;repo sync' first."; \ exit 1; \ fi - $(hide)rm -rf $(TOPDIR)out/host/eclipse/adtproduct/build/plugins + $(hide)rm -rf $(TOPDIR)out/host/eclipse/adtproduct/fbuild/plugins + $(hide)rm -rf $(TOPDIR)out/host/eclipse/adtproduct/pbuild/plugins $(hide)mkdir -p $(dir $@) $(hide)$(TOPDIR)sdk/eclipse/scripts/create_all_symlinks.sh -c $(hide)cd $(TOPDIR)sdk/adtproductbuild && \ @@ -53,8 +54,8 @@ $(ADT_IDE_JAVA_TARGET) : $(TOPDIR)sdk/adtproductbuild/adt_eclipse_ide \ ( java -jar ../../external/eclipse-basebuilder/basebuilder-3.6.2/org.eclipse.releng.basebuilder/plugins/org.eclipse.equinox.launcher_1.1.0.v20100507.jar \ org.eclipse.equinox.launcher.Main \ -application org.eclipse.ant.core.antRunner \ - -configuration ../../out/host/eclipse/adtproduct/build/configuration \ - -data ../../out/host/eclipse/adtproduct/workspace \ + -configuration ../../out/host/eclipse/adtproduct/ant-configuration \ + -data ../../out/host/eclipse/adtproduct/ant-workspace \ 2>&1 && \ mv -f ../../$(ADT_IDE_BUILD_LOG) ../../$(ADT_IDE_BUILD_LOG).1 ) \ | tee ../../$(ADT_IDE_BUILD_LOG) \ diff --git a/adtproductbuild/build.xml b/adtproductbuild/build.xml index c91bff0..3458479 100644 --- a/adtproductbuild/build.xml +++ b/adtproductbuild/build.xml @@ -1,4 +1,8 @@ <project name="com.android.eclipse.rcp.build" default="build"> + <tstamp> + <format property="QUALIFIER" pattern="yyyy-M-d-H-m"/> + </tstamp> + <!-- Root of Android Source Tree --> <property name="ANDROID_SRC" location="../../" /> @@ -12,14 +16,14 @@ <!-- Location where build happens and resulting binaries are generated --> <property name="outDir" value="${ANDROID_SRC}/out/host/eclipse/adtproduct/" /> - <!-- Location where final results are released --> - <property name="outDir" value="${ANDROID_SRC}/out/host/eclipse/androidide/" /> - <!-- Location where the target platform is created --> <property name="targetDir" value="${outDir}/target" /> - <!-- Location where the target platform is created --> - <property name="buildDir" value="${outDir}/build" /> + <!-- Location where ADT feature build is performed --> + <property name="featureBuildDir" value="${outDir}/fbuild" /> + + <!-- Location where ADT feature build is performed --> + <property name="productBuildDir" value="${outDir}/pbuild" /> <!-- Location of the sources --> <property name="srcDir" value="${ANDROID_SRC}/sdk/eclipse/" /> @@ -31,7 +35,7 @@ <condition property="buildconfigs" value="macosx,cocoa,x86_64"> <equals arg1="${buildFor}" arg2="darwin" /> </condition> - <condition property="buildconfigs" value="win32,win32,x86 & win32,win32,x86_64"> + <condition property="buildconfigs" value="win32,win32,x86_64"> <equals arg1="${buildFor}" arg2="windows" /> </condition> @@ -56,14 +60,20 @@ <!-- create the build directory, copy plugins and features into it --> <target name="copy_srcs"> - <mkdir dir="${buildDir}" /> - <copy todir="${buildDir}" preservelastmodified="true"> + <mkdir dir="${featureBuildDir}" /> + <copy todir="${featureBuildDir}" preservelastmodified="true"> <fileset dir="${srcDir}/"> <include name="plugins/**" /> <include name="features/**" /> <exclude name="plugins/*/bin/**" /> </fileset> </copy> + <mkdir dir="${productBuildDir}" /> + <copy todir="${productBuildDir}" preservelastmodified="true"> + <fileset dir="${srcDir}/"> + <include name="features/com.android.ide.eclipse.adt.package/**" /> + </fileset> + </copy> </target> <!-- create target platform --> @@ -81,20 +91,47 @@ <unzip src="${targetSrcDir}/gef/GEF-SDK-3.7.2.zip" dest="${targetDir}/repos/gef" overwrite="false" /> </target> - <!-- Launch pde build --> - <target name="pde-build" depends="copy_srcs, create-target"> + <!-- Launch pde build to build the adtpackage product --> + <target name="feature-build" depends="copy_srcs, create-target"> + <java classname="org.eclipse.equinox.launcher.Main" fork="true" failonerror="true"> + <arg value="-application" /> + <arg value="org.eclipse.ant.core.antRunner" /> + <arg value="-buildfile" /> + <arg value="${pde.build.dir}/scripts/build.xml" /> + <arg value="-data" /> + <arg value="${featureBuildDir}/workspace" /> + <arg value="-configuration" /> + <arg value="${featureBuildDir}/configuration" /> + <arg value="-Dtimestamp=${timestamp}" /> + <arg value="-DeclipseLocation=${baseBuilder}" /> + <arg value="-DbuildDirectory=${featureBuildDir}" /> + <arg value="-Dbuilder=${ANDROID_SRC}/sdk/eclipse/buildConfig" /> + <arg value="-DbaseLocation=${targetDir}/deltapack/eclipse" /> + <arg value="-DrepoBaseLocation=${targetDir}/repos/" /> + <arg value="-DtransformedRepoLocation=${targetDir}/transformedRepos/" /> + <arg value="-DupdateSiteSource=${ANDROID_SRC}/sdk/eclipse/sites/external" /> + <arg value="-DupdateSiteRoot=${targetDir}/repos/" /> + <arg value="-DforceContextQualifier=${QUALIFIER}" /> + <classpath> + <pathelement location="${equinox.launcher}" /> + </classpath> + </java> + </target> + + <!-- Launch pde build to build the adtpackage product --> + <target name="product-build" depends="feature-build"> <java classname="org.eclipse.equinox.launcher.Main" fork="true" failonerror="true"> <arg value="-application" /> <arg value="org.eclipse.ant.core.antRunner" /> <arg value="-buildfile" /> <arg value="${pde.build.dir}/scripts/productBuild/productBuild.xml" /> <arg value="-data" /> - <arg value="${buildDir}/workspace" /> + <arg value="${productBuildDir}/workspace" /> <arg value="-configuration" /> - <arg value="${buildDir}/configuration" /> + <arg value="${productBuildDir}/configuration" /> <arg value="-Dtimestamp=${timestamp}" /> <arg value="-DeclipseLocation=${baseBuilder}" /> - <arg value="-DbuildDirectory=${buildDir}" /> + <arg value="-DbuildDirectory=${productBuildDir}" /> <arg value="-DbaseLocation=${targetDir}/deltapack/eclipse" /> <arg value="-DrepoBaseLocation=${targetDir}/repos/" /> <arg value="-DtransformedRepoLocation=${targetDir}/transformedRepos/" /> @@ -110,5 +147,13 @@ <delete dir="${targetDir}" /> </target> - <target name="build" depends="pde-build" /> + <!-- Make sure that earlier build results are not present in the repository --> + <target name="clean-features"> + <delete dir="${featureBuildDir}" /> + <delete dir="${productBuildDir}" /> + <delete dir="${targetDir}/repos/android-eclipse" /> + <delete dir="${targetDir}/transformedRepos" /> + </target> + + <target name="build" depends="clean-features, product-build" /> </project> diff --git a/eclipse/features/com.android.ide.eclipse.adt.package/feature.xml b/eclipse/features/com.android.ide.eclipse.adt.package/feature.xml index 12e4ef3..33b8803 100644 --- a/eclipse/features/com.android.ide.eclipse.adt.package/feature.xml +++ b/eclipse/features/com.android.ide.eclipse.adt.package/feature.xml @@ -22,35 +22,6 @@ <update label="Android Update Site" url="https://dl-ssl.google.com/android/eclipse/"/> </url> - <includes - id="org.eclipse.platform" - version="0.0.0" - search-location="both"/> - - <includes - id="com.android.ide.eclipse.ddms" - version="0.0.0"/> - - <includes - id="com.android.ide.eclipse.adt" - version="0.0.0"/> - - <includes - id="com.android.ide.eclipse.gldebugger" - version="0.0.0"/> - - <includes - id="com.android.ide.eclipse.hierarchyviewer" - version="0.0.0"/> - - <includes - id="com.android.ide.eclipse.ndk" - version="0.0.0"/> - - <includes - id="com.android.ide.eclipse.traceview" - version="0.0.0"/> - <requires> <import feature="org.eclipse.platform"/> <import plugin="org.eclipse.equinox.app"/> @@ -82,15 +53,9 @@ <import plugin="org.eclipse.ltk.core.refactoring"/> <import plugin="org.eclipse.ltk.ui.refactoring"/> <import plugin="org.eclipse.core.expressions"/> - <import feature="org.eclipse.platform"/> - <import feature="org.eclipse.jdt" version="3.7.0" match="greaterOrEqual"/> - <import feature="org.eclipse.platform"/> - <import feature="org.eclipse.jdt" version="3.7.0" match="greaterOrEqual"/> <import feature="org.eclipse.equinox.p2.user.ui"/> <import feature="org.eclipse.help"/> - <import feature="org.eclipse.platform"/> <import feature="org.eclipse.rcp" version="3.7.0" match="greaterOrEqual"/> - <import feature="org.eclipse.jdt" version="3.7.0" match="greaterOrEqual"/> <import feature="org.eclipse.wst.common_core.feature"/> <import feature="org.eclipse.wst.common_ui.feature"/> <import feature="org.eclipse.wst.xml_core.feature"/> @@ -106,12 +71,12 @@ <import plugin="org.eclipse.cdt.dsf.gdb"/> <import plugin="org.eclipse.cdt.dsf.gdb.ui"/> <import plugin="org.eclipse.cdt.launch"/> + <import feature="com.android.ide.eclipse.ddms" version="21.0.0" match="greaterOrEqual" /> + <import feature="com.android.ide.eclipse.adt" version="21.0.0" match="greaterOrEqual" /> + <import feature="com.android.ide.eclipse.gldebugger" version="21.0.0" match="greaterOrEqual" /> + <import feature="com.android.ide.eclipse.hierarchyviewer" version="21.0.0" match="greaterOrEqual" /> + <import feature="com.android.ide.eclipse.ndk" version="21.0.0" match="greaterOrEqual" /> + <import feature="com.android.ide.eclipse.traceview" version="21.0.0" match="greaterOrEqual" /> </requires> - <plugin - id="com.android.ide.eclipse.adt.package" - download-size="0" - install-size="0" - version="0.0.0"/> - </feature> diff --git a/eclipse/features/com.android.ide.eclipse.adt/feature.xml b/eclipse/features/com.android.ide.eclipse.adt/feature.xml index 1360af0..d16c5a8 100644 --- a/eclipse/features/com.android.ide.eclipse.adt/feature.xml +++ b/eclipse/features/com.android.ide.eclipse.adt/feature.xml @@ -158,4 +158,10 @@ This Agreement is governed by the laws of the State of New York and the intellec version="0.0.0" unpack="false"/> + <plugin + id="com.android.ide.eclipse.adt.package" + download-size="0" + install-size="0" + version="0.0.0"/> + </feature> diff --git a/eclipse/plugins/com.android.ide.eclipse.adt.package/plugin.xml b/eclipse/plugins/com.android.ide.eclipse.adt.package/plugin.xml index ce6baf9..5d4a993 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt.package/plugin.xml +++ b/eclipse/plugins/com.android.ide.eclipse.adt.package/plugin.xml @@ -41,7 +41,7 @@ point="org.eclipse.ui.intro"> <intro class="org.eclipse.ui.intro.config.CustomizableIntroPart" - icon="$nl$/icons/image_obj.gif" + icon="icons/adt16.png" id="org.eclipse.intro.minimal" label="Android IDE"/> </extension> diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtPlugin.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtPlugin.java index e08d7ea..b11984e 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtPlugin.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/AdtPlugin.java @@ -265,16 +265,6 @@ public class AdtPlugin extends AbstractUIPlugin implements ILogger { // Listen on resource file edits for updates to file inclusion IncludeFinder.start(); - - // Parse the SDK content. - // This is deferred in separate jobs to avoid blocking the bundle start. - final boolean isSdkLocationValid = checkSdkLocationAndId(); - if (isSdkLocationValid) { - // parse the SDK resources. - // Wait 2 seconds before starting the job. This leaves some time to the - // other bundles to initialize. - parseSdkContent(2000 /*milliseconds*/); - } } /* @@ -303,6 +293,16 @@ public class AdtPlugin extends AbstractUIPlugin implements ILogger { /** Called when the workbench has been started */ public void workbenchStarted() { + // Parse the SDK content. + // This is deferred in separate jobs to avoid blocking the bundle start. + final boolean isSdkLocationValid = checkSdkLocationAndId(); + if (isSdkLocationValid) { + // parse the SDK resources. + // Wait 2 seconds before starting the job. This leaves some time to the + // other bundles to initialize. + parseSdkContent(2000 /*milliseconds*/); + } + Display display = getDisplay(); mRed = new Color(display, 0xFF, 0x00, 0x00); diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreview.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreview.java index 95722c5..5a926e8 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreview.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/editors/layout/gle2/RenderPreview.java @@ -515,7 +515,8 @@ public class RenderPreview implements IJobChangeListener { disposeThumbnail(); Configuration configuration = - mAlternateInput != null ? mAlternateConfiguration : mConfiguration; + mAlternateInput != null && mAlternateConfiguration != null + ? mAlternateConfiguration : mConfiguration; ResourceResolver resolver = getResourceResolver(configuration); RenderService renderService = RenderService.create(editor, configuration, resolver); diff --git a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/AdtStartup.java b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/AdtStartup.java index 8d8b688..aee0af3 100644 --- a/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/AdtStartup.java +++ b/eclipse/plugins/com.android.ide.eclipse.adt/src/com/android/ide/eclipse/adt/internal/welcome/AdtStartup.java @@ -71,8 +71,11 @@ public class AdtStartup implements IStartup, IWindowListener { @Override public void earlyStartup() { - if (InstallDetails.isAndroidIdePackage()) { - useBundledSdk(); + if (!isSdkSpecified()) { + File bundledSdk = getBundledSdk(); + if (bundledSdk != null) { + AdtPrefs.getPrefs().setSdkLocation(bundledSdk); + } } if (isFirstTime()) { @@ -88,30 +91,34 @@ public class AdtStartup implements IStartup, IWindowListener { AdtPlugin.getDefault().workbenchStarted(); } - private void useBundledSdk() { + private boolean isSdkSpecified() { String osSdkFolder = AdtPrefs.getPrefs().getOsSdkFolder(); + return (osSdkFolder != null && !osSdkFolder.isEmpty()); + } - // sdk path is already set - if (osSdkFolder != null && osSdkFolder.length() > 0) { - return; - } - - // The Android IDE bundle is structured as follows: - // root - // |--eclipse - // |--sdk - // So use the SDK folder that is + /** + * Returns the path to the bundled SDK if this is part of the ADT package. + * The ADT package has the following structure: + * root + * |--eclipse + * |--sdk + * @return path to bundled SDK, null if no valid bundled SDK detected. + */ + private File getBundledSdk() { Location install = Platform.getInstallLocation(); if (install != null && install.getURL() != null) { - String toolsFolder = new File(install.getURL().getFile()).getParent(); + File toolsFolder = new File(install.getURL().getFile()).getParentFile(); if (toolsFolder != null) { - String osSdkPath = toolsFolder + File.separator + "sdk"; - if (AdtPlugin.getDefault().checkSdkLocationAndId(osSdkPath, - new SdkValidator())) { - AdtPrefs.getPrefs().setSdkLocation(new File(osSdkPath)); + File sdkFolder = new File(toolsFolder, "sdk"); + if (sdkFolder.exists() && AdtPlugin.getDefault().checkSdkLocationAndId( + sdkFolder.getAbsolutePath(), + new SdkValidator())) { + return sdkFolder; } } } + + return null; } private boolean isFirstTime() { diff --git a/eclipse/plugins/com.android.ide.eclipse.base/src/com/android/ide/eclipse/base/InstallDetails.java b/eclipse/plugins/com.android.ide.eclipse.base/src/com/android/ide/eclipse/base/InstallDetails.java index 71eccbf..8c4a4a7 100644 --- a/eclipse/plugins/com.android.ide.eclipse.base/src/com/android/ide/eclipse/base/InstallDetails.java +++ b/eclipse/plugins/com.android.ide.eclipse.base/src/com/android/ide/eclipse/base/InstallDetails.java @@ -23,7 +23,6 @@ import org.osgi.framework.Version; public class InstallDetails { private static final String ADT_PLUGIN_ID = "com.android.ide.eclipse.adt"; //$NON-NLS-1$ private static final String ECLIPSE_PLATFORM_PLUGIN_ID = "org.eclipse.platform"; //$NON-NLS-1$ - private static final String ADT_PRODUCT_PLUGIN_ID = "com.android.ide.eclipse.adt.package"; //$NON-NLS-1$ /** * Returns true if the ADT plugin is available in the current platform. This is useful @@ -39,10 +38,4 @@ public class InstallDetails { Bundle b = Platform.getBundle(ECLIPSE_PLATFORM_PLUGIN_ID); return b == null ? Version.emptyVersion : b.getVersion(); } - - /** Returns true if this is the "Eclipse for Android Developers" product. */ - public static boolean isAndroidIdePackage() { - Bundle b = Platform.getBundle(ADT_PRODUCT_PLUGIN_ID); - return b != null; - } } diff --git a/files/ant/build.xml b/files/ant/build.xml index 699fb58..6bda75b 100644 --- a/files/ant/build.xml +++ b/files/ant/build.xml @@ -1256,7 +1256,7 @@ <if condition="${emma.enabled}"> <then> - <echo>WARNING: Code Coverage is currently only supported on the emulator and rooted devices.</echo> + <echo>Running tests...</echo> <run-tests-helper emma.enabled="true"> <extra-instrument-args> <arg value="-e" /> @@ -1264,6 +1264,17 @@ <arg value="${emma.dump.file}" /> </extra-instrument-args> </run-tests-helper> + + <echo level="info">Settting permission to download the coverage file...</echo> + <exec executable="${adb}" failonerror="true"> + <arg line="${adb.device.arg}" /> + <arg value="shell" /> + <arg value="run-as" /> + <arg value="${tested.project.app.package}" /> + <arg value="chmod" /> + <arg value="644" /> + <arg value="${emma.dump.file}" /> + </exec> <echo level="info">Downloading coverage file into project directory...</echo> <exec executable="${adb}" failonerror="true"> <arg line="${adb.device.arg}" /> @@ -1271,7 +1282,6 @@ <arg value="${emma.dump.file}" /> <arg path="${out.absolute.dir}/coverage.ec" /> </exec> - <echo level="info">Extracting coverage report...</echo> <pathconvert property="tested.project.lib.source.path.value" refid="tested.project.lib.source.path"> <firstmatchmapper> @@ -1280,7 +1290,7 @@ </firstmatchmapper> </pathconvert> - + <echo level="info">Extracting coverage report...</echo> <emma> <report sourcepath="${tested.project.source.absolute.dir}:${tested.project.lib.source.path.value}" verbosity="${verbosity}"> @@ -1294,6 +1304,14 @@ <echo level="info">Cleaning up temporary files...</echo> <delete file="${out.absolute.dir}/coverage.ec" /> <delete file="${out.absolute.dir}/coverage.em" /> + <exec executable="${adb}" failonerror="true"> + <arg line="${adb.device.arg}" /> + <arg value="shell" /> + <arg value="run-as" /> + <arg value="${tested.project.app.package}" /> + <arg value="rm" /> + <arg value="${emma.dump.file}" /> + </exec> <echo level="info">Saving the report file in ${out.absolute.dir}/coverage.html</echo> </then> <else> diff --git a/testapps/buildConfigTest/app/build.xml b/testapps/buildConfigTest/app/build.xml index 09cd907..93dfe0f 100644 --- a/testapps/buildConfigTest/app/build.xml +++ b/testapps/buildConfigTest/app/build.xml @@ -28,6 +28,15 @@ --> <property file="ant.properties" /> + <!-- if sdk.dir was not set from one of the property file, then + get it from the ANDROID_HOME env var. + This must be done before we load project.properties since + the proguard config can use sdk.dir --> + <property environment="env" /> + <condition property="sdk.dir" value="${env.ANDROID_HOME}"> + <isset property="env.ANDROID_HOME" /> + </condition> + <!-- The project.properties file is created and updated by the 'android' tool, as well as ADT. @@ -41,7 +50,7 @@ <!-- quick check on sdk.dir --> <fail - message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var" + message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable." unless="sdk.dir" /> diff --git a/testapps/buildConfigTest/lib1/build.xml b/testapps/buildConfigTest/lib1/build.xml index 2a15ae6..a111b4d 100644 --- a/testapps/buildConfigTest/lib1/build.xml +++ b/testapps/buildConfigTest/lib1/build.xml @@ -28,6 +28,15 @@ --> <property file="ant.properties" /> + <!-- if sdk.dir was not set from one of the property file, then + get it from the ANDROID_HOME env var. + This must be done before we load project.properties since + the proguard config can use sdk.dir --> + <property environment="env" /> + <condition property="sdk.dir" value="${env.ANDROID_HOME}"> + <isset property="env.ANDROID_HOME" /> + </condition> + <!-- The project.properties file is created and updated by the 'android' tool, as well as ADT. @@ -41,7 +50,7 @@ <!-- quick check on sdk.dir --> <fail - message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through an env var" + message="sdk.dir is missing. Make sure to generate local.properties using 'android update project' or to inject it through the ANDROID_HOME environment variable." unless="sdk.dir" /> |