21.0.0
* Bug fixes.
* JUnit test runner allows a test to be run on all devices
* XML code completion can now complete (and show documentation for)
  theme references, such as ?android:attr/dividerHeight
* Improved flag and locale data in the configuration chooser
* New lint checks:
  * Find misspellings in English string files
  * Detect certain types of wakelock mistakes leading to unnecessary
    battery usage
  * Find private key files placed in directories where they end up
    getting bundled with the .apk
  * Find usages of "dp" units with the font property textSize
  * Find invalid selector files where a later state is fully covered
    by an earlier state and is therefore unreachable
  * Find incorrect use of the SecureRandom object (where it is
    initialized with a fixed seed)
  Various lint infrastructure improvements.

20.0.0
* A lot of bug fixes, performance fixes and memory fixes.
* Support for Eclipse 4.x.
* Build System
  * Automatic merging of library project manifest files into the
    including project's manifest. Enable with the
    manifestmerger.enabled property.
  * Automatic ProGuard support for the aapt -G flag. This means that
    the build system will generate a temporary ProGuard keep-rules
    file containing classes to keep that are referenced from XML files
    (such as custom views) and pass this to ProGuard at
    shrink-time. This can make the resulting APK much smaller when
    using just a small portion of a large library project (such as the
    Android Support library), since we have also removed the catch-all
    rules to keep all custom views from the default ProGuard
    configuration file.
   * Aidl files from library projects are now in the import list.
   * Fixes in Ant:
     * Test projects now have access to the full classpath from the
       tested projects, including Library Projects and 3rd party jar
     * Applications embedding tests can now be deployed and tested,
       including with code coverage, like test applications.
* Lint
  * Tighter integration with the layout editor (error and warning
    icons overlaid views with errors, lint error messages shown as
    tooltips in the layout canvas and in the outline, error count
    displayed in the layout actions bar.)
  * Lint is run incrementally in Java files on save, just like XML
    files already are.
  * New lint rules:
  * Detect usages of Toast.makeText() without calling show() on the
    result, as well as passing invalid duration parameters (e.g. a
    number instead of one of the two allowed constants.)
  * Detect incorrect manifest registrations (where elements such as
    <uses-library>, <activity> etc are placed under the wrong parent.)
  * Several security checks: Look for exported content providers
    without required permissions, look for creation of world readable
    files and preferences, look for calls to
    android.webkit.WebSettings.setJavaScriptEnabled.
  * Check to make sure that Fragment classes are instantiatable. If
    you accidentally make a fragment innerclass non-static, or forget
    to have a default constructor, you can hit runtime errors when the
    system attempts to reinstantiate your fragment after a
    configuration change.
  * Look for handler leaks: This check makes sure that a handler inner
    class does not hold an implicit reference to its outer class.
  * Duplicate Activity registrations in the manifest. This can lead to
    subtle errors that can be difficult to understand.
  * Lint check ensuring that when you edit() a SharedPreference object
    you call commit()
* Layout Editor
  * New property sheet implementation, which offers:
    * Highlighting (in bold) for important attributes.
    * Inline preview of colors and images, as well as the
      corresponding resource name.
    * Displays default values, when available.
    * Completion of resource values and enum and flag constants.
    * Support for showing and hiding "advanced" properties.
    * Nested properties (and collapse all and expand all) for better
      categorization. For example, layout params are listed first as a
      single nested property.
    * Tooltips over the attribute names, not values, so they never
      obscure the value column.
    * Checkbox support for boolean values.
    * Support for switching between alphabetical and natural sort
      orders.
  * New window management. The propertysheet is now automatically
    docked into the Outline view, and the outline can appear in a
    maximized editor. The structure and palette views can be minimized
    and appear temporarily on flyover.
  * New configuration chooser above the layout editor, which in
    addition to a visual refresh offers an activity chooser, a nested
    theme chooser, a single button to flip orientation, better
    wrapping behavior, etc.
* SDK Manager:
  * Cache to avoid downloading repository definitions all the time.
  * New "Tools > Manage Add-on Sites" option that allows deactivating
    3rd party sites (e.g. if one or more are temporarily slow to
    load.)
