Note to experimental Android plugin users: The experimental plugin will no longer be supported after version 0.11.0 (released October 25, 2017). That's because the experimental plugin is designed around a Software Component Model that Gradle announced they will no longer support (read their blog post here). Gradle has backported many features from the component model, which are now available with Android plugin 3.0.0, such as variant-aware dependency resolution, and api and implementation dependency configurations. Gradle is working on backporting built-in support for compiling C/C++ code, and the Android plugin will integrate that support when it becomes available. Until then, you can either keep using experimental plugin 0.11.0 with Android Studio 3.0 or later, or migrate to Android Studio's support for using external native build tools. IntroductionThe new experimental plugin is based on Gradle’s new component model mechanism, while allows significant reduction in configuration time. It also includes NDK integration for building JNI applications. This user guides provides details on how to use it and highlights the difference between the new plugin and the original plugin.CAVEAT: Note that this plugin is a preview of the plugin for feedback on performance and NDK integration. The Gradle API for the new component model is not final, which means each plugin will only work with a specific version of Gradle. Additionally, the DSL may also change. Requirements
Gradle RequirementsEach version of the experimental plugin requires a specific version of Gradle. Here is a list of required Gradle version.
Migrating from Traditional Android Gradle PluginA typical Android Studio project may have a directory structure as follows. File that needs to be change is highlighted in red: . ├── app/ │ ├── app.iml │ ├── build.gradle │ └── src/ ├── build.gradle ├── gradle/ │ └── wrapper/ │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradle.properties ├── gradlew* ├── gradlew.bat ├── local.properties ├── MyApplication.iml └── settings.gradle ./gradle/wrapper/gradle-wrapper.properties
#Wed Apr 10 15:27:10 PDT 2013 ./build.gradle
// Top-level build file where you can add configuration options common to all sub-projects/modules. ./app/build.gradle There are significant changes to the DSL of the plugin. We understand that many of the changes are frustrating and seem unnecessary, and our goal is to remove some of these current changes to minimize the migration process from the traditional plugin in the future. NOTE: There has been significant DSL improvements starting from version 0.6.0-alpha5 compare to previous versions. The example code here will not work for previous version. If you are using an older version of the plugin. Please refer to the user guide at https://sites.google.com/a/android.com/tools/tech-docs/new-build-system/gradle-experimental/0-4-0. DSL Changes:
Current DSL Limitations that will hopefully go away:
apply plugin: "com.android.model.application" model { applicationId "com.example.user.myapplication" buildConfigFields { create() { type "int" name "VALUE" value "1" } } } buildTypes { release { minifyEnabled false proguardFiles.add(file("proguard-rules.pro")) } } productFlavors { applicationId "com.app" } }
// Configures source set directory. sources { main { java { source { srcDir "src" } } } } } } Signing ConfigYou can refer to another model element using the $() syntax. To use this syntax, "-Dorg.gradle.model.dsl=true" has to be added as an argument to the Gradle command line for version below 2.10. This is useful for specifying signing configs. NOTE: android.signingConfigs currently must be outside of the android {} block. apply plugin: "com.android.model.application" model { android { compileSdkVersion 23 buildToolsVersion "23.0.2" buildTypes { release { signingConfig = $("android.signingConfigs.myConfig") } } } android.signingConfigs { create("myConfig") { storeFile "/path/to/debug.keystore" storePassword "android" keyAlias "androiddebugkey" keyPassword "android" storeType "jks" } } } Ndk IntegrationThe experimental plugin comes with NDK integration for creating native applications. To use the NDK integration:
apply plugin: 'com.android.model.application' model { ndk { moduleName "native" } } } *Note that the moduleName is required. It determines the name of the resulting native library. Source SetBy default, it will look in src/main/jni for C/C++ file. Configure android.sources to change the source directory. model { ndk { moduleName "native" } sources { main { jni { source { srcDir "src" } } } } } } The JNI source set may contain both C and C++ files. All files in the sub-directories are included. Files with extension '.c' is considered as C files, whereas C++ files has may have any of the following extensions: '.C', '.CPP', 'c++', '.cc, '.cp', '.cpp', '.cxx'. Files may be excluded with the exclude method, whereas include is ignored: model { android.sources { main { jni { source { include "someFile.txt" // This is ignored. exclude "**/excludeThisFile.c" } } } } } Other Build OptionsVarious build options can be set within the android.ndk { } block. For example, model { ndk { // All configurations that can be changed in android.ndk. moduleName "native" toolchain "clang" toolchainVersion "3.5" // Note that CFlags has a capital C, which is inconsistent with // the naming convention of other properties. This is a // technical limitation that will be resolved CFlags.add("-DCUSTOM_DEFINE") cppFlags.add("-DCUSTOM_DEFINE") ldFlags.add("-L/custom/lib/path") ldLibs.add("log") stl "stlport_static" } buildTypes { release { ndk { debuggable true } } } productFlavors { create("arm") { ndk { // You can customize the NDK configurations for each // productFlavors and buildTypes. abiFilters.add("armeabi-v7a") } } create("fat") { // If ndk.abiFilters is not configured, the application // compile and package all suppported ABI. } } } // You can modify the NDK configuration for each variant. components.android { binaries.afterEach { binary -> binary.mergedNdkConfig.cppFlags.add( "-DVARIANT=\"" + binary.name + "\"") } } } ABI Specific ConfigurationsYou can configure the settings for a specific ABI. model {android { compileSdkVersion 23 buildToolsVersion "23.0.2" ndk { moduleName "native" } abis { create("x86") { platformVersion "android-19" // platformVersion option is available from 0.8.0. CFlags.add("-DX86") } } } } Known Limitations
SamplesAdditional samples can be found at https://github.com/googlesamples/android-ndk.Multiple NDK ProjectsPlugin 0.4.0 added the preliminary support for NDK dependencies and the ability to create just a native library. Please be aware this is a preview of the direction we are going and the implementation is not complete. Note that while it is possible to compile the native project for Gradle, editing and debugging support in Android Studio is not yet implemented. Standalone NDK PluginIn gradle-experimental:0.4.0, a new plugin is created to allow creation of just the native library without creating an Android application or library. The DSL is similar to the application/library plugin. The following example build.gradle can create a libhello.so from sources in "src/main/jni" apply plugin: "com.android.model.native" model { android { compileSdkVersion 23 ndk { moduleName "hello" } } } Known Issues
NDK DependenciesThe syntax for specifying dependency follows the style of Gradle's future dependency system. You can set a dependency on an Android project or a specific file. For example, let say you have a subproject in "lib" using the standalone NDK plugin: lib/build.gradle: apply plugin: "com.android.model.native" model { android { compileSdkVersion 23 ndk { moduleName "hello" } sources { main { jni { exportedHeaders { srcDir "src/main/headers" } } } } } } Any projects with a JNI dependency will include the directories specified in the exportedHeaders.. You can add dependency on the lib project from your application for your JNI code: app/build.gradle: apply plugin: "com.android.model.application" main { jni { dependencies { project ":lib1" } } } } } } You can specify a build type and/or product flavor of your target project. Otherwise, the plugin will try to find the same build types and product flavor as your application. You can also specify the linkage type if you would like the native library to be linked statically. E.g. model { android.sources { To declare a dependency on a file, create a prebuilt library and add dependency on the library. E.g., model { repositories { libs(PrebuiltLibraries) { prebuilt { headers.srcDir "path/to/headers" binaries.withType(SharedLibraryBinary) { sharedLibraryFile = file("lib/${targetPlatform.getName()}/prebuilt.so") } } } } android.sources { You can add native dependency to either 'jniLibs' or 'jni' source set. When dependency is added to "jniLibs" the native library will be package into the application/library, but it will not be used for compiling the JNI code. E.g. model { android.sources { DSL ChangeThe plugin is still in experimental stage. DSL will change throughout the development of the plugin. This section documents the changes that occurs between different versions to help with migration. 0.6.0-alpha1 -> 0.6.0-alpha5
android { buildTypes { ... } }instead of: android.buildTypes { ... }
model { android.sources { is replaced by: model { repositories { prebuilt(PrebuiltLibraries) { binaries.withType(SharedLibraryBinary) { sharedLibraryFile = file("lib/${targetPlatform.getName()}/prebuilt.so") } } } android.sources { 0.2.x -> 0.4.0
Change Log0.6.0-alpha3
0.4.0
|
Technical docs > New Build System >