Bug 1196367 - Remove AndroidEclipse build backend. r=gps draft
authorNick Alexander <nalexander@mozilla.com>
Tue, 02 May 2017 21:39:03 -0700
changeset 571670 f11a0f7983e9cf3131ab3189a3d2816cb86cab2c
parent 571581 3052bec047e920bd0ba483d42343003a15671ea6
child 626848 c7dd72742c052435436d2fd091ec8c4a656bf980
push id56884
push usernalexander@mozilla.com
push dateWed, 03 May 2017 04:39:30 +0000
reviewersgps
bugs1196367
milestone55.0a1
Bug 1196367 - Remove AndroidEclipse build backend. r=gps MozReview-Commit-ID: CdrpMaggWsJ
build/docs/androideclipse.rst
build/docs/cppeclipse.rst
python/mozbuild/mozbuild/backend/__init__.py
python/mozbuild/mozbuild/backend/android_eclipse.py
python/mozbuild/mozbuild/backend/mach_commands.py
python/mozbuild/mozbuild/backend/recursivemake.py
python/mozbuild/mozbuild/backend/templates/android_eclipse/.classpath
python/mozbuild/mozbuild/backend/templates/android_eclipse/.externalToolBuilders/com.android.ide.eclipse.adt.ApkBuilder.launch
python/mozbuild/mozbuild/backend/templates/android_eclipse/.externalToolBuilders/com.android.ide.eclipse.adt.PreCompilerBuilder.launch
python/mozbuild/mozbuild/backend/templates/android_eclipse/.externalToolBuilders/com.android.ide.eclipse.adt.ResourceManagerBuilder.launch
python/mozbuild/mozbuild/backend/templates/android_eclipse/.externalToolBuilders/org.eclipse.jdt.core.javabuilder.launch
python/mozbuild/mozbuild/backend/templates/android_eclipse/.project
python/mozbuild/mozbuild/backend/templates/android_eclipse/.settings/org.eclipse.jdt.core.prefs
python/mozbuild/mozbuild/backend/templates/android_eclipse/.settings/org.eclipse.jdt.ui.prefs
python/mozbuild/mozbuild/backend/templates/android_eclipse/AndroidManifest.xml
python/mozbuild/mozbuild/backend/templates/android_eclipse/gen/tmp
python/mozbuild/mozbuild/backend/templates/android_eclipse/lint.xml
python/mozbuild/mozbuild/backend/templates/android_eclipse/project.properties
python/mozbuild/mozbuild/config_status.py
python/mozbuild/mozbuild/frontend/context.py
python/mozbuild/mozbuild/frontend/data.py
python/mozbuild/mozbuild/frontend/emitter.py
python/mozbuild/mozbuild/frontend/reader.py
python/mozbuild/mozbuild/test/backend/common.py
python/mozbuild/mozbuild/test/backend/data/android_eclipse/library1/resources/values/strings.xml
python/mozbuild/mozbuild/test/backend/data/android_eclipse/main1/AndroidManifest.xml
python/mozbuild/mozbuild/test/backend/data/android_eclipse/main2/AndroidManifest.xml
python/mozbuild/mozbuild/test/backend/data/android_eclipse/main2/assets/dummy.txt
python/mozbuild/mozbuild/test/backend/data/android_eclipse/main2/extra.jar
python/mozbuild/mozbuild/test/backend/data/android_eclipse/main2/res/values/strings.xml
python/mozbuild/mozbuild/test/backend/data/android_eclipse/main3/AndroidManifest.xml
python/mozbuild/mozbuild/test/backend/data/android_eclipse/main3/a/A.java
python/mozbuild/mozbuild/test/backend/data/android_eclipse/main3/b/B.java
python/mozbuild/mozbuild/test/backend/data/android_eclipse/main3/c/C.java
python/mozbuild/mozbuild/test/backend/data/android_eclipse/main4
python/mozbuild/mozbuild/test/backend/data/android_eclipse/moz.build
python/mozbuild/mozbuild/test/backend/data/android_eclipse/subdir/moz.build
python/mozbuild/mozbuild/test/backend/data/android_eclipse/subdir/submain/AndroidManifest.xml
python/mozbuild/mozbuild/test/backend/test_android_eclipse.py
python/mozbuild/mozbuild/test/backend/test_recursivemake.py
python/mozbuild/mozbuild/test/python.ini
deleted file mode 100644
--- a/build/docs/androideclipse.rst
+++ /dev/null
@@ -1,90 +0,0 @@
-.. _build_androideclipse:
-
-========================
-Android Eclipse Projects
-========================
-
-The build system contains alpha support for generating Android Eclipse
-project files to aid with development.
-
-To generate Android Eclipse project files, you'll need to have a fully
-built and packaged tree::
-
-   mach build && mach package
-
-(This is because Eclipse itself packages an APK containing
-``omni.ja``, and ``omni.ja`` is only assembled during packaging.)
-
-Then, simply generate the Android Eclipse build backend::
-
-   mach build-backend -b AndroidEclipse
-
-If all goes well, the path to the generated projects should be
-printed (currently, ``$OBJDIR/android_eclipse``).
-
-To use the generated Android Eclipse project files, you'll need to
-have a recent version of Eclipse (see `Tested Versions`_) with the
-`Eclipse ADT plugin
-<http://developer.android.com/tools/sdk/eclipse-adt.html>`_
-installed. You can then import all the projects into Eclipse using
-*File > Import ... > General > Existing Projects into Workspace*.
-
-Updating Project Files
-======================
-
-As you pull and update the source tree, your Android Eclipse files may
-fall out of sync with the build configuration. The tree should still
-build fine from within Eclipse, but source files may be missing and in
-rare circumstances Eclipse's index may not have the proper build
-configuration.
-
-To account for this, you'll want to periodically regenerate the
-Android Eclipse project files. You can do this by running ``mach build
-&& mach package && mach build-backend -b AndroidEclipse`` from the
-command line. It's a good idea to refresh and clean build all projects
-in Eclipse after doing this.
-
-In future, we'd like to include an Android Eclipse run configuration
-or build target that integrates updating the project files.
-
-Currently, regeneration rewrites the original project files. **If
-you've made any customizations to the projects, they will likely get
-overwritten.** We would like to improve this user experience in the
-future.
-
-Troubleshooting
-===============
-
-If Eclipse's builder gets confused, you should always refresh and
-clean build all projects. If Eclipse's builder is continually
-confused, you can see a log of what is happening at
-``$OBJDIR/android_eclipse/build.log``.
-
-If you run into memory problems executing ``dex``, you should
-`Increase Eclipse's memory limits <http://stackoverflow.com/a/11093228>`_.
-
-The produced Android Eclipse project files are unfortunately not
-portable. Please don't move them around.
-
-Structure of Android Eclipse projects
-=====================================
-
-The Android Eclipse backend generates several projects spanning Fennec
-itself and its tests. You'll mostly interact with the *Fennec* project
-itself.
-
-In future, we'd like to expand this documentation to include some of
-the technical details of how the Eclipse integration works, and how to
-add additional Android Eclipse projects using the ``moz.build``
-system.
-
-Tested Versions
-===============
-
-===============    ====================================    =================
-OS                 Version                                 Working as of
-===============    ====================================    =================
-Mac OS X           Luna (Build id: 20130919-0819)          February 2014
-Mac OS X           Kepler (Build id: 20131219-0014)        February 2014
-Mac OS X 10.8.5    Kepler (Build id: 20130919-0819)        February 2014
-===============    ====================================    =================
--- a/build/docs/cppeclipse.rst
+++ b/build/docs/cppeclipse.rst
@@ -13,24 +13,24 @@ project files to aid with development.
 
 Please report bugs to bugzilla and make them depend on bug 973770.
 
 To generate a C++ Eclipse project files, you'll need to have a fully
 built tree::
 
    mach build
 
-Then, simply generate the Android Eclipse build backend::
+Then, simply generate the C++ Eclipse build backend::
 
    mach build-backend -b CppEclipse
 
 If all goes well, the path to the generated workspace should be
-printed (currently, ``$OBJDIR/android_eclipse``).
+printed.
 
-To use the generated Android Eclipse project files, you'll need to
+To use the generated C++ Eclipse project files, you'll need to
 have a Eclipse CDT 8.3 (We plan to follow the latest Eclipse release)
 `Eclipse CDT plugin
 <https://www.eclipse.org/cdt/>`_
 installed. You can then import all the projects into Eclipse using
 *File > Import ... > General > Existing Projects into Workspace*
 -only- if you have not ran the background indexer.
 
 Updating Project Files
@@ -38,17 +38,17 @@ Updating Project Files
 
 As you pull and update the source tree, your C++ Eclipse files may
 fall out of sync with the build configuration. The tree should still
 build fine from within Eclipse, but source files may be missing and in
 rare circumstances Eclipse's index may not have the proper build
 configuration.
 
 To account for this, you'll want to periodically regenerate the