* NDK integration (alpha):
  * Initial support for building and debugging projects with C/C++
    code.
  * To enable this, install the NDK feature (depends on CDT), and then
    set the path to NDK in Android Preferences.
  * Add NDK nature to an Android project by right clicking on the
    project and select "Android Tools -> Add Native Support".
  * To debug an NDK project, just right click and select "Debug As
    Android Native Application".
* Execution
  * LogCat: Allow users to set colors for different priorities
  * LogCat: Ctrl + F now brings up a Find dialog to find items (rather
    than filter)
  * Allow running on multiple devices with a single launch. The target
    tab in the launch configuration dialog adds a new option which
    allows launching on all connected devices, and a drop down allows
    the user to further narrow down the list to just physical devices
    or just emulators. (This applies only to Run configurations, not
    to Debug/JUnit tests.)
* XML Editing
  * Code completion support for custom attributes on custom views.
  * Go to Declaration now works for theme references (?android:attr,
    ?attr: etc,)
  * Completion of the minSdkVersion and targetSdkVersion attributes in
    manifest files now include version descriptions for each of the
    API levels
  * Support XML editor outlines for layout files. Switching back and
    forth between the text editor and graphical editor will alternate
    between the two outlines, and in particular the XML editor outline
    will keep up to date with edits in the editor, and selection will
    follow the mouse cursor etc.
* The Asset Studio Wizard now supports padding and disabling
  background shapes

19.0.0 (does not exist)

18.0.0
* Fix bug 27940 where exporting release package doesn't recompile libraries
  in release mode.

17.0.0:
* ADT 17 requires Java 6 and Eclipse 3.6.2.
* Improved Lint UI.
   * Many new lint checks: See the tools changes.txt for details.
   * New "Run Lint" toolbar action with a dropdown menu for selecting
     specific (or all) projects, clearing results, etc.
   * The results window is now organized as a tree rather than a flat
     list. Each issue type has a single top level item, which makes it
     easier to quickly scan through the reported issues and narrow
     down to issues you are most interested in.
   * The results window contains many new toolbar actions, including
     expand/collapse, ignore in file, ignore in project, ignore
     everywhere, show options, and configure columns.
   * There are new columns available, such as category, priority,
     project, file and line. The column selection (as well as the
     column sizes) are persisted. You can click on columns to sort by
     that column.
   * The Lint Options dialog has Enable All and Disable All buttons,
     and a search filter textbox to filter by issue id, summary and
     severity.
* New Quick Outline for XML editors (Ctrl-O, Command-O). This shows
  the structure of the current file including icons and ids, and lets
  you filter and quickly jump to specific ids.
* The resource chooser now shows the resolved value for resources
  (e.g. when selecting @string/hello it displays that the resolved value
  is "Hello World"). It also allows editing the chosen value directly.
* The layout editor no longer assigns default ids to layouts, includes
  and merge tags. This tended to pollute the namespace with a lot of
  unused resources since layouts aren't usually manipulated via code,
  or referenced from XML. (The RelativeLayout editor automatically
  assigns ids to views without ids when pointing to them.)
* Export Screenshot from the Layout Editor
* Layout editor fix for SlidingDrawer which on some platforms could
  not be dragged into the layout. Also fix preview rendering for
  SlidingDrawer and TabHost (issue 23022).
* New default application icons, including an xhdpi version.
* Important bug fixes:
  * Fix bug in resource chooser which made some types of framework
    resources impossible to select (issue 20589)
  * Fix a bug in the formatter where a certain whitespace pattern
    could result in a non-space character getting deleted (issue
    23940)
  * Fix locale bug affecting Turkish locales in particular (issue
    23747)

16.0.0:
* New "lint" feature which scans the Android projects for potential
  problems such as missing translations, duplicate ids between layouts
  that include each other, using px instead of dp units, hardcoded
  strings, missing contentDescriptions, obsolete Proguard
  configuration files, etc. Lint can be run on the command line, but
  it is also integrated into the Problems view in Eclipse, and there
  are also quickfixes available for many of the reported errors.

15.0.0
Critical bug fixes only.

