Changelog
=========

Report issues to [GitHub].

For Android Studio issues, follow the docs on the [Android Studio site].

[GitHub]: https://github.com/android-ndk/ndk/issues
[Android Studio site]: http://tools.android.com/filing-bugs

Announcements
-------------

 * GCC is no longer supported. It will be removed in NDK r18.

 * `libc++` is now the default STL for CMake and standalone toolchains. If you
   manually selected a different STL, we strongly encourage you to move to
   `libc++`. Note that ndk-build still defaults to no STL. For more details, see
   [this blog post](https://android-developers.googleblog.com/2017/09/introducing-android-native-development.html).

 * gnustl and stlport are deprecated and will be removed in NDK r18.

 * Support for ARMv5 (armeabi), MIPS, and MIPS64 has been removed. Attempting to
   build any of these ABIs will result in an error.

 * Support for ICS (android-14 and android-15) will be removed from r18.

 * The Play Store will require 64-bit support when uploading an APK beginning in
   August 2019. Start porting now to avoid surprises when the time comes. For
   more information, see [this blog post](https://android-developers.googleblog.com/2017/12/improving-app-security-and-performance.html).

r17b
----

 * [Issue 480]: Fixed libc++ header issues with `_FILE_OFFSET_BITS=64`.
 * [Issue 692]: Fixed ASAN for standalone toolchains with static STLs.
 * [Issue 697]: Pulled documentation updates for simpleperf.
 * [Issue 702]: Updated sysroot to fix missing libc symbols.
 * [Issue 704]: Updated shaderc/vulkan-validation-layers sources.
 * [Issue 708]: Fixed introduced API tag for
   `pthread_cond_timedwait_monotonic_nmp` to make it available on ICS.

[Issue 480]: https://github.com/android-ndk/ndk/issues/480
[Issue 692]: https://github.com/android-ndk/ndk/issues/692
[Issue 697]: https://github.com/android-ndk/ndk/issues/697
[Issue 702]: https://github.com/android-ndk/ndk/issues/702
[Issue 704]: https://github.com/android-ndk/ndk/issues/704
[Issue 708]: https://github.com/android-ndk/ndk/issues/708

Changes
-------

 * Updated Clang to build 4691093, based on r316199.
     * [Issue 313]: LTO now works on Windows.
     * [Issue 527]: [Undefined Behavior Sanitizer] now works for NDK binaries.
     * [Issue 593]: Clang now automatically passes `--eh-frame-hdr` to the
       linker even for static executables, fixing exception handling.
 * Updated gtest to upstream revision 0fe96607d85cf3a25ac40da369db62bbee2939a5.
 * `libandroid_support` is no longer used when your NDK API level is greater
   than or equal to 21 (Lollipop). Build system maintainers: be sure to update
   your build systems to account for this.
 * The platform static libraries (libc.a, libm.a, etc.) have been updated.
     * All NDK platforms now contain a modern version of these static libraries.
       Previously they were all Gingerbread (perhaps even older) or Lollipop.
     * Prior NDKs could not use the static libraries with a modern NDK API level
       because of symbol collisions between libc.a and libandroid_support. This
       has been solved by removing libandroid_support for modern API levels. A
       side effect of this is that you must now target at least android-21 to
       use the static libraries, but these binaries will still work on older
       devices.
 * Fixed parsing of the NDK revision in CMake. NDK version information is now
   available in the following CMake variables:
     * `ANDROID_NDK_REVISION`: The full string in the source.properties file.
     * `ANDROID_NDK_MAJOR`: The major revision of the NDK. For example: the 16
       in r16b.
     * `ANDROID_NDK_MINOR`: The minor revision of the NDK. For example: the b
       (represented as 1) in r16b.
     * `ANDROID_NDK_BUILD`: The build number of the NDK. This is 0 in the case
       of a local development build.
     * `ANDROID_NDK_BETA`: The beta version of the NDK. This is 0 for a stable
       release.
 * Added support for `APP_WRAP_SH` to ndk-build.
     * This variable points to a shell script (relative to your Android.mk) that
       will be installed as a [wrap.sh] file in your APK.
     * Available in both an ABI-generic form (`APP_WRAP_SH`), which will install
       a single script for every ABI, and an ABI-specific form
       (`APP_WRAP_SH_arm64-v8a`, etc) to allow for per-ABI customization of the
       wrap.sh script.
 * [Issue 540]: ndk-build now installs sanitizer runtime libraries to your out
   directory for inclusion in your APK. Coupled with [wrap.sh], this removes the
   requirement of rooting your device to use sanitizers.
 * When using ASAN, ndk-build will install a wrap.sh file to set up ASAN for
   your app if you have not specified your own wrap.sh. If you have specified
   your own wrap.sh, you can add ASAN support to it as described
   [here](https://github.com/google/sanitizers/wiki/AddressSanitizerOnAndroidO).
 * [Issue 614]: ndk-build and CMake no longer pass `-fno-integrated-as` for
   arm32 by default.  If your project contains hand written assembly, you may
   need to pass this flag.
 * ion.h is no longer a part of the NDK. This file defined an API that is not
   consistent across devices.

[Undefined Behavior Sanitizer]: https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html
[wrap.sh]: https://developer.android.com/ndk/guides/wrap-script.html
[Issue 313]: https://github.com/android-ndk/ndk/issues/313
[Issue 527]: https://github.com/android-ndk/ndk/issues/527
[Issue 540]: https://github.com/android-ndk/ndk/issues/540
[Issue 593]: https://github.com/android-ndk/ndk/issues/593
[Issue 614]: https://github.com/android-ndk/ndk/issues/614

Known Issues
------------

 * This is not intended to be a comprehensive list of all outstanding bugs.
 * [Issue 360]: `thread_local` variables with non-trivial destructors will cause
   segfaults if the containing library is `dlclose`ed on devices running M or
   newer, or devices before M when using a static STL. The simple workaround is
   to not call `dlclose`.
 * [Issue 70838247]: Gold emits broken debug information for AArch64. AArch64
   still uses BFD by default.

[Issue 360]: https://github.com/android-ndk/ndk/issues/360
[Issue 70838247]: https://issuetracker.google.com/70838247
