android: Update gradle layer build to use cmake
diff --git a/build-android/cmake/README.md b/build-android/cmake/README.md
new file mode 100644
index 0000000..70f68cd
--- /dev/null
+++ b/build-android/cmake/README.md
@@ -0,0 +1,40 @@
+Build Validation Layers with Android CMake
+=========================================
+Gradle's CMake library project in this directory builds layers into AAR;
+the project could be directly added into application's gradle projects
+
+Pre-requirements
+----------------
+Build ShaderC binary
+- Building from Github Repo source
+1. cd android-build
+2. ./update_external_sources_android.sh
+3. ./android-generate.sh
+
+Extra Steps if building from NDK's source tree
+```
+   cd ${your ANDROID_NDK_ROOT}/sources/third_party/shaderc
+   ndk-build  APP_ABI=armeabi-v7a APP_STL=gnustl_static NDK_TOOLCHAIN_VERSION=clang NDK_PROJECT_PATH=. APP_BUILD_SCRIPT=Android.mk libshaderc_combined
+```
+
+Adding layer module into Android Studio application project
+--------------------------------------------------------
+1. app's settings.gradle, add 
+```java
+    include ':layerLib'
+    project(':layerLib').projectDir = new File('/path/to/cmake/layerlib')
+```
+2. app's build.gradle:
+```java
+dependencies {
+    // force debug layer lib for packing
+    compile project(path: ':layerlib', configuration: 'debug')
+}
+```
+BUILD_IN_NDK variable in layerlib/CMakeLists.txt could detect whether the source is
+from NDK or github repo clone, and would configure the file paths accordingly
+
+Tested
+-----
+  Build on Mac OS, Nexus 5X test phone. Equvilaent build scripts for Windows OS are at the same directory.
+
diff --git a/build-android/cmake/layerlib/CMakeLists.txt b/build-android/cmake/layerlib/CMakeLists.txt
new file mode 100644
index 0000000..f7c27e8
--- /dev/null
+++ b/build-android/cmake/layerlib/CMakeLists.txt
@@ -0,0 +1,128 @@
+cmake_minimum_required(VERSION 3.4.1)
+
+# Validation layers could be built with code from
+#    github repo   OR
+#    ndk's snapshot
+# The file structure for glslang spir-V is different, adding BUILD_IN_NDK variable
+set(BUILD_IN_NDK OFF)
+if (CMAKE_CURRENT_SOURCE_DIR MATCHES "sources/third_party/vulkan/src")
+    set(BUILD_IN_NDK ON)
+endif()
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Werror \
+        -Wno-unused-function -Wno-unused-const-variable \
+        -Wno-c++98-compat-pedantic -DVK_PROTOTYPES \
+        -DVK_USE_PLATFORM_ANDROID_KHR")
+
+if (BUILD_IN_NDK)
+    # NDK directory structure:
+    #  $ANDROID_NDK/sources/third_party/
+    #        vulkan/src
+    #        shaderc/third_party (for glslang & spirv-tools )
+    # this build uses combined lib libshaderc.a for libSPIRV-Tools.a purpose
+    get_filename_component(SRC_DIR
+        "${ANDROID_NDK}/sources/third_party/vulkan/src" ABSOLUTE)
+    get_filename_component(EXTERNAL_DIR
+        "${SRC_DIR}/../../shaderc/third_party" ABSOLUTE)
+    get_filename_component(SPIRV_LIB
+        "${SRC_DIR}/../../shaderc/libs/${ANDROID_STL}/${ANDROID_ABI}/libshaderc.a"
+        ABSOLUTE)
+else ()
+    # github directory structure:
+    #   ${SRC_DIR}
+    #   ${SRC_DIR}/build-android/external (for glslang, spirv-tools & shaderc )
+    get_filename_component(SRC_DIR "${CMAKE_CURRENT_SOURCE_DIR}/../../.."  ABSOLUTE)
+    set(EXTERNAL_DIR "${SRC_DIR}/build-android/external")
+    set(SPIRV_LIB
+        "${EXTERNAL_DIR}/shaderc/android_test/obj/local/${ANDROID_ABI}/libSPIRV-Tools.a")
+endif()
+set(COMMON_DIR "${SRC_DIR}/build-android/generated")
+
+set(CMAKE_CXX_clone "${CMAKE_CXX_FLAGS}")
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVK_USE_PLATFORM_ANDROID_KHR \
+        -fvisibility=hidden")
+include_directories(${SRC_DIR}/include
+                    ${COMMON_DIR}/include
+                    ${SRC_DIR}/layers
+                    ${SRC_DIR}/loader)
+add_library(layer_utils STATIC
+        ${SRC_DIR}/layers/vk_layer_config.cpp
+        ${SRC_DIR}/layers/vk_layer_extension_utils.cpp
+        ${SRC_DIR}/layers/vk_layer_utils.cpp
+        ${SRC_DIR}/layers/vk_format_utils.cpp)
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_clone}")
+
+# assume shaderc already built externally
+add_library(SPIRV-Tools-prebuilt STATIC IMPORTED)
+set_target_properties(SPIRV-Tools-prebuilt PROPERTIES IMPORTED_LOCATION
+    ${SPIRV_LIB})
+
+# build core_validation layers which including shader validation
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DVK_USE_PLATFORM_ANDROID_KHR \
+                     -fvisibility=hidden")
+add_library(VkLayer_core_validation SHARED
+        ${SRC_DIR}/layers/core_validation.cpp
+        ${SRC_DIR}/layers/descriptor_sets.cpp
+        ${SRC_DIR}/layers/buffer_validation.cpp
+        ${SRC_DIR}/layers/vk_layer_table.cpp)
+target_include_directories(VkLayer_core_validation PRIVATE
+        ${SRC_DIR}/include
+        ${SRC_DIR}/layers
+        ${COMMON_DIR}/include
+        ${SRC_DIR}/loader
+        ${EXTERNAL_DIR}/glslang
+        ${EXTERNAL_DIR}/spirv-tools/include)
+target_link_libraries(VkLayer_core_validation PRIVATE
+        log layer_utils SPIRV-Tools-prebuilt)
+
+add_library(VkLayer_parameter_validation SHARED
+        ${SRC_DIR}/layers/parameter_validation.cpp
+        ${SRC_DIR}/layers/vk_layer_table.cpp)
+target_include_directories(VkLayer_parameter_validation PRIVATE
+        ${SRC_DIR}/include
+        ${COMMON_DIR}/include
+        ${SRC_DIR}/layers
+        ${SRC_DIR}/loader)
+target_link_libraries(VkLayer_parameter_validation PRIVATE log layer_utils)
+
+add_library(VkLayer_object_tracker SHARED
+        ${SRC_DIR}/layers/object_tracker.cpp
+        ${SRC_DIR}/layers/vk_layer_table.cpp)
+target_include_directories(VkLayer_object_tracker PRIVATE
+        ${SRC_DIR}/include
+        ${SRC_DIR}/layers
+        ${COMMON_DIR}/include
+        ${SRC_DIR}/loader)
+target_link_libraries(VkLayer_object_tracker PRIVATE log layer_utils)
+
+add_library(VkLayer_threading SHARED
+        ${SRC_DIR}/layers/threading.cpp
+        ${SRC_DIR}/layers/vk_layer_table.cpp)
+target_include_directories(VkLayer_threading PRIVATE
+        ${SRC_DIR}/include
+        ${SRC_DIR}/layers
+        ${COMMON_DIR}/include
+        ${SRC_DIR}/loader)
+target_link_libraries(VkLayer_threading PRIVATE log layer_utils)
+
+add_library(VkLayer_unique_objects SHARED
+        ${SRC_DIR}/layers/unique_objects.cpp
+        ${SRC_DIR}/layers/vk_layer_table.cpp)
+target_include_directories(VkLayer_unique_objects PRIVATE
+        ${SRC_DIR}/include
+        ${SRC_DIR}/layers
+        ${COMMON_DIR}/include
+        ${SRC_DIR}/loader)
+target_link_libraries(VkLayer_unique_objects PRIVATE log layer_utils)
+
+add_library(VkLayer_swapchain SHARED
+       ${SRC_DIR}/layers/swapchain.cpp
+       ${SRC_DIR}/layers/vk_layer_table.cpp)
+target_include_directories(VkLayer_swapchain PRIVATE
+       ${SRC_DIR}/include
+       ${SRC_DIR}/layers
+       ${COMMON_DIR}/include
+       ${SRC_DIR}/loader)
+target_link_libraries(VkLayer_swapchain PRIVATE log layer_utils)
+
+set(CMAKE_CXX_FLAGS "${CMAKE_CXX_clone}")
diff --git a/build-android/cmake/layerlib/build.gradle b/build-android/cmake/layerlib/build.gradle
new file mode 100644
index 0000000..efa8472
--- /dev/null
+++ b/build-android/cmake/layerlib/build.gradle
@@ -0,0 +1,39 @@
+apply plugin: 'com.android.library'
+
+android {
+    /*
+     * we are interested in only the debug version of layers, so ONLY publish debug version
+     * library, which will enforce building ONLY debug version, and packing only the debug
+     * version of layers. The document is at:
+     *     https://developer.android.com/studio/build/build-variants.html
+     *     http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Library-Publication
+     */
+    publishNonDefault  true
+
+    compileSdkVersion 25
+    buildToolsVersion "25.0.2"
+
+    defaultConfig {
+        minSdkVersion 24
+        targetSdkVersion 24
+        versionCode 1
+        versionName "1.0"
+        ndk.abiFilters 'armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'
+        externalNativeBuild {
+            cmake.arguments '-DANDROID_TOOLCHAIN=clang',
+                            '-DANDROID_STL=gnustl_static',
+                            '-DANDROID_PLATFORM=android-24'
+        }
+    }
+    externalNativeBuild {
+        cmake.path 'CMakeLists.txt'
+    }
+    buildTypes {
+        release {
+            minifyEnabled false
+            proguardFiles getDefaultProguardFile('proguard-android.txt'),
+                    'proguard-rules.pro'
+        }
+    }
+}
+
diff --git a/build-android/cmake/layerlib/proguard-rules.pro b/build-android/cmake/layerlib/proguard-rules.pro
new file mode 100644
index 0000000..b41fe70
--- /dev/null
+++ b/build-android/cmake/layerlib/proguard-rules.pro
@@ -0,0 +1,17 @@
+# Add project specific ProGuard rules here.
+# By default, the flags in this file are appended to flags specified
+# in ${ANDROID_SDK}/tools/proguard/proguard-android.txt
+# You can edit the include path and order by changing the proguardFiles
+# directive in build.gradle.
+#
+# For more details, see
+#   http://developer.android.com/guide/developing/tools/proguard.html
+
+# Add any project specific keep options here:
+
+# If your project uses WebView with JS, uncomment the following
+# and specify the fully qualified class name to the JavaScript interface
+# class:
+#-keepclassmembers class fqcn.of.javascript.interface.for.webview {
+#   public *;
+#}
diff --git a/build-android/cmake/layerlib/src/main/AndroidManifest.xml b/build-android/cmake/layerlib/src/main/AndroidManifest.xml
new file mode 100644
index 0000000..78c3704
--- /dev/null
+++ b/build-android/cmake/layerlib/src/main/AndroidManifest.xml
@@ -0,0 +1,9 @@
+<manifest xmlns:android="http://schemas.android.com/apk/res/android"
+    package="com.example.layerlib">
+
+    <application android:allowBackup="true" android:label="@string/app_name"
+        android:supportsRtl="true">
+
+    </application>
+
+</manifest>
diff --git a/build-android/cmake/layerlib/src/main/res/values/strings.xml b/build-android/cmake/layerlib/src/main/res/values/strings.xml
new file mode 100644
index 0000000..66f8389
--- /dev/null
+++ b/build-android/cmake/layerlib/src/main/res/values/strings.xml
@@ -0,0 +1,3 @@
+<resources>
+    <string name="app_name">Layer Library</string>
+</resources>