14.0.0
- Build system:
  - (TODO: More info) Improved library projects
  - Improved incremental builds
    - Resource compilation is run much less frequently. It is no
      longer run when strings are edited, or when layouts are edited
      (unless a new id is introduced), and it is no longer run once
      per library project (!)
    - Resource compilation is no longer done for normal save
      operations, only when running or debugging (option added in ADT
      12 now on by default.)
    - There is a new "PNG crunch cache", which means image crunching
      is only done once, not once per build which is significant for
      projects with many resources
    - Incremental ant builds
  - ADT now uses bin/classes to output the java compilation
    and bin/ for Android specific classes. This will make bin show up
    in the package explorer.
- DDMS
  - Brand new logcat view. Fixes bugs, displays and filters by
    application names instead of just pids, fronts when application
    runs.
- XML Editing
  - New XML formatter which formats all XML files according to the
    standard Android coding style. The formatter can also reorder
    attributes to follow the recommended order.
  - Improved "smart indent": automatic indentation and un-indentation
    when pressing Return in XML editors
  - Go to Matching (Ctrl-Shift-P) in XML files can now jump between
    opening and closing tags
  - Changes made by the layout editor are automatically run through
    the new XML formatter.
  - Select Enclosing Element should now work on the Mac as well.
- Java Editing
  - Quickfix for extracting Strings when the caret is inside a String
- Layout Editor
  - New GridLayout support
  - Tooltip feedback for resizing and dragging operations. For
    example, when dragging in a relative layout, the proposed
    constraints are shown, and when resizing the new dimensions are
    shown.
  - New "Remove Container" visual refactoring which removes the
    children of a container up to the top level and transfers
    namespace and layout attributes if necessary.
  - Improved access to properties in the context menu: The most
    frequently set attributes for each view are listed at the top of
    the menu, and the properties menu offers access to the most
    recently set attributes, attributes organized by their defining
    view, and layout attributes only or all attributes alphabetically.
  - The context menu now also contains pull-right menus for accessing
    properties of the parents, which is useful when the children fully
    cover the parent making it hard to select on its own.
  - Ability to suppress rendering fidelity warnings.
- Asset Studio integration: Wizard creation of launcher icons, menu
    icons, tab icons, etc.
- New Welcome Wizard to help installing and configuring the SDK
  platforms.
- The New Project and the New XML File wizards have been reworked into
  multiple pages. Sample Projects are now copied into the workspace
  such that they can be modified and deleted without affecting the
  master copy.
- The dependency on Eclipse GEF was removed.
- Many bug fixes, and in particular some critical bug fixes on Linux

13.0.0
- Tools release only (command line tools)

12.0.0 (July 6th, 2011)
- Many bug fixes!
- Visual Layout Editor:
  - New RelativeLayout drop support with guideline suggestions for
    attachments and cycle prevention.
  - Resize support in most layouts. In LinearLayout, sizes are mapped
    to weights. Guideline snapping to wrap_content and match_parent.
  - Previews of drawables and colors in the resource chooser dialogs.
  - Improved error messages and links for rendering errors, including
    detection of misspellings of class names.
- Build system: Delay post compiler phase until actual export or debug
  to speed up interactive file saves. (This is off by default but can
  be enabled in the ADT options panel.)

11.0.0 (June 6th, 2011)
- Visual Refactoring:
  - The new "Extract Style" refactoring pulls out style constants and
    defines them as style rules instead.
  - The new "Wrap in Container" refactoring surrounds the selected
    views with a new layout, and transfers namespace and layout
    parameters to the new parent
  - The new "Change Widget Type" refactoring changes the type of the
    selected views to a new type. (Also, a new selection context menu
    in the visual layout editor makes it easy to select siblings as
    well as views anywhere in the layout that have the same type).
  - The new "Change Layout" refactoring changes layouts from one type
    to another, and can also flatten a layout hierarchy.
  - The "Extract as Include" refactoring now finds identical fragments
    in other layouts and offers to combine all into a single include.
  - There is a new Refactoring Quick Assistant which can be invoked
    from the XML editor (with Ctrl-1) to apply any of the above
    refactorings (and Extract String) to the current selection.