-Android Eclipse project files. You can do this by running ``mach build
+C++ Eclipse project files. You can do this by running ``mach build
 && mach build-backend -b CppEclipse`` from the
 command line.
 
 Currently, regeneration rewrites the original project files. **If
 you've made any customizations to the projects, they will likely get
 overwritten.** We would like to improve this user experience in the
 future.
 
--- a/python/mozbuild/mozbuild/backend/__init__.py
+++ b/python/mozbuild/mozbuild/backend/__init__.py
@@ -1,14 +1,13 @@
 # This Source Code Form is subject to the terms of the Mozilla Public
 # License, v. 2.0. If a copy of the MPL was not distributed with this
 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
 
 backends = {
-    'AndroidEclipse': 'mozbuild.backend.android_eclipse',
     'ChromeMap': 'mozbuild.codecoverage.chrome_map',
     'CompileDB': 'mozbuild.compilation.database',
     'CppEclipse': 'mozbuild.backend.cpp_eclipse',
     'FasterMake': 'mozbuild.backend.fastermake',
     'FasterMake+RecursiveMake': None,
     'RecursiveMake': 'mozbuild.backend.recursivemake',
     'TestManifest': 'mozbuild.backend.test_manifest',
     'Tup': 'mozbuild.backend.tup',
deleted file mode 100644
--- a/python/mozbuild/mozbuild/backend/android_eclipse.py
+++ /dev/null
@@ -1,267 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import absolute_import, unicode_literals
-
-import itertools
-import os
-import time
-import types
-import xml.dom.minidom as minidom
-import xml.etree.ElementTree as ET
-
-from mozpack.copier import FileCopier
-from mozpack.files import (FileFinder, PreprocessedFile)
-from mozpack.manifests import InstallManifest
-import mozpack.path as mozpath
-
-from .common import CommonBackend
-from ..frontend.data import (
-    AndroidEclipseProjectData,
-    ContextDerived,
-    ContextWrapped,
-)
-from ..makeutil import Makefile
-from ..util import ensureParentDir
-from mozbuild.base import (
-    ExecutionSummary,
-    MachCommandConditions,
-)
-
-
-def pretty_print(element):
-    """Return a pretty-printed XML string for an Element.
-    """
-    s = ET.tostring(element, 'utf-8')
-    # minidom wraps element in a Document node; firstChild strips it.
-    return minidom.parseString(s).firstChild.toprettyxml(indent='  ')
-
-
-class AndroidEclipseBackend(CommonBackend):
-    """Backend that generates Android Eclipse project files.
-    """
-    def __init__(self, environment):
-        if not MachCommandConditions.is_android(environment):
-            raise Exception(
-                'The Android Eclipse backend is not available with this '
-                'configuration.')
-
-        super(AndroidEclipseBackend, self).__init__(environment)
-
-    def summary(self):
-        return ExecutionSummary(
-            'AndroidEclipse backend executed in {execution_time:.2f}s\n'
-            'Wrote {projects:d} Android Eclipse projects to {path:s}; '
-            '{created:d} created; {updated:d} updated',
-            execution_time=self._execution_time,
-            projects=self._created_count + self._updated_count,
-            path=mozpath.join(self.environment.topobjdir, 'android_eclipse'),
-            created=self._created_count,
-            updated=self._updated_count,
-        )
-
-    def consume_object(self, obj):
-        """Write out Android Eclipse project files."""
-
-        if not isinstance(obj, ContextDerived):
-            return False
-
-        if CommonBackend.consume_object(self, obj):
-            # If CommonBackend acknowledged the object, we're done with it.
-            return True
-
-        # Handle the one case we care about specially.
-        if isinstance(obj, ContextWrapped) and isinstance(obj.wrapped, AndroidEclipseProjectData):
-            self._process_android_eclipse_project_data(obj.wrapped, obj.srcdir, obj.objdir)
-
-        # We don't want to handle most things, so we just acknowledge all objects
-        return True
-
-    def consume_finished(self):
-        """The common backend handles WebIDL and test files. We don't handle
-        these, so we don't call our superclass.
-        """
-
-    def _Element_for_classpathentry(self, cpe):
-        """Turn a ClassPathEntry into an XML Element, like one of:
-        <classpathentry including="**/*.java" kind="src" path="preprocessed"/>
-        <classpathentry including="**/*.java" excluding="org/mozilla/gecko/Excluded.java|org/mozilla/gecko/SecondExcluded.java" kind="src" path="src"/>
-        <classpathentry including="**/*.java" kind="src" path="thirdparty">
-            <attributes>
-                <attribute name="ignore_optional_problems" value="true"/>
-            </attributes>
-        </classpathentry>
-        """
-        e = ET.Element('classpathentry')
-        e.set('kind', 'src')
-        e.set('including', '**/*.java')
-        e.set('path', cpe.path)
-        if cpe.exclude_patterns:
-            e.set('excluding', '|'.join(sorted(cpe.exclude_patterns)))
-        if cpe.ignore_warnings:
-            attrs = ET.SubElement(e, 'attributes')
-            attr = ET.SubElement(attrs, 'attribute')
-            attr.set('name', 'ignore_optional_problems')
-            attr.set('value', 'true')
-        return e
-
-    def _Element_for_referenced_project(self, name):
-        """Turn a referenced project name into an XML Element, like:
-        <classpathentry combineaccessrules="false" kind="src" path="/Fennec"/>
-        """
-        e = ET.Element('classpathentry')
-        e.set('kind', 'src')
-        e.set('combineaccessrules', 'false')
-         # All project directories are in the same root; this
-         # reference is absolute in the Eclipse namespace.
-        e.set('path', '/' + name)
-        return e
-
-    def _Element_for_extra_jar(self, name):
-        """Turn a referenced JAR name into an XML Element, like:
-        <classpathentry exported="true" kind="lib" path="/Users/nalexander/Mozilla/gecko-dev/build/mobile/robocop/robotium-solo-4.3.1.jar"/>
-        """
-        e = ET.Element('classpathentry')
-        e.set('kind', 'lib')
-        e.set('exported', 'true')
-        e.set('path', name)
-        return e
-
-    def _Element_for_filtered_resources(self, filtered_resources):
-        """Turn a list of filtered resource arguments like
-        ['1.0-projectRelativePath-matches-false-false-*org/mozilla/gecko/resources/**']
-        into an XML Element, like:
-        <filteredResources>
-          <filter>
-            <id>1393009101322</id>
-            <name></name>
-            <type>30</type>
-            <matcher>
-              <id>org.eclipse.ui.ide.multiFilter</id>
-              <arguments>1.0-projectRelativePath-matches-false-false-*org/mozilla/gecko/resources/**</arguments>
-            </matcher>
-          </filter>
-        </filteredResources>
-
-        The id is random; the values are magic."""
-
-        id = int(1000 * time.time())
-        filteredResources = ET.Element('filteredResources')
-        for arg in sorted(filtered_resources):
-            e = ET.SubElement(filteredResources, 'filter')
-            ET.SubElement(e, 'id').text = str(id)
-            id += 1
-            ET.SubElement(e, 'name')
-            ET.SubElement(e, 'type').text = '30' # It's magic!
-            matcher = ET.SubElement(e, 'matcher')
-            ET.SubElement(matcher, 'id').text = 'org.eclipse.ui.ide.multiFilter'
-            ET.SubElement(matcher, 'arguments').text = str(arg)
-        return filteredResources
-
-    def _manifest_for_project(self, srcdir, project):
-        manifest = InstallManifest()
-
-        if project.manifest:
-            manifest.add_copy(mozpath.join(srcdir, project.manifest), 'AndroidManifest.xml')
-
-        if project.res:
-            manifest.add_symlink(mozpath.join(srcdir, project.res), 'res')
-        else:
-            # Eclipse expects a res directory no matter what, so we
-            # make an empty directory if the project doesn't specify.
-            res = os.path.abspath(mozpath.join(os.path.dirname(__file__),
-                'templates', 'android_eclipse_empty_resource_directory'))
-            manifest.add_pattern_copy(res, '.**', 'res')
-
-        if project.assets:
-            manifest.add_symlink(mozpath.join(srcdir, project.assets), 'assets')
-
-        for cpe in project._classpathentries:
-            manifest.add_symlink(mozpath.join(srcdir, cpe.srcdir), cpe.dstdir)
-
-        # JARs and native libraries go in the same place. For now, we're adding
-        # class path entries with the full path to required JAR files (which
-        # makes sense for JARs in the source directory, but probably doesn't for
-        # JARs in the object directory). This could be a problem because we only
-        # know the contents of (a subdirectory of) libs/ after a successful
-        # build and package, which is after build-backend time. At the cost of
-        # some flexibility, we explicitly copy certain libraries here; if the
-        # libraries aren't present -- namely, when the tree hasn't been packaged
-        # -- this fails. That's by design, to avoid crashes on device caused by
-        # missing native libraries.
-        for src, dst in project.libs:
-            manifest.add_copy(mozpath.join(srcdir, src), dst)
-
-        return manifest
-
-    def _process_android_eclipse_project_data(self, data, srcdir, objdir):
-        # This can't be relative to the environment's topsrcdir,
-        # because during testing topsrcdir is faked.
-        template_directory = os.path.abspath(mozpath.join(os.path.dirname(__file__),
-            'templates', 'android_eclipse'))
-
-        project_directory = mozpath.join(self.environment.topobjdir, 'android_eclipse', data.name)
-        manifest_path = mozpath.join(self.environment.topobjdir, 'android_eclipse', '%s.manifest' % data.name)
-
-        manifest = self._manifest_for_project(srcdir, data)
-        ensureParentDir(manifest_path)
-        manifest.write(path=manifest_path)
-
-        classpathentries = []
-        for cpe in sorted(data._classpathentries, key=lambda x: x.path):
-            e = self._Element_for_classpathentry(cpe)
-            classpathentries.append(ET.tostring(e))
-
-        for name in sorted(data.referenced_projects):
-            e = self._Element_for_referenced_project(name)
-            classpathentries.append(ET.tostring(e))
-
-        for name in sorted(data.extra_jars):
-            e = self._Element_for_extra_jar(mozpath.join(srcdir, name))
-            classpathentries.append(ET.tostring(e))
-
-        defines = {}
-        defines['IDE_OBJDIR'] = objdir
-        defines['IDE_TOPOBJDIR'] = self.environment.topobjdir
-        defines['IDE_SRCDIR'] = srcdir
-        defines['IDE_TOPSRCDIR'] = self.environment.topsrcdir
-        defines['IDE_PROJECT_NAME'] = data.name
-        defines['IDE_PACKAGE_NAME'] = data.package_name
-        defines['IDE_PROJECT_DIRECTORY'] = project_directory
-        defines['IDE_RELSRCDIR'] = mozpath.relpath(srcdir, self.environment.topsrcdir)
-        defines['IDE_CLASSPATH_ENTRIES'] = '\n'.join('\t' + cpe for cpe in classpathentries)
-        defines['IDE_RECURSIVE_MAKE_TARGETS'] = ' '.join(sorted(data.recursive_make_targets))
-        # Like android.library=true
-        defines['IDE_PROJECT_LIBRARY_SETTING'] = 'android.library=true' if data.is_library else ''
-        # Like android.library.reference.1=FennecBrandingResources
-        defines['IDE_PROJECT_LIBRARY_REFERENCES'] = '\n'.join(
-            'android.library.reference.%s=%s' % (i + 1, ref)
-            for i, ref in enumerate(sorted(data.included_projects)))
-        if data.filtered_resources:
-            filteredResources = self._Element_for_filtered_resources(data.filtered_resources)
-            defines['IDE_PROJECT_FILTERED_RESOURCES'] = pretty_print(filteredResources).strip()
-        else:
-            defines['IDE_PROJECT_FILTERED_RESOURCES'] = ''
-        defines['ANDROID_TARGET_SDK'] = self.environment.substs['ANDROID_TARGET_SDK']
-        defines['MOZ_ANDROID_MIN_SDK_VERSION'] = self.environment.defines['MOZ_ANDROID_MIN_SDK_VERSION']
-
-        copier = FileCopier()
-        finder = FileFinder(template_directory)
-        for input_filename, f in itertools.chain(finder.find('**'), finder.find('.**')):
-            if input_filename == 'AndroidManifest.xml' and not data.is_library:
-                # Main projects supply their own manifests.
-                continue
-            copier.add(input_filename, PreprocessedFile(
-                mozpath.join(finder.base, input_filename),
-                depfile_path=None,
-                marker='#',
-                defines=defines,
-                extra_depends={mozpath.join(finder.base, input_filename)}))
-
-        # When we re-create the build backend, we kill everything that was there.
-        if os.path.isdir(project_directory):
-            self._updated_count += 1
-        else:
-            self._created_count += 1
-        copier.copy(project_directory, skip_if_older=False, remove_unaccounted=True)
--- a/python/mozbuild/mozbuild/backend/mach_commands.py
+++ b/python/mozbuild/mozbuild/backend/mach_commands.py
@@ -19,114 +19,52 @@ from mach.decorators import (
     CommandProvider,
     Command,
 )
 
 @CommandProvider
 class MachCommands(MachCommandBase):
     @Command('ide', category='devenv',
         description='Generate a project and launch an IDE.')
-    @CommandArgument('ide', choices=['eclipse', 'visualstudio', 'androidstudio', 'intellij'])
+    @CommandArgument('ide', choices=['eclipse', 'visualstudio'])
     @CommandArgument('args', nargs=argparse.REMAINDER)
     def eclipse(self, ide, args):
         if ide == 'eclipse':
             backend = 'CppEclipse'
         elif ide == 'visualstudio':
             backend = 'VisualStudio'
-        elif ide == 'androidstudio' or ide == 'intellij':
-            # The build backend for Android Studio and IntelliJ is just the regular one.
-            backend = 'RecursiveMake'
 
         if ide == 'eclipse':
             try:
                 which.which('eclipse')
             except which.WhichError:
                 print('Eclipse CDT 8.4 or later must be installed in your PATH.')
                 print('Download: http://www.eclipse.org/cdt/downloads.php')
                 return 1
-        elif ide == 'androidstudio' or ide =='intellij':
-            studio = ['studio'] if ide == 'androidstudio' else ['idea']
-            if sys.platform != 'darwin':
-                try:
-                    which.which(studio[0])
-                except:
-                    self.print_ide_error(ide)
-                    return 1
-            else:
-                # In order of preference!
-                for d in self.get_mac_ide_preferences(ide):
-                    if os.path.isdir(d):
-                        studio = ['open', '-a', d]
-                        break
-                else:
-                    print('Android Studio or IntelliJ IDEA 14 is not installed in /Applications.')
-                    return 1
 
         # Here we refresh the whole build. 'build export' is sufficient here and is probably more
         # correct but it's also nice having a single target to get a fully built and indexed
         # project (gives a easy target to use before go out to lunch).
         res = self._mach_context.commands.dispatch('build', self._mach_context)
         if res != 0:
             return 1
 
-        if ide in ('androidstudio', 'intellij'):
-            res = self._mach_context.commands.dispatch('package', self._mach_context)
-            if res != 0:
-                return 1
-        else:
-            # Generate or refresh the IDE backend.
-            python = self.virtualenv_manager.python_path
-            config_status = os.path.join(self.topobjdir, 'config.status')
-            args = [python, config_status, '--backend=%s' % backend]
-            res = self._run_command_in_objdir(args=args, pass_thru=True, ensure_exit_code=False)
-            if res != 0:
-                return 1
-
+        # Generate or refresh the IDE backend.
+        python = self.virtualenv_manager.python_path
+        config_status = os.path.join(self.topobjdir, 'config.status')
+        args = [python, config_status, '--backend=%s' % backend]
+        res = self._run_command_in_objdir(args=args, pass_thru=True, ensure_exit_code=False)
+        if res != 0:
+            return 1
 
         if ide == 'eclipse':
             eclipse_workspace_dir = self.get_eclipse_workspace_path()
             process = subprocess.check_call(['eclipse', '-data', eclipse_workspace_dir])
         elif ide == 'visualstudio':
             visual_studio_workspace_dir = self.get_visualstudio_workspace_path()
             process = subprocess.check_call(['explorer.exe', visual_studio_workspace_dir])
-        elif ide == 'androidstudio' or ide == 'intellij':
-            gradle_dir = None
-            if self.is_gradle_project_already_imported():
-                gradle_dir = self.get_gradle_project_path()
-            else:
-                gradle_dir = self.get_gradle_import_path()
-            process = subprocess.check_call(studio + [gradle_dir])
 
     def get_eclipse_workspace_path(self):
         from mozbuild.backend.cpp_eclipse import CppEclipseBackend
         return CppEclipseBackend.get_workspace_path(self.topsrcdir, self.topobjdir)
 
     def get_visualstudio_workspace_path(self):
         return os.path.join(self.topobjdir, 'msvc', 'mozilla.sln')
-
-    def get_gradle_project_path(self):
-        return os.path.join(self.topobjdir, 'mobile', 'android', 'gradle')
-
-    def get_gradle_import_path(self):
-        return os.path.join(self.get_gradle_project_path(), 'build.gradle')
-
-    def is_gradle_project_already_imported(self):
-        gradle_project_path = os.path.join(self.get_gradle_project_path(), '.idea')
-        return os.path.exists(gradle_project_path)
-
-    def get_mac_ide_preferences(self, ide):
-        if sys.platform == 'darwin':
-            if ide == 'androidstudio':
-                return ['/Applications/Android Studio.app']
-            else:
-                return [
-                    '/Applications/IntelliJ IDEA 14 EAP.app',
-                    '/Applications/IntelliJ IDEA 14.app',
-                    '/Applications/IntelliJ IDEA 14 CE EAP.app',
-                    '/Applications/IntelliJ IDEA 14 CE.app']
-
-    def print_ide_error(self, ide):
-        if ide == 'androidstudio':
-            print('Android Studio is not installed in your PATH.')
-            print('You can generate a command-line launcher from Android Studio->Tools->Create Command-line launcher with script name \'studio\'')
-        elif ide == 'intellij':
-            print('IntelliJ is not installed in your PATH.')
-            print('You can generate a command-line launcher from IntelliJ IDEA->Tools->Create Command-line launcher with script name \'idea\'')
--- a/python/mozbuild/mozbuild/backend/recursivemake.py
+++ b/python/mozbuild/mozbuild/backend/recursivemake.py
@@ -28,17 +28,16 @@ from mozbuild.frontend.context import (
     ObjDirPath,
 )
 from .common import CommonBackend
 from ..frontend.data import (
     AndroidAssetsDirs,
     AndroidResDirs,
     AndroidExtraResDirs,
     AndroidExtraPackages,
-    AndroidEclipseProjectData,
     BaseLibrary,
     BaseProgram,
     ChromeManifestEntry,
     ConfigFileSubstitution,
     ContextDerived,
     ContextWrapped,
     Defines,
     DirectoryTraversal,
@@ -596,18 +595,16 @@ class RecursiveMakeBackend(CommonBackend
         elif isinstance(obj, ContextWrapped):
             # Process a rich build system object from the front-end
             # as-is.  Please follow precedent and handle CamelCaseData
             # in a function named _process_camel_case_data.  At some
             # point in the future, this unwrapping process may be
             # automated.
             if isinstance(obj.wrapped, JavaJarData):
                 self._process_java_jar_data(obj.wrapped, backend_file)
-            elif isinstance(obj.wrapped, AndroidEclipseProjectData):
-                self._process_android_eclipse_project_data(obj.wrapped, backend_file)
             else:
                 return False
 
         elif isinstance(obj, RustLibrary):
             self.backend_input_files.add(obj.cargo_file)
             self._process_rust_library(obj, backend_file)
             # No need to call _process_linked_libraries, because Rust
             # libraries are self-contained objects at this point.
@@ -1202,38 +1199,16 @@ class RecursiveMakeBackend(CommonBackend
                 (target, ' '.join(jar.generated_sources)))
         if jar.extra_jars:
             backend_file.write('%s_EXTRA_JARS := %s\n' %
                 (target, ' '.join(sorted(set(jar.extra_jars)))))
         if jar.javac_flags:
             backend_file.write('%s_JAVAC_FLAGS := %s\n' %
                 (target, ' '.join(jar.javac_flags)))
 
-    def _process_android_eclipse_project_data(self, project, backend_file):
-        # We add a single target to the backend.mk corresponding to
-        # the moz.build defining the Android Eclipse project. This
-        # target depends on some targets to be fresh, and installs a
-        # manifest generated by the Android Eclipse build backend. The
-        # manifests for all projects live in $TOPOBJDIR/android_eclipse
-        # and are installed into subdirectories thereof.
-
-        project_directory = mozpath.join(self.environment.topobjdir, 'android_eclipse', project.name)
-        manifest_path = mozpath.join(self.environment.topobjdir, 'android_eclipse', '%s.manifest' % project.name)
-
-        fragment = Makefile()
-        rule = fragment.create_rule(targets=['ANDROID_ECLIPSE_PROJECT_%s' % project.name])
-        rule.add_dependencies(project.recursive_make_targets)
-        args = ['--no-remove',
-            '--no-remove-all-directory-symlinks',
-            '--no-remove-empty-directories',
-            project_directory,
-            manifest_path]
-        rule.add_commands(['$(call py_action,process_install_manifest,%s)' % ' '.join(args)])
-        fragment.dump(backend_file.fh, removal_guard=False)
-
     def _process_shared_library(self, libdef, backend_file):
         backend_file.write_once('LIBRARY_NAME := %s\n' % libdef.basename)
         backend_file.write('FORCE_SHARED_LIB := 1\n')
         backend_file.write('IMPORT_LIBRARY := %s\n' % libdef.import_name)
         backend_file.write('SHARED_LIBRARY := %s\n' % libdef.lib_name)
         if libdef.variant == libdef.COMPONENT:
             backend_file.write('IS_COMPONENT := 1\n')
         if libdef.soname:
deleted file mode 100644
--- a/python/mozbuild/mozbuild/backend/templates/android_eclipse/.classpath
+++ /dev/null
@@ -1,10 +0,0 @@
-#filter substitution
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="gen"/>
-	<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.ANDROID_FRAMEWORK"/>
-	<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.LIBRARIES"/>
-	<classpathentry exported="true" kind="con" path="com.android.ide.eclipse.adt.DEPENDENCIES"/>
-	<classpathentry kind="output" path="bin/classes"/>
-@IDE_CLASSPATH_ENTRIES@
-</classpath>
deleted file mode 100644
--- a/python/mozbuild/mozbuild/backend/templates/android_eclipse/.externalToolBuilders/com.android.ide.eclipse.adt.ApkBuilder.launch
+++ /dev/null
@@ -1,8 +0,0 @@
-#filter substitution
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
-<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="false"/>
-<stringAttribute key="org.eclipse.ui.externaltools.ATTR_DISABLED_BUILDER" value="com.android.ide.eclipse.adt.ApkBuilder"/>
-<mapAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS"/>
-<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
-</launchConfiguration>
deleted file mode 100644
--- a/python/mozbuild/mozbuild/backend/templates/android_eclipse/.externalToolBuilders/com.android.ide.eclipse.adt.PreCompilerBuilder.launch
+++ /dev/null
@@ -1,8 +0,0 @@
-#filter substitution
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
-<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="false"/>
-<stringAttribute key="org.eclipse.ui.externaltools.ATTR_DISABLED_BUILDER" value="com.android.ide.eclipse.adt.PreCompilerBuilder"/>
-<mapAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS"/>
-<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
-</launchConfiguration>
deleted file mode 100644
--- a/python/mozbuild/mozbuild/backend/templates/android_eclipse/.externalToolBuilders/com.android.ide.eclipse.adt.ResourceManagerBuilder.launch
+++ /dev/null
@@ -1,8 +0,0 @@
-#filter substitution
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
-<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="false"/>
-<stringAttribute key="org.eclipse.ui.externaltools.ATTR_DISABLED_BUILDER" value="com.android.ide.eclipse.adt.ResourceManagerBuilder"/>
-<mapAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS"/>
-<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
-</launchConfiguration>
deleted file mode 100644
--- a/python/mozbuild/mozbuild/backend/templates/android_eclipse/.externalToolBuilders/org.eclipse.jdt.core.javabuilder.launch
+++ /dev/null
@@ -1,8 +0,0 @@
-#filter substitution
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.ant.AntBuilderLaunchConfigurationType">
-<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_BUILDER_ENABLED" value="true"/>
-<stringAttribute key="org.eclipse.ui.externaltools.ATTR_DISABLED_BUILDER" value="org.eclipse.jdt.core.javabuilder"/>
-<mapAttribute key="org.eclipse.ui.externaltools.ATTR_TOOL_ARGUMENTS"/>
-<booleanAttribute key="org.eclipse.ui.externaltools.ATTR_TRIGGERS_CONFIGURED" value="true"/>
-</launchConfiguration>
deleted file mode 100644
--- a/python/mozbuild/mozbuild/backend/templates/android_eclipse/.project
+++ /dev/null
@@ -1,48 +0,0 @@
-#filter substitution
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>@IDE_PROJECT_NAME@</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.mozilla.ide.eclipse.fennec.FennecMakeBuilder</name>
-			<arguments>
-				<dictionary>
-					<key>command</key>
-					<value>@IDE_TOPSRCDIR@/mach build @IDE_OBJDIR@/ANDROID_ECLIPSE_PROJECT_@IDE_PROJECT_NAME@</value>
-				</dictionary>
-				<dictionary>
-					<key>workingDirectory</key>
-					<value>@IDE_TOPOBJDIR@</value>
-				</dictionary>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ResourceManagerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.PreCompilerBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>com.android.ide.eclipse.adt.ApkBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>com.android.ide.eclipse.adt.AndroidNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-	</natures>
-@IDE_PROJECT_FILTERED_RESOURCES@
-</projectDescription>
deleted file mode 100644
--- a/python/mozbuild/mozbuild/backend/templates/android_eclipse/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,292 +0,0 @@
-#filter substitution
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.7
-org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
-org.eclipse.jdt.core.compiler.compliance=1.7
-org.eclipse.jdt.core.compiler.debug.lineNumber=generate
-org.eclipse.jdt.core.compiler.debug.localVariable=generate
-org.eclipse.jdt.core.compiler.debug.sourceFile=generate
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.7
-org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_arguments_in_qualified_allocation_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_assignment=0
-org.eclipse.jdt.core.formatter.alignment_for_binary_expression=16
-org.eclipse.jdt.core.formatter.alignment_for_compact_if=16
-org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
-org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
-org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
-org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
-org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
-org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
-org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
-org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
-org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_after_package=1
-org.eclipse.jdt.core.formatter.blank_lines_before_field=0
-org.eclipse.jdt.core.formatter.blank_lines_before_first_class_body_declaration=0
-org.eclipse.jdt.core.formatter.blank_lines_before_imports=1
-org.eclipse.jdt.core.formatter.blank_lines_before_member_type=1
-org.eclipse.jdt.core.formatter.blank_lines_before_method=1
-org.eclipse.jdt.core.formatter.blank_lines_before_new_chunk=1
-org.eclipse.jdt.core.formatter.blank_lines_before_package=0
-org.eclipse.jdt.core.formatter.blank_lines_between_import_groups=1
-org.eclipse.jdt.core.formatter.blank_lines_between_type_declarations=1
-org.eclipse.jdt.core.formatter.brace_position_for_annotation_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_anonymous_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_array_initializer=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_block_in_case=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
-org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
-org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
-org.eclipse.jdt.core.formatter.comment.format_block_comments=true
-org.eclipse.jdt.core.formatter.comment.format_header=false
-org.eclipse.jdt.core.formatter.comment.format_html=true
-org.eclipse.jdt.core.formatter.comment.format_javadoc_comments=true
-org.eclipse.jdt.core.formatter.comment.format_line_comments=true
-org.eclipse.jdt.core.formatter.comment.format_source_code=true
-org.eclipse.jdt.core.formatter.comment.indent_parameter_description=true
-org.eclipse.jdt.core.formatter.comment.indent_root_tags=true
-org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
-org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=insert
-org.eclipse.jdt.core.formatter.comment.line_length=80
-org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
-org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
-org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
-org.eclipse.jdt.core.formatter.compact_else_if=true
-org.eclipse.jdt.core.formatter.continuation_indentation=2
-org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
-org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
-org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
-org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
-org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
-org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_type_header=true
-org.eclipse.jdt.core.formatter.indent_breaks_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_empty_lines=false
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_block=true
-org.eclipse.jdt.core.formatter.indent_statements_compare_to_body=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
-org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=false
-org.eclipse.jdt.core.formatter.indentation.size=4
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_else_in_if_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_finally_in_try_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_before_while_in_do_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_annotation_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_block=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_method_body=insert
-org.eclipse.jdt.core.formatter.insert_new_line_in_empty_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_after_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_after_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_at_in_annotation_type_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_angle_bracket_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_after_closing_paren_in_cast=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_case=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_colon_in_labeled_statement=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_allocation_expression=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_annotation=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_constructor_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_constant_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_enum_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_explicitconstructorcall_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_increments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_for_inits=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_declaration_throws=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_method_invocation_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_field_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_multiple_local_declarations=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_parameterized_type_reference=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_superinterfaces=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
-org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
-org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
-org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
-org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_at_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_binary_operator=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_cast=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_catch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_if=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_default=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_colon_in_labeled_statement=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_constructor_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_constant_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_enum_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_explicitconstructorcall_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_increments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_for_inits=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_declaration_throws=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_method_invocation_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_field_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_multiple_local_declarations=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_superinterfaces=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_annotation_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_anonymous_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_array_initializer=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_block=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_constructor_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_constant=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_enum_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_method_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_brace_in_type_declaration=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_bracket_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_catch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_for=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_if=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
-org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
-org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
-org.eclipse.jdt.core.formatter.insert_space_before_postfix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_prefix_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_conditional=insert
-org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
-org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_brackets_in_array_allocation_expression=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_annotation_type_member_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_constructor_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
-org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
-org.eclipse.jdt.core.formatter.join_lines_in_comments=true
-org.eclipse.jdt.core.formatter.join_wrapped_lines=true
-org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
-org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
-org.eclipse.jdt.core.formatter.lineSplit=80
-org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
-org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
-org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
-org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=true
-org.eclipse.jdt.core.formatter.tabulation.char=space
-org.eclipse.jdt.core.formatter.tabulation.size=4
-org.eclipse.jdt.core.formatter.use_on_off_tags=false
-org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
-org.eclipse.jdt.core.formatter.wrap_before_binary_operator=false
-org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=false
-org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
deleted file mode 100644
--- a/python/mozbuild/mozbuild/backend/templates/android_eclipse/.settings/org.eclipse.jdt.ui.prefs
+++ /dev/null
@@ -1,57 +0,0 @@
-#filter substitution
-cleanup.add_default_serial_version_id=true
-cleanup.add_generated_serial_version_id=false
-cleanup.add_missing_annotations=true
-cleanup.add_missing_deprecated_annotations=true
-cleanup.add_missing_methods=false
-cleanup.add_missing_nls_tags=false
-cleanup.add_missing_override_annotations=true
-cleanup.add_missing_override_annotations_interface_methods=true
-cleanup.add_serial_version_id=false
-cleanup.always_use_blocks=true
-cleanup.always_use_parentheses_in_expressions=false
-cleanup.always_use_this_for_non_static_field_access=false
-cleanup.always_use_this_for_non_static_method_access=false
-cleanup.convert_to_enhanced_for_loop=false
-cleanup.correct_indentation=false
-cleanup.format_source_code=false
-cleanup.format_source_code_changes_only=false
-cleanup.make_local_variable_final=true
-cleanup.make_parameters_final=false
-cleanup.make_private_fields_final=true
-cleanup.make_type_abstract_if_missing_method=false
-cleanup.make_variable_declarations_final=false
-cleanup.never_use_blocks=false
-cleanup.never_use_parentheses_in_expressions=true
-cleanup.organize_imports=true
-cleanup.qualify_static_field_accesses_with_declaring_class=false
-cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
-cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
-cleanup.qualify_static_member_accesses_with_declaring_class=false
-cleanup.qualify_static_method_accesses_with_declaring_class=false
-cleanup.remove_private_constructors=true
-cleanup.remove_trailing_whitespaces=true
-cleanup.remove_trailing_whitespaces_all=true
-cleanup.remove_trailing_whitespaces_ignore_empty=false
-cleanup.remove_unnecessary_casts=true
-cleanup.remove_unnecessary_nls_tags=true
-cleanup.remove_unused_imports=true
-cleanup.remove_unused_local_variables=false
-cleanup.remove_unused_private_fields=true
-cleanup.remove_unused_private_members=false
-cleanup.remove_unused_private_methods=true
-cleanup.remove_unused_private_types=true
-cleanup.sort_members=false
-cleanup.sort_members_all=false
-cleanup.use_blocks=false
-cleanup.use_blocks_only_for_return_and_throw=false
-cleanup.use_parentheses_in_expressions=false
-cleanup.use_this_for_non_static_field_access=false
-cleanup.use_this_for_non_static_field_access_only_if_necessary=true
-cleanup.use_this_for_non_static_method_access=false
-cleanup.use_this_for_non_static_method_access_only_if_necessary=true
-cleanup_profile=_Fennec
-cleanup_settings_version=2
-eclipse.preferences.version=1
-formatter_profile=_Fennec
-formatter_settings_version=12
deleted file mode 100644
--- a/python/mozbuild/mozbuild/backend/templates/android_eclipse/AndroidManifest.xml
+++ /dev/null
@@ -1,11 +0,0 @@
-#filter substitution
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-    package="@IDE_PACKAGE_NAME@"
-    android:versionCode="1"
-    android:versionName="1.0" >
-
-    <uses-sdk
-        android:minSdkVersion="@MOZ_ANDROID_MIN_SDK_VERSION@"
-        android:targetSdkVersion="@ANDROID_TARGET_SDK@" />
-
-</manifest>
deleted file mode 100644
--- a/python/mozbuild/mozbuild/backend/templates/android_eclipse/gen/tmp
+++ /dev/null
@@ -1,1 +0,0 @@
-#filter substitution
deleted file mode 100644
--- a/python/mozbuild/mozbuild/backend/templates/android_eclipse/lint.xml
+++ /dev/null
@@ -1,5 +0,0 @@
-#filter substitution
-<?xml version="1.0" encoding="UTF-8"?>
-<lint>
-    <issue id="NewApi" severity="ignore" />
-</lint>
deleted file mode 100644
--- a/python/mozbuild/mozbuild/backend/templates/android_eclipse/project.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-#filter substitution
-# This file is automatically generated by Android Tools.
-# Do not modify this file -- YOUR CHANGES WILL BE ERASED!
-#
-# This file must be checked in Version Control Systems.
-#
-# To customize properties used by the Ant build system edit
-# "ant.properties", and override values to adapt the script to your
-# project structure.
-
-# Project target.
-target=android-L
-@IDE_PROJECT_LIBRARY_SETTING@
-@IDE_PROJECT_LIBRARY_REFERENCES@
--- a/python/mozbuild/mozbuild/config_status.py
+++ b/python/mozbuild/mozbuild/config_status.py
@@ -174,12 +174,11 @@ def config_status(topobjdir='.', topsrcd
         for the_backend in selected_backends:
             for path, diff in sorted(the_backend.file_diffs.items()):
                 print('\n'.join(diff))
 
     # Advertise Visual Studio if appropriate.
     if os.name == 'nt' and 'VisualStudio' not in options.backend:
         print(VISUAL_STUDIO_ADVERTISEMENT)
 
-    # Advertise Eclipse if it is appropriate.
+    # Advertise Android Studio if it is appropriate.
     if MachCommandConditions.is_android(env):
-        if 'AndroidEclipse' not in options.backend:
-            print(ANDROID_IDE_ADVERTISEMENT)
+        print(ANDROID_IDE_ADVERTISEMENT)
--- a/python/mozbuild/mozbuild/frontend/context.py
+++ b/python/mozbuild/mozbuild/frontend/context.py
@@ -921,23 +921,16 @@ VARIABLES = {
     'ANDROID_ASSETS_DIRS': (ContextDerivedTypedListWithItems(Path, List), list,
         """Android assets directories.
 
         This variable contains a list of directories containing static
         files to package into an 'assets' directory and merge into an
         APK file.
         """),
 
-    'ANDROID_ECLIPSE_PROJECT_TARGETS': (dict, dict,
-        """Defines Android Eclipse project targets.
-
-        This variable should not be populated directly. Instead, it should
-        populated by calling add_android_eclipse{_library}_project().
-        """),
-
     'SOURCES': (ContextDerivedTypedListWithItems(Path, StrictOrderingOnAppendListWithFlagsFactory({'no_pgo': bool, 'flags': List})), list,
         """Source code files.
 
         This variable contains a list of source code files to compile.
         Accepts assembler, C, C++, Objective C/C++.
         """),
 
     'FILES_PER_UNIFIED_FILE': (int, int,
@@ -1905,45 +1898,16 @@ FUNCTIONS = {
 
         The parameters are:
         * dest - target name, without the trailing .jar. (required)
 
         This returns a rich Java JAR type, described at
         :py:class:`mozbuild.frontend.data.JavaJarData`.
         """),
 
-    'add_android_eclipse_project': (
-        lambda self: self._add_android_eclipse_project, (str, str),
-        """Declare an Android Eclipse project.
-
-        This is one of the supported ways to populate the
-        ANDROID_ECLIPSE_PROJECT_TARGETS variable.
-
-        The parameters are:
-        * name - project name.
-        * manifest - path to AndroidManifest.xml.
-
-        This returns a rich Android Eclipse project type, described at
-        :py:class:`mozbuild.frontend.data.AndroidEclipseProjectData`.
-        """),
-
-    'add_android_eclipse_library_project': (
-        lambda self: self._add_android_eclipse_library_project, (str,),
-        """Declare an Android Eclipse library project.
-
-        This is one of the supported ways to populate the
-        ANDROID_ECLIPSE_PROJECT_TARGETS variable.
-
-        The parameters are:
-        * name - project name.
-
-        This returns a rich Android Eclipse project type, described at
-        :py:class:`mozbuild.frontend.data.AndroidEclipseProjectData`.
-        """),
-
     'export': (lambda self: self._export, (str,),
         """Make the specified variable available to all child directories.
 
         The variable specified by the argument string is added to the
         environment of all directories specified in the DIRS and TEST_DIRS
         variables. If those directories themselves have child directories,
         the variable will be exported to all of them.
 
--- a/python/mozbuild/mozbuild/frontend/data.py
+++ b/python/mozbuild/mozbuild/frontend/data.py
@@ -1008,128 +1008,69 @@ class GeneratedFile(ContextDerived):
         ContextDerived.__init__(self, context)
         self.script = script
         self.method = method
         self.outputs = outputs if isinstance(outputs, tuple) else (outputs,)
         self.inputs = inputs
         self.flags = flags
 
 
-class ClassPathEntry(object):
-    """Represents a classpathentry in an Android Eclipse project."""
-
-    __slots__ = (
-        'dstdir',
-        'srcdir',
-        'path',
-        'exclude_patterns',
-        'ignore_warnings',
-    )
-
-    def __init__(self):
-        self.dstdir = None
-        self.srcdir = None
-        self.path = None
-        self.exclude_patterns = []
-        self.ignore_warnings = False
-
-
-class AndroidEclipseProjectData(object):
-    """Represents an Android Eclipse project."""
-
-    __slots__ = (
-        'name',
-        'package_name',
-        'is_library',
-        'res',
-        'assets',
-        'libs',
-        'manifest',
-        'recursive_make_targets',
-        'extra_jars',
-        'included_projects',
-        'referenced_projects',
-        '_classpathentries',
-        'filtered_resources',
-    )
-
-    def __init__(self, name):
-        self.name = name
-        self.is_library = False
-        self.manifest = None
-        self.res = None
-        self.assets = None
-        self.libs = []
-        self.recursive_make_targets = []
-        self.extra_jars = []
-        self.included_projects = []
-        self.referenced_projects = []
-        self._classpathentries = []
-        self.filtered_resources = []
-
-    def add_classpathentry(self, path, srcdir, dstdir, exclude_patterns=[], ignore_warnings=False):
-        cpe = ClassPathEntry()
-        cpe.srcdir = srcdir
-        cpe.dstdir = dstdir
-        cpe.path = path
-        cpe.exclude_patterns = list(exclude_patterns)
-        cpe.ignore_warnings = ignore_warnings
-        self._classpathentries.append(cpe)
-        return cpe
-
-
 class AndroidResDirs(ContextDerived):
     """Represents Android resource directories."""
 
     __slots__ = (
         'paths',
     )
 
     def __init__(self, context, paths):
         ContextDerived.__init__(self, context)
         self.paths = paths
 
+
 class AndroidAssetsDirs(ContextDerived):
     """Represents Android assets directories."""
 
     __slots__ = (
         'paths',
     )
 
     def __init__(self, context, paths):
         ContextDerived.__init__(self, context)
         self.paths = paths
 
+
 class AndroidExtraResDirs(ContextDerived):
     """Represents Android extra resource directories.
 
     Extra resources are resources provided by libraries and including in a
     packaged APK, but not otherwise redistributed.  In practice, this means
     resources included in Fennec but not in GeckoView.
     """
 
     __slots__ = (
         'paths',
     )
 
     def __init__(self, context, paths):
         ContextDerived.__init__(self, context)
         self.paths = paths
 
+
 class AndroidExtraPackages(ContextDerived):
     """Represents Android extra packages."""
 
     __slots__ = (
         'packages',
     )
 
     def __init__(self, context, packages):
         ContextDerived.__init__(self, context)
         self.packages = packages
 
+
 class ChromeManifestEntry(ContextDerived):
     """Represents a chrome.manifest entry."""
 
     __slots__ = (
         'path',
         'entry',
     )
 
--- a/python/mozbuild/mozbuild/frontend/emitter.py
+++ b/python/mozbuild/mozbuild/frontend/emitter.py
@@ -1120,19 +1120,16 @@ class TreeMetadataEmitter(LoggingMixin):
             yield obj
 
         for obj in self._process_jar_manifests(context):
             yield obj
 
         for name, jar in context.get('JAVA_JAR_TARGETS', {}).items():
             yield ContextWrapped(context, jar)
 
-        for name, data in context.get('ANDROID_ECLIPSE_PROJECT_TARGETS', {}).items():
-            yield ContextWrapped(context, data)
-
         if context.get('USE_YASM') is True:
             yasm = context.config.substs.get('YASM')
             if not yasm:
                 raise SandboxValidationError('yasm is not available', context)
             passthru.variables['AS'] = yasm
             passthru.variables['ASFLAGS'] = context.config.substs.get('YASM_ASFLAGS')
             passthru.variables['AS_DASH_C_FLAG'] = ''
 
--- a/python/mozbuild/mozbuild/frontend/reader.py
+++ b/python/mozbuild/mozbuild/frontend/reader.py
@@ -49,17 +49,16 @@ from mozbuild.testing import (
 )
 
 from mozbuild.backend.configenvironment import ConfigEnvironment
 
 from mozpack.files import FileFinder
 import mozpack.path as mozpath
 
 from .data import (
-    AndroidEclipseProjectData,
     JavaJarData,
 )
 
 from .sandbox import (
     default_finder,
     SandboxError,
     SandboxExecutionError,
     SandboxLoadError,
@@ -263,44 +262,16 @@ class MozbuildSandbox(Sandbox):
 
         if name in self['JAVA_JAR_TARGETS']:
             raise Exception('Java JAR has already been registered: %s' % name)
 
         jar = JavaJarData(name)
         self['JAVA_JAR_TARGETS'][name] = jar
         return jar
 
-    # Not exposed to the sandbox.
-    def add_android_eclipse_project_helper(self, name):
-        """Add an Android Eclipse project target."""
-        if not name:
-            raise Exception('Android Eclipse project cannot be registered without a name')
-
-        if name in self['ANDROID_ECLIPSE_PROJECT_TARGETS']:
-            raise Exception('Android Eclipse project has already been registered: %s' % name)
-
-        data = AndroidEclipseProjectData(name)
-        self['ANDROID_ECLIPSE_PROJECT_TARGETS'][name] = data
-        return data
-
-    def _add_android_eclipse_project(self, name, manifest):
-        if not manifest:
-            raise Exception('Android Eclipse project must specify a manifest')
-
-        data = self.add_android_eclipse_project_helper(name)
-        data.manifest = manifest
-        data.is_library = False
-        return data
-
-    def _add_android_eclipse_library_project(self, name):
-        data = self.add_android_eclipse_project_helper(name)
-        data.manifest = None
-        data.is_library = True
-        return data
-
     def _export(self, varname):
         """Export the variable to all subdirectories of the current path."""
 
         exports = self.metadata.setdefault('exports', dict())
         if varname in exports:
             raise Exception('Variable has already been exported: %s' % varname)
 
         try:
--- a/python/mozbuild/mozbuild/test/backend/common.py
+++ b/python/mozbuild/mozbuild/test/backend/common.py
@@ -28,26 +28,16 @@ test_data_path = mozpath.abspath(mozpath
 test_data_path = mozpath.join(test_data_path, 'data')
 
 
 CONFIGS = defaultdict(lambda: {
     'defines': {},
     'non_global_defines': [],
     'substs': {'OS_TARGET': 'WINNT'},
 }, {
-    'android_eclipse': {
-        'defines': {
-            'MOZ_ANDROID_MIN_SDK_VERSION': '15',
-        },
-        'non_global_defines': [],
-        'substs': {
-            'ANDROID_TARGET_SDK': '16',
-            'MOZ_WIDGET_TOOLKIT': 'android',
-        },
-    },
     'binary-components': {
         'defines': {},
         'non_global_defines': [],
         'substs': {
             'LIB_PREFIX': 'lib',
             'RUST_LIB_PREFIX': 'lib',
             'LIB_SUFFIX': 'a',
             'RUST_LIB_SUFFIX': 'a',
deleted file mode 100644
--- a/python/mozbuild/mozbuild/test/backend/data/android_eclipse/library1/resources/values/strings.xml
+++ /dev/null
@@ -1,1 +0,0 @@
-<string name="label">library1</string>
deleted file mode 100644
--- a/python/mozbuild/mozbuild/test/backend/data/android_eclipse/main1/AndroidManifest.xml
+++ /dev/null
@@ -1,1 +0,0 @@
-<!-- Placeholder. -->
deleted file mode 100644
--- a/python/mozbuild/mozbuild/test/backend/data/android_eclipse/main2/AndroidManifest.xml
+++ /dev/null
@@ -1,1 +0,0 @@
-<!-- Placeholder. -->
deleted file mode 100644
--- a/python/mozbuild/mozbuild/test/backend/data/android_eclipse/main2/assets/dummy.txt
+++ /dev/null
@@ -1,1 +0,0 @@
-# Placeholder.
\ No newline at end of file
deleted file mode 100644
--- a/python/mozbuild/mozbuild/test/backend/data/android_eclipse/main2/extra.jar
+++ /dev/null
@@ -1,1 +0,0 @@
-# Placeholder.
\ No newline at end of file
deleted file mode 100644
--- a/python/mozbuild/mozbuild/test/backend/data/android_eclipse/main2/res/values/strings.xml
+++ /dev/null
@@ -1,1 +0,0 @@
-<string name="label">main1</string>
deleted file mode 100644
--- a/python/mozbuild/mozbuild/test/backend/data/android_eclipse/main3/AndroidManifest.xml
+++ /dev/null
@@ -1,1 +0,0 @@
-<!-- Placeholder. -->
deleted file mode 100644
--- a/python/mozbuild/mozbuild/test/backend/data/android_eclipse/main3/a/A.java
+++ /dev/null
@@ -1,1 +0,0 @@
-package a.a;
deleted file mode 100644
--- a/python/mozbuild/mozbuild/test/backend/data/android_eclipse/main3/b/B.java
+++ /dev/null
@@ -1,1 +0,0 @@
-package b;
deleted file mode 100644
--- a/python/mozbuild/mozbuild/test/backend/data/android_eclipse/main3/c/C.java
+++ /dev/null
@@ -1,1 +0,0 @@
-package d.e;
deleted file mode 100644
--- a/python/mozbuild/mozbuild/test/backend/data/android_eclipse/main4
+++ /dev/null
@@ -1,1 +0,0 @@
-<!-- Placeholder. -->
deleted file mode 100644
--- a/python/mozbuild/mozbuild/test/backend/data/android_eclipse/moz.build
+++ /dev/null
@@ -1,37 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# Any copyright is dedicated to the Public Domain.
-# http://creativecommons.org/publicdomain/zero/1.0/
-
-
-p = add_android_eclipse_library_project('library1')
-p.package_name = 'org.mozilla.test.library1'
-p.res = 'library1/resources'
-
-p = add_android_eclipse_library_project('library2')
-p.package_name = 'org.mozilla.test.library2'
-
-p = add_android_eclipse_project('main1', 'main1/AndroidManifest.xml')
-p.package_name = 'org.mozilla.test.main1'
-p.recursive_make_targets += ['target1', 'target2']
-
-p = add_android_eclipse_project('main2', 'main2/AndroidManifest.xml')
-p.package_name = 'org.mozilla.test.main2'
-p.res = 'main2/res'
-p.assets = 'main2/assets'
-p.extra_jars = ['main2/extra.jar']
-
-p = add_android_eclipse_project('main3', 'main3/AndroidManifest.xml')
-p.package_name = 'org.mozilla.test.main3'
-cpe = p.add_classpathentry('a', 'main3/a', dstdir='a/a')
-cpe = p.add_classpathentry('b', 'main3/b', dstdir='b')
-cpe.exclude_patterns += ['b/Excludes.java', 'b/Excludes2.java']
-cpe = p.add_classpathentry('c', 'main3/c', dstdir='d/e')
-cpe.ignore_warnings = True
-
-p = add_android_eclipse_project('main4', 'main3/AndroidManifest.xml')
-p.package_name = 'org.mozilla.test.main3'
-p.referenced_projects += ['library1']
-p.included_projects += ['library2']
-p.recursive_make_targets += ['target3', 'target4']
-
-DIRS += ['subdir']
deleted file mode 100644
--- a/python/mozbuild/mozbuild/test/backend/data/android_eclipse/subdir/moz.build
+++ /dev/null
@@ -1,13 +0,0 @@
-# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
-# Any copyright is dedicated to the Public Domain.
-# http://creativecommons.org/publicdomain/zero/1.0/
-
-DEFINES['FOO'] = 'FOO'
-
-p = add_android_eclipse_library_project('sublibrary')
-p.package_name = 'org.mozilla.test.sublibrary'
-p.is_library = True
-
-p = add_android_eclipse_project('submain', 'submain/AndroidManifest.xml')
-p.package_name = 'org.mozilla.test.submain'
-p.recursive_make_targets += ['subtarget1', 'subtarget2']
deleted file mode 100644
--- a/python/mozbuild/mozbuild/test/backend/data/android_eclipse/subdir/submain/AndroidManifest.xml
+++ /dev/null
@@ -1,1 +0,0 @@
-<!-- Placeholder. -->
deleted file mode 100644
--- a/python/mozbuild/mozbuild/test/backend/test_android_eclipse.py
+++ /dev/null
@@ -1,153 +0,0 @@
-# This Source Code Form is subject to the terms of the Mozilla Public
-# License, v. 2.0. If a copy of the MPL was not distributed with this
-# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-
-from __future__ import unicode_literals
-
-import json
-import os
-import unittest
-
-from mozbuild.backend.android_eclipse import AndroidEclipseBackend
-from mozbuild.frontend.emitter import TreeMetadataEmitter
-from mozbuild.frontend.reader import BuildReader
-from mozbuild.test.backend.common import BackendTester
-from mozpack.manifests import InstallManifest
-from mozunit import main
-
-import mozpack.path as mozpath
-
-class TestAndroidEclipseBackend(BackendTester):
-    def __init__(self, *args, **kwargs):
-        BackendTester.__init__(self, *args, **kwargs)
-        self.env = None
-
-    def assertExists(self, *args):
-        p = mozpath.join(self.env.topobjdir, 'android_eclipse', *args)
-        self.assertTrue(os.path.exists(p), "Path %s exists" % p)
-
-    def assertNotExists(self, *args):
-        p = mozpath.join(self.env.topobjdir, 'android_eclipse', *args)
-        self.assertFalse(os.path.exists(p), "Path %s does not exist" % p)
-
-    def test_library_project_files(self):
-        """Ensure we generate reasonable files for library projects."""
-        self.env = self._consume('android_eclipse', AndroidEclipseBackend)
-        for f in ['.classpath',
-                  '.project',
-                  '.settings',
-                  'AndroidManifest.xml',
-                  'project.properties']:
-            self.assertExists('library1', f)
-
-    def test_main_project_files(self):
-        """Ensure we generate reasonable files for main (non-library) projects."""
-        self.env = self._consume('android_eclipse', AndroidEclipseBackend)
-        for f in ['.classpath',
-                  '.project',
-                  '.settings',
-                  'gen',
-                  'lint.xml',
-                  'project.properties']:
-            self.assertExists('main1', f)
-
-    def test_library_manifest(self):
-        """Ensure we generate manifest for library projects."""
-        self.env = self._consume('android_eclipse', AndroidEclipseBackend)
-        self.assertExists('library1', 'AndroidManifest.xml')
-
-    def test_classpathentries(self):
-        """Ensure we produce reasonable classpathentries."""
-        self.env = self._consume('android_eclipse', AndroidEclipseBackend)
-        self.assertExists('main3', '.classpath')
-        # This is brittle but simple.
-        with open(mozpath.join(self.env.topobjdir, 'android_eclipse', 'main3', '.classpath'), 'rt') as fh:
-            lines = fh.readlines()
-        lines = [line.strip() for line in lines]
-        self.assertIn('<classpathentry including="**/*.java" kind="src" path="a" />', lines)
-        self.assertIn('<classpathentry excluding="b/Excludes.java|b/Excludes2.java" including="**/*.java" kind="src" path="b" />', lines)
-        self.assertIn('<classpathentry including="**/*.java" kind="src" path="c"><attributes><attribute name="ignore_optional_problems" value="true" /></attributes></classpathentry>', lines)
-
-    def test_library_project_setting(self):
-        """Ensure we declare a library project correctly."""
-        self.env = self._consume('android_eclipse', AndroidEclipseBackend)
-
-        self.assertExists('library1', 'project.properties')
-        with open(mozpath.join(self.env.topobjdir, 'android_eclipse', 'library1', 'project.properties'), 'rt') as fh:
-            lines = fh.readlines()
-        lines = [line.strip() for line in lines]
-        self.assertIn('android.library=true', lines)
-
-        self.assertExists('main1', 'project.properties')
-        with open(mozpath.join(self.env.topobjdir, 'android_eclipse', 'main1', 'project.properties'), 'rt') as fh:
-            lines = fh.readlines()
-        lines = [line.strip() for line in lines]
-        self.assertNotIn('android.library=true', lines)
-
-    def test_referenced_projects(self):
-        """Ensure we reference another project correctly."""
-        self.env = self._consume('android_eclipse', AndroidEclipseBackend)
-        self.assertExists('main4', '.classpath')
-        # This is brittle but simple.
-        with open(mozpath.join(self.env.topobjdir, 'android_eclipse', 'main4', '.classpath'), 'rt') as fh:
-            lines = fh.readlines()
-        lines = [line.strip() for line in lines]
-        self.assertIn('<classpathentry combineaccessrules="false" kind="src" path="/library1" />', lines)
-
-    def test_extra_jars(self):
-        """Ensure we add class path entries to extra jars iff asked to."""
-        self.env = self._consume('android_eclipse', AndroidEclipseBackend)
-        self.assertExists('main2', '.classpath')
-        # This is brittle but simple.
-        with open(mozpath.join(self.env.topobjdir, 'android_eclipse', 'main2', '.classpath'), 'rt') as fh:
-            lines = fh.readlines()
-        lines = [line.strip() for line in lines]
-        self.assertIn('<classpathentry exported="true" kind="lib" path="%s/main2/extra.jar" />' % self.env.topsrcdir, lines)
-
-    def test_included_projects(self):
-        """Ensure we include another project correctly."""
-        self.env = self._consume('android_eclipse', AndroidEclipseBackend)
-        self.assertExists('main4', 'project.properties')
-        # This is brittle but simple.
-        with open(mozpath.join(self.env.topobjdir, 'android_eclipse', 'main4', 'project.properties'), 'rt') as fh:
-            lines = fh.readlines()
-        lines = [line.strip() for line in lines]
-        self.assertIn('android.library.reference.1=library2', lines)
-
-    def assertInManifest(self, project_name, *args):
-        manifest_path = mozpath.join(self.env.topobjdir, 'android_eclipse', '%s.manifest' % project_name)
-        manifest = InstallManifest(manifest_path)
-        for arg in args:
-            self.assertIn(arg, manifest, '%s in manifest for project %s' % (arg, project_name))
-
-    def assertNotInManifest(self, project_name, *args):
-        manifest_path = mozpath.join(self.env.topobjdir, 'android_eclipse', '%s.manifest' % project_name)
-        manifest = InstallManifest(manifest_path)
-        for arg in args:
-            self.assertNotIn(arg, manifest, '%s not in manifest for project %s' % (arg, project_name))
-
-    def test_manifest_main_manifest(self):
-        """Ensure we symlink manifest if asked to for main projects."""
-        self.env = self._consume('android_eclipse', AndroidEclipseBackend)
-        self.assertInManifest('main1', 'AndroidManifest.xml')
-
-    def test_manifest_res(self):
-        """Ensure we symlink res/ iff asked to."""
-        self.env = self._consume('android_eclipse', AndroidEclipseBackend)
-        self.assertInManifest('library1', 'res')
-        self.assertNotInManifest('library2', 'res')
-
-    def test_manifest_classpathentries(self):
-        """Ensure we symlink classpathentries correctly."""
-        self.env = self._consume('android_eclipse', AndroidEclipseBackend)
-        self.assertInManifest('main3', 'a/a', 'b', 'd/e')
-
-    def test_manifest_assets(self):
-        """Ensure we symlink assets/ iff asked to."""
-        self.env = self._consume('android_eclipse', AndroidEclipseBackend)
-        self.assertNotInManifest('main1', 'assets')
-        self.assertInManifest('main2', 'assets')
-
-
-if __name__ == '__main__':
-    main()
--- a/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
+++ b/python/mozbuild/mozbuild/test/backend/test_recursivemake.py
@@ -913,49 +913,16 @@ class TestRecursiveMakeBackend(BackendTe
         """Ensure duplicate support-files in test manifests work."""
         env = self._consume('test-manifests-duplicate-support-files',
             RecursiveMakeBackend)
 
         p = os.path.join(env.topobjdir, '_build_manifests', 'install', '_test_files')
         m = InstallManifest(p)
         self.assertIn('testing/mochitest/tests/support-file.txt', m)
 
-    def test_android_eclipse(self):
-        env = self._consume('android_eclipse', RecursiveMakeBackend)
-
-        with open(mozpath.join(env.topobjdir, 'backend.mk'), 'rb') as fh:
-            lines = fh.readlines()
-
-        lines = [line.rstrip() for line in lines]
-
-        # Dependencies first.
-        self.assertIn('ANDROID_ECLIPSE_PROJECT_main1: target1 target2', lines)
-        self.assertIn('ANDROID_ECLIPSE_PROJECT_main4: target3 target4', lines)
-
-        command_template = '\t$(call py_action,process_install_manifest,' + \
-                           '--no-remove --no-remove-all-directory-symlinks ' + \
-                           '--no-remove-empty-directories %s %s.manifest)'
-        # Commands second.
-        for project_name in ['main1', 'main2', 'library1', 'library2']:
-            stem = '%s/android_eclipse/%s' % (env.topobjdir, project_name)
-            self.assertIn(command_template % (stem, stem), lines)
-
-        # Projects declared in subdirectories.
-        with open(mozpath.join(env.topobjdir, 'subdir', 'backend.mk'), 'rb') as fh:
-            lines = fh.readlines()
-
-        lines = [line.rstrip() for line in lines]
-
-        self.assertIn('ANDROID_ECLIPSE_PROJECT_submain: subtarget1 subtarget2', lines)
-
-        for project_name in ['submain', 'sublibrary']:
-            # Destination and install manifest are relative to topobjdir.
-            stem = '%s/android_eclipse/%s' % (env.topobjdir, project_name)
-            self.assertIn(command_template % (stem, stem), lines)
-
     def test_install_manifests_package_tests(self):
         """Ensure test suites honor package_tests=False."""
         env = self._consume('test-manifests-package-tests', RecursiveMakeBackend)
 
         man_dir = mozpath.join(env.topobjdir, '_build_manifests', 'install')
         self.assertTrue(os.path.isdir(man_dir))
 
         full = mozpath.join(man_dir, '_test_files')
--- a/python/mozbuild/mozbuild/test/python.ini
+++ b/python/mozbuild/mozbuild/test/python.ini
@@ -1,12 +1,11 @@
 [action/test_buildlist.py]
 [action/test_generate_browsersearch.py]
 [action/test_package_fennec_apk.py]
-[backend/test_android_eclipse.py]
 [backend/test_build.py]
 [backend/test_configenvironment.py]
 [backend/test_recursivemake.py]
 [backend/test_test_manifest.py]
 [backend/test_visualstudio.py]
 [compilation/test_warnings.py]
 [configure/lint.py]
 [configure/test_checks_configure.py]