- Visual Layout Editor:
  - Improved "rendering fidelity": The layout preview has been
    improved and should more closely match the rendering on actual
    devices.
  - The visual editor now previews ListViews at designtime.  By
    default, a two-line list item is shown, but with a context menu
    you can pick any arbitrary layout to be used for the list items,
    and you can also pick the header and footer layouts.
  - The palette now supports "configurations" where a single view is
    presented in various different configurations. For example, there
    is a whole "Textfields" palette category where the EditText view
    can be dragged in as a password field, an e-mail field, a phone
    field, and so on. Similarly, TextViews are offered preconfigured
    with large, normal and small theme sizes, and LinearLayouts are
    offered both in horizontal and vertical configurations.
  - The palette supports custom views, picking up any custom
    implementations of the View class in your project source folders
    or in included libraries, and these can be dragged into layouts.
  - Fragments support: Fragments are available in the palette, and in
    the tool you can choose which layout to show rendered for a given
    fragment tag. Go to declaration works for fragment classes.
  - The layout editor automatically applies a "zoom to fit" for newly
    opened files as well as on device size and orientation changes to
    ensure that large layouts are always fully visible unless you
    manually zoom in.
  - You can drop an "include" tag from the palette, which will pop up
    a layout chooser, and the chosen layout is added as an include.
    Similarly, dropping images or image buttons will pop up image
    resource choosers to initialize the new image with.
  - The configuration chooser now applies the "Render Target" and
    "Locale" settings project wide, making it trivial to check the
    layouts for different languages or render targets without having
    to configure these individually for each layout.
  - The layout editor is smarter about picking a default theme to
    render a layout with, consulting factors like theme registrations
    in the manifest, the SDK version, etc.
  - The layout editor is also smarter about picking a default
    configuration to render a layout with, defaulting to the currently
    visible configuration in the previous file. It also considers the
    SDK target to determine whether to default to a tablet or phone
    screen size.
  - Basic focus support: The first text field dropped in a layout is
    assigned focus, and there are "Request Focus" and "Clear Focus"
    context menu items on text fields to change the focus.
- XML editors:
  - Code completion has been significantly improved. It now works
    within <style> elements, it completes dimensional units,
    it sorts resource paths in values based on the attribute name,
    etc. There are also many fixes to handle text replacement.
  - AAPT errors are handled better. They are now underlined for the
    relevant range in the editor, and a new quickfix makes it trivial
    to create missing resources.
  - Code completion for drawable, animation and color XML files.
- DDMS:
  - "New Folder" action in the File Explorer
  - The screenshot dialog will add timestamps to the filenames, and
    preserve the orientation on snapshot refresh
- TraceView: Mouse-wheel zoom support in the timeline
- The New Android Project wizard now supports Eclipse working sets
- Most of the tools have improved integration with the Mac OSX
  system menu bar.
- Most of the tools have new launcher icons.

10.0.1 (March, 2011)
- Temporary work-around to resolve the rare cases in which the layout
  editor will not open.
- Fix issue in which ADT 10.0.0 would install on Eclipse 3.4 and
  lower, even though ADT requires Eclipse 3.5 or higher (as of
  10.0.0).

10.0.0 (February 22nd, 2011)
- The tools now automatically generate Java Programming Language
  source files (in the gen/ directory) and bytecode (in the res/raw/
  directory) from your .rs files.
- A Binary XML editor has been added.
- Traceview is now integrated into the Eclipse UI.
- The "Go To Declaration" feature for XML and .java files quickly show
  all the matches in the project and allows you jump to specific items
  such as string translations or onClick handlers.
- The Resource Chooser can create items such as dimensions, integers,
  ids, and booleans.
- Improvements to the Visual Layout Editor:
  - A new Palette with categories and rendering previews.
  - A Layout Actions bar that provides quick access to common layout
    operations.
  - When the Android 3.0 rendering library is selected, layouts render
    more like they do on devices. This includes rendering of status
    and title bars to more accurately reflect the actual screen space
    available to applications.
  - Zoom improvements such as fit to view, persistent scale, and
    keyboard access..
  - Further improvements to <merge> layouts, as well as layouts with
    gesture overlays.
  - Improved rendering error diagnostics.

9.0.0 (January 26, 2011)
- Visual Layout Editor
    - Empty layouts with 0,0 size are now automatically expanded when
      selected and during drag and drop
    - Rendering target can now be changed from the default (project
      target)
    - When choosing resources for rendering, the API level is properly
      handled
    - Improved support for rendering <include> and <merge> views
    - "Extract as Include" refactoring to extract selected views into
      a separate included layout.
    - String and reference properties can be edited from the layout
      editor's context menu
    - Rewritten outline drag & drop handling, improved label colors
      and content
    - The generated XML will be better formatted. Full XML formatter
      can be enabled in the preferences (under Android > Editors), but
      will touch part of the XML that isn't modified.
    - Automatic configuration of many widgets on drop, such as
      automatically filling a TextView in a vertical LinearLayout,
      adding rows to new tables, etc.
    - Double click views to jump to the corresponding XML declaration,
      or for included views, to the included layout file
    - Improved support for various views (such as TabHosts and
      SlidingDrawers) when rendered using Honeycomb
- Go to Declaration hyperlinks for navigating from @resource
  references to their XML declarations, from the manifest file to
  activity and service classes, from Java access of resource R fields
  to the XML declarations, etc.
- Logcat view in DDMS now properly displays UTF-8 characters.

8.0.1 (October 2010)
- Fix compilation issue in Android projects referencing standard Java
  projects.
- Better error reporting when exporting applications for release.

8.0.0 (October 2010)
- New version number scheme following the SDK Tools revision number.
- Support for true debug build. No need to change the value of
  debuggable in the Android Manifest.  Incremental build will
  automatically insert debuggable==true while using the "export
  signed/unsigned application package" will not.  If debuggable=true
  is set, then release builds will actually do a debug build.
- Automatic Proguard support in release builds. Only need to have a
  proguard.config property in default.properties that points to a
  proguard config file.
- Completely rewritten Visual Layout Editor. This is very much a work
  in progress.
    - full drag and drop from palette to layout for all Layout
      classes.
    - Move widgets inside a Layout view, from one Layout view to
      another and from one layout file to another.
    - Contextual menu with enum/flag type properties.
    - New zoom controls.
- New HierarchyViewer plug-in integrated in Eclipse.
- Android launch configurations don't recompile the whole workspace on
  launch anymore.
- android.jar source and javadoc location can now be configured.

0.9.9:
- Fix bug where ADT would delete the source folder of projects
  imported from version control.

0.9.8:
- New Action "Rename Application Package" (under the "Android Tools"
  contextual menu) will do a full application package refatoring.
- Fixed issue with library project names containing characters that
  aren't compatible with Eclipse path variable. The link between the
  main project and the library would fail to create.
- Added support for library projects that don't have a source folder
  called "src". There is now support for any number of source folder,
  with no name restriction. They can even be in sub folder such as
  "src/java".
- Added support for libraries with library dependencies.
- added support for new resource qualifiers: car/desk, night/notnight
  and navexposed/navhidden
- Added more device screen types for the layout editor. All screen
  resolution/density combinations from
  http://developer.android.com/guide/practices/screens_support.html#range
  is now available.

0.9.7:
- Support for library projects
- Updated Property panel for Android project to edit library
  dependencies.

0.9.6:
- Editing default.properties outside of eclipse will automatically
  update the project
- Fix issue when launching ADT the first time with the SDK Usage panel
  that could create a deadlock between modal dialogs
- Launched applications from ADT now behave as if they were clicked
  from the Home screen of the emulator.
- AVD creation dialog now enforce sd card of 9MB or higher
- Fixed issue where add-on with no optional library would not show up
  as valid targets for application launches.
- Loads the SDK content only when a project requires it. This will
  make Eclipse use less resources when the SDK contains many versions
  of Android.
- DDMS plug-in now contains the Allocation Tracker view.
- Lots of fixes in the configuration selector of the Visual Layout
  Editor.
- Explode mode in the Visual Layout Editor adds a margin to all layout
  objects so that it's easier to see embedded layouts
- Outline mode in the Visual Layout Editor draws layout outline to
  make it easier to see layout objects.
- Fixed issues with the New Project Wizard when selecting samples.
- Fixed possible crash when launching applications
- New action in the Logcat view: "Go to problem" lets you go directly
  from an exception trace output to the code.

0.9.5:
- Misc fixes in the SDK Updater

0.9.4:
- New "Create project from sample" choice in the New Project Wizard.
- Improvements to the SDK Updater.
- improvements to the AVD Manager (creation and launch dialogs)
- new configuration selector in the Graphical Layout Editor

0.9.3:
- New wizard to create Android JUnit Test Projects.
- New AVD wizard.
- SDK Updater
- zipalign support

0.9.1:

- Added an AVD creation wizard to ADT. It is automatically displayed
  during a launch if no compatible AVDs are found.
- Fixed issue with libs/ folder where files with no extension would
  prevent the build from finishing.
- Improved error handling during the final steps of the build to mark
  the project if an unexpected error prevent the build from finishing.
- Fixed issue when launching ADT on a clean install would trigger
  org.eclipse.swt.SWTError: Not implemented [multiple displays].



0.9.0:

- Projects now store generated Java files (R.java/Manifest.java and
  output from aidl) in a 'gen' source folder.
- Support for the new Android SDK with support for multiple versions
  of the Android platform and for vendor supplied add-ons.
    * New Project Wizard lets you choose which platform/add-on to
      target.
    * Project properties (right click project in Package Explorer,
      then "Properties"), lets you edit project target.
    * New Launch configuration option to choose debug deployment
      target.
- Ability to export multiple apk from one project, using resource
  filters. See the 'android' property for Android projects.
- Support for running JUnit tests on a device/emulator from a new
  "Android JUnit tests" launch configuration.

0.8.1:

- Alternate Layout wizard. In the layout editor, the "create" button
  is now enabled to easily create alternate versions of the current
  layout.
- Fixed issue with custom themes/styles in the layout editor.
- Export Wizard: To export an application for release, and sign it
  with a non debug key. Accessible from the export menu, from the
  Android Tools contextual menu, or from the overview page of the
  manifest editor.
- New XML File Wizard: To easily create new XML resources file in the
  /res directory.
- New checks on launch when attempting to debug on a device.
- Basic support for drag'n'drop in Graphical layout editor. You can
  add new items by drag'n'drop from the palette. There is no support
  for moving/resizing yet.
- Undo/redo support in all XML form editors and Graphical layout
  editor.

0.8.0:

- Fixed issue with using custom classes implementing Parcelable in
  aidl files. Right click the project and choose Android Tools >
  Create aidl preprocess file for Parcelable Classes.
- Added Custom Themes to theme drop down in the layout editor.
- Customizable debug signing keystore path in preferences
- Customizable HOME package name.

0.7.1:

- Layout Editor.

0.6.1:
- Fixed install issue when project name contains spaces (requires new
  emulator image)
- Fixed setup of the New class wizard in the manifest (when clicking
  on "name" for a class attribute) in the cases where the class and
  some of its parent packages were missing.
- Properly kill the application that is about to be reinstalled.
- Create missing android folder automatically when building
  application (caused a signing error)
- Manifest editor: support for uses-library node
- Fixed NPE in editors.xml.descriptors.XmlDescriptors.createPreference
- Fixed assert in MultiEditorPart.setActivePage
- Fixed "connect to debugger" button in DeviceView. Also fixed support
  for custom process names.

0.6.0:

- New launch option for activity. Can choose to launch default
  activity (finds an activity configured to show up in the home
  screen), or specific activity, or none.
- Normal java resources (non java files placed in package folders) are
  now properly packaged in the final package, and can be accessed
  through normal java API such as ClassLoader.getResourceAsStream()
- Launch configuration now has an option to wipe emulator data on
  launch. This always asks for confirmation.
- Launch configuration now has an option to disable the boot
  animation. This will let the emulator start faster on older
  computers.
- Applications are now signed with a debug key (stored in
  debug.keystore in ~/.android).
- Installation of application is now more robust and will notify of
  installation failure. Also installation is blocking, removing issues
  where ADT tried to launch the activity before the app was installed.
- Tree-based resource editor + content assist in XML editor for
  layout, menu, preferences, values xml files. Work in progress...


0.4.0 (adt 0.4.0, ddms 0.3.0, editors 0.2.0, common 0.1.0)

- New AndroidManifest editor.
- True multiple device support allowing debugging apps on several
  device at the same time
- New launch modes for device selection: automatic will launch an
  emulator if no device are present, automatically target the device
  if only one exists, and prompt the user if 2+ are connected. Manual
  mode always prompt the user.
- New classpath container remove the dependencies on the location of
  android.jar making it easier to share a project through dsvn, cvs,
  etc... You should fix your project (right click project, choose
  Android > Fix Project properties)
- Fixed a case where pm would fail and would up end outputting the
  "usage" text, which would in turn confuse the plugin during parsing.
- Fixed an issue with compiling aidl file when they import project
  local files.


0.3.4 (adt 0.3.4, ddms 0.2.3, editors 0.1.0)

Internal release only.
- Enabled device support.

0.3.3 (adt 0.3.3, ddms 0.2.3, editors 0.1.0)

- Support for referenced projects.
- During launch, display if a package conflict occurs when the new
  application is pushed onto the device.
- You can now change the font of the logcat view. Also indentation is
  now properly displayed.
- Plugin generated files are now properly marked as derived. This will
  make Team plugins ignore them.

0.3.2

- XML Highlighting for AndroidManifest.xml (requires WebTools WST plugin)
- Custom java editor for R.java/Manifest.java to make those files non
  editable. This is to replace the current locking mechanism which
  causes issues on Mac OS.
- Fixed some issue in the "Restart adb" feature in the device view of
  ddms.
- Better handling of aidl files and the java files generated from
  them.
- Plugin now retries to launch the app on the emulator if it fails due
  to timing issues.
- Skin dropdown in the Emulator/Target tabs is now build from the
  content of the skin directory, to support developer made skins.
- Emulator control panel. This is a UI on top of the emulator
  console. it allows you to change the state of the network and gsm
  connection, and to initiate incoming voice call.

0.3.1

- Fixed issue on winXP/Eclipse 3.2 where errors in the New Project
  Wizard would not display.
- Added missing intent definition in the AndroidManifest.xml file
  created by the New Project Wizard.
- Fixed possible NPE in the debug action from the Process View
- Support for Eclipse 3.4

0.2.6 / 0.3.0

- New Project Wizard now makes it easy to open Android sample code
- Plugin will output a warning if the build id of the device/emulator
  does not match the sdk build id.
- Java/Debug/ddms perspective now contains direct menus to open some
  of the ddms views, and to create a new android project. This will
  require you to reset your perspectives.
- Error during builds now put an error marker on the project instead
  of displaying an (annoying) dialog box.
- Custom builders now remember their build state when restarting
  eclipse.
- Properly parse some aapt warnings and don't abort the build when
  they happen.
- Abort launch and prompt the user if the project contains errors.
- New silent/normal/verbose build output.

0.2.5

- Check compiler compliance level before compilation and abort if
  different from 1.5
- Fix Project Properties will fix the project compiler compliance if
  needed.
- Fixed an issue with multiple source folders.
- Added support for new Manifest.java class (it is automatically
  generated with R.java if the content of the AndroidManifest.xml
  requires it)
- Fixed an issue that could result in not packaging code changes.
- Automatic fix of the Launch Configurations when the java package in
  the manifest is changed. Also improved Launch Config dialog and
  error alert for erroneous activity names in the Launch
  Configuration.
- Support for external jars that are not under the project root
  directory.
- New projects have a default layout.
- Misc fixes for Windows support.

0.2.4

- Fixed large resource corruption issue.

0.2.3

- Fixed issue related to the integration of dx.
- Fixed issue related to the package generation that was modified for
  windows support.

0.2.2

- Changing the SDK location in the Preferences does not require to
  restart Eclipse anymore.
- New SDK-Project sync mode in Android preference pane. Default value
  set to true. If true, all android projects are automatically sync'ed
  to the SDK defined in the preferences.
- Cases where no emulator is running but a dialog still says "An
  emulator is running..." should be less frequent.
- Projects do not reference the standard desktop JRE anymore, as
  android.zip contains the core java library. This will solve the case
  where using a core class non present on the platform would not
  generate a compilation error.
- Changing the package defined in the manifest now deletes the R.java
  class from its previous location. This will require 1 build after
  upgrading the plugin, before it works.
- Project selection in the Launch Config Dialog now only shows Android
  projects.
- Launching a debug/run session now checks that the project uses the
  SDK set in the preferences (This is for the non automatic sync
  mode).
- Removed obsolete wallpaper mode in the New Project Creation Wizard.
- dx (dalvik code conversion tool) now embedded instead of calling the
  external version.
- Improvements in the parsing of the aapt errors.
- Some fixes for windows support.


0.2.1

- Fixed bug in logcat search where invalid regexp would cause a crash
- Minor improvements to the build/launch process.

0.2.0

- Logcat view.
- File Explorer view.
- Custom options for emulator. In the Launch configuration dialog you
  can specify custom command line emulator options. See
  "emulator -help" for available options.
- Android Tools > Export Application Package is now implemented.
- Misc incremental builder fixes.
- Including static .jar files as library in your project will
  automatically include them in the final APK. Warning: only the
  .class content is included.

0.1.10

- The res and assets folders now fully refresh before the build,
  ensuring R.java and packaged resources are always up to date. This
  can be disabled in the preferences under "Android" if this becomes
  slow due to too many files.

0.1.9

- New Action in the "Processes" view to debug an application that is
  already running. The source project for this application MUST be
  opened in the current workspace.
- Building the project now force refreshes the res folder. This should
  help rebuilding the resources when only binary files were changed
  from outside eclipse.
- Clean/full builds now compile all aidl files found in the build path
  (previously only incremental builds would compile them). Also, misc
  improvements to the incremental builders.
- Starting a run/debug session now asks to save the files and forces a
  new build to ensure that the latest package is pushed on the device.
- Plugin should be less aggressive when waiting for the emulator to be
  ready. This should translate in fewer failed launches.

0.1.8

- Fixed Debugger issue introduced in 0.1.6
- Added Log level preferences for DDMS. Look under Android > DDMS >
  Advanced. Default error level is Error.

0.1.7

- Fixed issue where java warnings wouldn't trigger a new package. Now
  only errors stop the packaging like it should be.
- Added more error output in the console during launch.

0.1.6

- New "Android" Console. It receives the error output from external
  tools such and aidl, dx, and aapt (only when they can't be
  parsed). Any error force the console to be displayed.
- The Activity Manager on the device/emulator now outputs some
  messages in the "Android" console when asked to start an
  activity. This should help you figure out what is wrong if the
  application doesn't start.
- Fixed a case where the .apk file would be updated with broken
  code. Now if there are java compile error, the .apk is not touched.
- Added support for manifest with non fully qualified activity java
  name, yet not starting with a dot.
- Fixed creation of manifest files (through New Project wizard) to use
  proper namespace for attributes.
- Better error reporting for namespace issue in the manifest.
- "Reset Adb" action from the device view. Use this is the plugin
  tells you an emulator is running when there are none.
- New "ddms" Console which receives the standard output of ddms.

0.1.5

- Support for new activity declaration inside AndroidManifest.xml
- fixed issue that prevented bin/ to be removed from the buildpath
  when converting project.

0.1.4

- Changes in the Manifest, now properly trigger a new package of the
  resources.

0.1.3

- Fixed the "fix project properties" action to remove old framework
  libraries, just not add new ones.

0.1.2

- aidl builder. The Android Resources PreBuilder now also converts
  aidl files into java files.
- New Project wizard now allows to make Wallpaper activities instead
  of gadgets (which are obsolete.)
- Launch shortcuts. Right click in the package explorer allow you to
  launch the application in debug or run mode directly without
  creating launch configurations.
- New project wizard and Project conversion now sets up the java doc
  path for android.zip
- Package builder now supports custom application assets placed in
  assets/ (which is now created automatically by the New Project
  Wizard).
- New action: Android Tools > Fix Project Properties, in the package
  explorer contextual menu. This allows you to fix the framework path
  (and its javadoc path) in case you change the sdk location.

0.1.1

- Fixed project convertor to add the framework library if missing.

0.1.0

- New project wizard.
- Python script-generated project convertor.
- Incremental builders.
- XML validation for resource files.
- Android Launch Configuration.
