diff options
author | Rich Slogar <rslogar@google.com> | 2014-11-06 17:15:28 -0800 |
---|---|---|
committer | Joe Fernandez <joefernandez@google.com> | 2014-12-07 20:51:00 -0800 |
commit | 4083327e0eee402ebcf7b223c34a07d652db6605 (patch) | |
tree | 113eb0d59c2f5a3c14bba7fb3a44e7665eebb11a /docs/html/sdk/installing | |
parent | d0c79c4e95da9aa75847d7539272e278a7cd97f0 (diff) | |
download | frameworks_base-4083327e0eee402ebcf7b223c34a07d652db6605.zip frameworks_base-4083327e0eee402ebcf7b223c34a07d652db6605.tar.gz frameworks_base-4083327e0eee402ebcf7b223c34a07d652db6605.tar.bz2 |
docs:build system updates [CP]
Cherry-pick from Change-Id: I8a5810824cbef3bb81173d80827075d3754d7573
Change-Id: I1e948a18a5e7cc58ae712c50887e69ab8600e536
Diffstat (limited to 'docs/html/sdk/installing')
-rw-r--r-- | docs/html/sdk/installing/studio-build.jd | 1082 |
1 files changed, 58 insertions, 1024 deletions
diff --git a/docs/html/sdk/installing/studio-build.jd b/docs/html/sdk/installing/studio-build.jd index bff3bc0..c80368f 100644 --- a/docs/html/sdk/installing/studio-build.jd +++ b/docs/html/sdk/installing/studio-build.jd @@ -1,4 +1,4 @@ -page.title=Building Your Project with Gradle +page.title=Build System Overview @jd:body @@ -6,1066 +6,100 @@ page.title=Building Your Project with Gradle <div id="qv"> <h2>In this document</h2> <ol> - <li><a href="#overviewBuild">Overview of the Build System</a> - <ol> - <li><a href="#buildConf">Build configuration</a></li> - <li><a href="#buildConv">Build by convention</a></li> - <li><a href="#projectModules">Projects and modules</a></li> - <li><a href="#dependencies">Dependencies</a></li> - <li><a href="#buildTasks">Build tasks</a></li> - <li><a href="#gradleWrapper">The Gradle wrapper</a></li> - </ol> - </li> - <li><a href="#creatingBuilding">Create and Build a Project</a> - <ol> - <li><a href="#createProject">Create a project</a></li> - <li><a href="#projectStructure">Project structure</a></li> - <li><a href="#addLibModule">Add a library module</a></li> - <li><a href="#buildProject">Build the project</a></li> - <li><a href="#buildCmd">Build from the command line</a></li> - <li><a href="#buildRelease">Build a release version</a></li> - </ol> - </li> - <li><a href="#configBuild">Configure the Build</a> - <ol> - <li><a href="#buildFileBasics">Build file basics</a></li> - <li><a href="#declareDeps">Declare dependencies</a></li> - <li><a href="#runProguard">Run ProGuard</a></li> - <li><a href="#configureSigning">Configure signing settings</a></li> - <li><a href="#workBuildVariants">Work with build variants</a></li> - </ol> - </li> - <li><a href="#reference">Reference</a></li> + <li><a href="#detailed-build">A Detailed Look at the Build Process</a> </li> </ol> <h2>See also</h2> <ul> -<li><a href="{@docRoot}sdk/installing/studio.html"> -Getting Started with Android Studio</a></li> -<li><a href="{@docRoot}sdk/installing/studio-tips.html"> -Android Studio Tips and Tricks</a></li> -<li><a href="{@docRoot}sdk/installing/migrate.html"> -Migrating from Eclipse</a></li> + <li><a href="{@docRoot}sdk/installing/studio.html"> + Getting Started with Android Studio</a></li> + <li><a href="{@docRoot}tools/studio/index.html">Android Studio Basics</a></li> + <li><a href="{@docRoot}tools/eclipse/migrate-adt.html">Migrating from Eclipse</a></li> </div> </div> -<a class="notice-developers-video" -href="https://developers.google.com/events/io/sessions/324603352"> +<a class="notice-developers-video" href="https://www.youtube.com/watch?v=LCJAgPkpmR0#t=504"> <div> <h3>Video</h3> - <p>What's New in Android Developer Tools</p> + <p>The New Android SDK Build System</p> </div> </a> -<p>The Android Studio build system is the toolkit you use to build, test, run and package -your apps. The build system is independent from Android Studio, so you can invoke it from Android -Studio or from the command line. After you write your application, you can use the features -of the build system to:</p> +<p>The Android build system is the toolkit you use to build, test, run and package +your apps. The build system can run as an integrated tool from the Android Studio menu and +independently from the command line. You can use the features of the build system to:</p> <ul> <li>Customize, configure, and extend the build process.</li> - <li>Create multiple APKs for your app with different features using the same project.</li> - <li>Reuse code and resources.</li> + <li>Create multiple APKs for your app with different features using the same project and + modules.</li> + <li>Reuse code and resources across source sets.</li> </ul> -<p>The flexibility of the Android Studio build system enables you to achieve all of this without -modifying your app's core project files.</p> +<p>The flexibility of the Android build system enables you to achieve all of this without +modifying your app's core source files. To build an Android Studio project, see +<a href="{@docRoot}tools/building/building-studio.html">Building and Running from Android Studio</a>. +To configure custom build settings in an Android Studio project, see +<a href="{@docRoot}tools/building/configuring-gradle.html">Configuring Gradle Builds</a>.</p> -<h2 id="overviewBuild">Overview of the Build System</h2> +<h2 id="detailed-build">A Detailed Look at the Build Process</h2> -<p>The Android Studio build system consists of an Android plugin for <em>Gradle</em>. -<a href="http://www.gradle.org/">Gradle</a> is an advanced build toolkit that manages dependencies -and allows you to define custom build logic. Many software projects use Gradle to manage their -builds. The Android plugin for Gradle does not depend on Android Studio, although Android Studio -is fully integrated with it. This means that:</p> +<p>The build process involves many tools and processes that generate intermediate files on the +way to producing an <code>.apk</code>. If you are developing in Android Studio, the complete build +process is done every time you run the Gradle build task for your project or modules. The build +process is very flexible so it's useful, however, to understand what is happening under the hood +since much of the build process is configurable and extensible. The following diagram depicts the +different tools and processes that are involved in a build:</p> -<ul> - <li>You can build your Android apps from the command line on your machine or on machines - where Android Studio is not installed (such as continuous integration servers).</li> - <li>You can build your Android apps from Android Studio with the same custom build - configuration and logic as when you build from the command line.</li> -</ul> - -<p>The output of the build is the same whether you are building a project from the command line, -on a remote machine, or using Android Studio.</p> - -<h3 id="buildConf">Build configuration</h3> - -<p>The build configuration for your project is defined inside <em>Gradle build files</em>, -which are plain text files that use the syntax and options from Gradle and the Android plugin -to configure the following aspects of your build:</p> - -<ul> - <li><em>Build variants</em>. The build system can generate multiple APKs with different - configurations for the same project. This is useful when you want to build different - versions of your application without having to create a separate project for each of - them.</li> - <li><em>Dependencies</em>. The build system manages project dependencies and supports - dependencies from your local filesystem and from remote repositories. This prevents you - from having to search, download, and copy binary packages for your dependencies into your - project directory.</li> - <li><em>Manifest entries</em>. The build system enables you to specify values for some - elements of the manifest file in the build configuration. These new values override the - existing values in the manifest file. This is useful if you want to generate multiple APKs - for your project where each of them has a different package name, minimum SDK version, or - target SDK version.</li> - <li><em>Signing</em>. The build system enables you to specify signing settings in the build - configuration, and it can sign your APKs during the build process.</li> - <li><em>ProGuard</em>. The build system enables you to specify a different - <a href="{@docRoot}tools/help/proguard.html">ProGuard</a> rules - file for each build variant. The build system can run ProGuard to obfuscate your classes - during the build process.</li> - <li><em>Testing</em>. The build system generates a test APK from the test sources in your - project, so you do not have to create a separate test project. The build system can run - your tests during the build process.</li> -</ul> - -<p>Gradle build files use <em>Groovy</em> syntax. -<a href="http://groovy.codehaus.org/">Groovy</a> is a dynamic language that you can use to -define custom build logic and to interact with the Android-specific elements provided by the -Android plugin for Gradle.</p> - -<h3 id="buildConv">Build by convention</h3> - -<p>The Android Studio build system assumes <em>sensible defaults</em> for the project structure -and other build options. If your project adheres to these conventions, your Gradle build files are -very simple. When some these conventions do not apply to your project, the flexibility of the -build system allows you to configure almost every aspect of the build process. For example, if -the sources for your project are located in a different directory than the default, you can -specify this location in the build file.</p> - -<h3 id="projectModules">Projects and modules</h3> - -<p>A <em>project</em> in Android Studio represents a complete Android app. Android Studio -projects consist of one or more modules. A <em>module</em> is a component of your app that you can -build, test, or debug independently. Modules contain the source code and resources for your app. -Android Studio projects contain three kinds of modules:</p> - -<ul> - <li><em>Java library modules</em> contain reusable code. The build system generates a - JAR package for Java library modules.</li> - <li><em>Android library modules</em> contain reusable Android-specific code and resources. - The build system generates an AAR (Android ARchive) package for library modules.</li> - <li><em>Android application modules</em> contain application code and may depend on library - modules, although many Android apps consists of only one application module. The build - system generates an APK package for application modules.</li> -</ul> - -<p>Android Studio projects contain a top-level Gradle build file that lists all the modules in -the project, and each module contains its own Gradle build file.</p> - -<h3 id="dependencies">Dependencies</h3> - -<p>The Android Studio build system manages project dependencies and supports module dependencies, -local binary dependencies, and remote binary dependencies.</p> - -<dl> - <dt><em>Module Dependencies</em></dt> - <dd><p>A project module can include in its build file a list of other modules it depends on. - When you build this module, the build system assembles and includes the required - modules.</p></dd> - <dt><em>Local Dependencies</em></dt> - <dd><p>If you have binary archives in your local filesystem that a module depends on, such as - JAR files, you can declare these dependencies in the build file for that - module.</p></dd> - <dt><em>Remote Dependencies</em></dt> - <dd><p>When some of your dependencies are available in a remote repository, you do not have - to download them and copy them into your project. The Android Studio build system supports - remote <em>Maven</em> dependencies. <a href="http://maven.apache.org/">Maven</a> is a - popular software project management tool that helps organize project dependencies using - repositories.</p> - <p>Many popular software libraries and tools are available in public Maven repositories. - For these dependencies you only have to specify their Maven coordinates, which uniquely - identify each element in a remote repository. The format for Maven coordinates used in the - build system is <code>group:name:version</code>. For example, the Maven coordinates for - version 16.0.1 of the Google Guava libraries are - <code>com.google.guava:guava:16.0.1</code>.</p> - <p>The <a href="http://search.maven.org">Maven Central Repository</a> is widely used to - distribute many libraries and tools.</p> - </dd> -</dl> - -<h3 id="buildTasks">Build tasks</h3> - -<p>The Android Studio build system defines a hierarchical set of build tasks: the top-level -tasks invoke the tasks they depend on to produce the necessary outcomes. The build system -provides project tasks to build your app and module tasks to build modules independently.</p> - -<p>You can view the list of available tasks and invoke any task from Android Studio and from -the command line, as described in -<a href="#buildProject">Build the project in Android Studio</a> and and -<a href="#buildCmd">Build the project from the command line</a>.</p> - -<h3 id="gradleWrapper">The Gradle wrapper</h3> - -<p>Android Studio projects contain the <em>Gradle wrapper</em>, which consists of:</p> - -<ul> - <li>A JAR file</li> - <li>A properties file</li> - <li>A shell script for Windows platforms</li> - <li>A shell script for Mac and Linux platforms</li> -</ul> - -<p class="note"><strong>Note:</strong> You should submit all of these files to your source -control system.</p> - -<p>Using the Gradle wrapper (instead of the local Gradle installation) ensures that -you always run the version of Gradle defined in the properties file. To configure your project -to use a newer version of Gradle, edit the properties file and specify the new version there. - -<p>Android Studio reads the properties file from the Gradle wrapper directory inside your project -and runs the wrapper from this directory, so you can seamlessly work with multiple projects -that require different versions of Gradle.</p> - -<p class="note"><strong>Note:</strong> Android Studio does not use the shell scripts, so any -changes you make to them won't work when building from the IDE. You should define your custom -logic inside Gradle build files instead.</p> - -<p>You can run the shell scripts to build your project from the command line on your development -machine and on other machines where Android Studio is not installed.</p> - - -<h2 id="creatingBuilding">Create and Build an Android Studio Project</h2> - -<p>This section builds on the concepts presented above and shows you how to:</p> - -<ul> - <li>Create projects and modules.</li> - <li>Work with the project structure.</li> - <li>Edit build files to configure the build process.</li> - <li>Build and run your app.</li> -</ul> - -<h3 id="createProject">Create a project in Android Studio</h3> - -<p>To create a new project in Android Studio:</p> - -<ol> - <li>Click <strong>File</strong> and select <strong>New Project</strong>.</li> - <li>In the window that appears, enter "BuildSystemExample" in the <em>Application</em> - name field.</li> - <li>Leave the rest of the values unchanged and click <strong>Next</strong>.</li> - <li>Leave the default icon settings unchanged and click <strong>Next</strong>.</li> - <li>Select <em>Blank Activity</em> and click <strong>Next</strong>.</li> - <li>Leave the default activity and layout names unchanged and click - <strong>Finish</strong>.</li> -</ol> - -<p>Figure 1 shows how the Android Studio window looks like after creating the project.</p> - -<img src="{@docRoot}images/tools/as-mainscreen.png" alt="" /> -<p class="img-caption"><strong>Figure 1.</strong> Previewing your app.</p> - -<h3 id="projectStructure">The project structure</h3> - -<p>Android Studio projects contain an application module by default (<code>app</code>). -Table 1 lists where the main components of your app are located inside this module.</p> - -<p class="table-caption" id="table1"> -<strong>Table 1.</strong> Default location of the components in an application module.</p> -<table> - <tr> - <th scope="col">Component</th> - <th scope="col">Location</th> - </tr> - <tr> - <td>Source files</td> - <td><code>app/src/main/java/<package>/</code></td> - </tr> - <tr> - <td>Resource files</td> - <td><code>app/src/main/res/</code></td> - </tr> - <tr> - <td>Manifest file</td> - <td><code>app/src/main/AndroidManifest.xml</code></td> - </tr> - <tr> - <td>Build file</td> - <td><code>app/build.gradle</code></td> - </tr> -</table> - -<p>When you add additional modules to your project, the directory structure for each module is -similar to the one shown in table 1, replacing <code>app</code> by the name of the module.</p> - -<h3 id="addLibModule">Add a library module</h3> - -<p>This section shows you how to add a library module to your project and how to add this -library as a dependency of an application module.</p> - -<h4>Create a new library module</h4> - -<p>It is good development practice to group functionality that you may reuse in other apps inside -a library module. To create a library module inside the <code>BuildSystemExample</code> -project:</p> - -<ol> - <li>Click <strong>File</strong> and select <strong>New Module</strong>.</li> - <li>On the window that appears, select <strong>Android Library</strong> and click - <strong>Next</strong>.</li> - <li>Leave the default module name (<code>lib</code>) unchanged and click - <strong>Next</strong>.</li> - <li>Select <em>Blank Activity</em> and click <strong>Next</strong>.</li> - <li>Type "LibActivity1" on the <em>Activity Name</em> field and click - <strong>Finish</strong>.</li> -</ol> - -<p>The project now contains two modules, <code>app</code> and <code>lib</code>, with one activity -in each module.</p> - -<h4 id="openActFromLib">Open an activity from a library module</h4> - -<p>Library modules contain activities and other logic that one or more application modules reuse. -In this example, <code>MainActivity</code> in the app module opens <code>LibActivity1</code> -from the <code>lib</code> module. To open <code>LibActivity1</code> from -<code>MainActivity</code>:</p> - -<ol> - <li> - <p>Edit the layout file for <code>MainActivity</code> in the <code>app</code> module. - This file is located in <code>app/src/main/res/layout/activity_main.xml</code>. Replace - the contents of this file with the following:</p> - <p><pre> -<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:tools="http://schemas.android.com/tools" - android:layout_width="match_parent" - android:layout_height="match_parent" - tools:context="com.buildsystemexample.app.MainActivity"> - - <Button - android:id="@+id/button1" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/button1" - android:onClick="onButton1Clicked"/> - -</LinearLayout> -</pre></p> - </li> - <li> - In this layout file, click on the line that contains - <code>android:text="@string/button1"</code> and press <strong>Alt+Enter</strong>. Follow - the suggestion from Android Studio to add a string resource with the value - "Open LibActivity1". - </li> - <li> - In this layout file, click on the line that contains - <code>android:onClick="onButton1Clicked"</code> and press <strong>Alt+Enter</strong>. - Follow the suggestion from Android Studio to add the <code>onButton1Clicked</code> - method to <code>MainActivity</code>. - </li> - <li> - <p>Copy the following code inside the <code>onButton1Clicked</code> method in - <code>MainActivity</code>:</p> - <p><pre> -public void onButton1Clicked(View view) { - Intent intent = new Intent(this, LibActivity1.class); - startActivity(intent); -}</pre></p> - </li> - <li> - Click on <code>LibActivity1</code> in the first line inside the - <code>onButton1Clicked</code> method of <code>MainActivity</code> and press - <strong>Alt+Enter</strong>. Follow the suggestion from Android Studio to add an import - for <code>LibActivity1</code> from the lib module. - </li> -</ol> - -<p>When the user taps the <strong>Open LibActivity1</strong> button on <code>MainActivity</code> -(from the <code>app</code> module), <code>LibActivity1</code> (from the <code>lib</code> module) -starts.</p> - -<h4>Add a dependency on a library module</h4> - -<p>The <code>app</code> module now depends on the <code>lib</code> module, but the build system -does not know about this yet. Edit the build file for the <code>app</code> module ( -<code>app/build.gradle</code>) and add a dependency on the <code>lib</code> module:</p> - -<pre> -... -dependencies { - ... - compile project(":lib") -} -</pre> - -<p>The <code>lib</code> module can still be built and tested independently, and the build system -creates an AAR package for it that you could reuse in other projects.</p> - -<h3 id="buildProject">Build the project in Android Studio</h3> - -<p>To build the project on Android Studio, click <strong>Build</strong> and select -<strong>Make Project</strong>. The status bar at the bottom of the window shows the current -progress of the build:</p> - -<p><code>Gradle: Executing tasks: [:app:assembleDebug, :lib:bundleDebug]</code></p> - -<p class="note">If your project uses product flavors, Android Studio invokes the task for the -selected build variant. For more information, see <a href="#workBuildVariants">Work with build -variants.</a></p> - -<p>Click <img src="{@docRoot}images/tools/as-gradlebutton.png" alt="" -style="vertical-align:bottom;margin:0;"/> on the bottom -right part of the window to show the <em>Gradle Console</em>, as shown in figure 2.</p> - -<img src="{@docRoot}images/tools/as-gradleconsole.png" alt="" /> -<p class="img-caption"><strong>Figure 2.</strong> The Gradle Console in Android Studio.</p> - -<p>The Gradle Console shows the build tasks and subtasks that the build system runs for -Android Studio. If the build fails, you can find more details on the console. To hide the Gradle -Console, click <img src="{@docRoot}images/tools/as-gradlebutton.png" alt="" -style="vertical-align:bottom;margin:0;"/> again.</p> - -<p>To view the list of all available build tasks in Android Studio, click <strong>Gradle</strong> -on the right side of the IDE window. The <em>Gradle tasks</em> panel appears as shown in -figure 3. Double-click any build task to run it in Android Studio. To hide the <em>Gradle tasks</em> -panel, click <strong>Gradle</strong> again.</p> - -<img src="{@docRoot}images/tools/as-gradlepanel.png" alt="" /> -<p class="img-caption"><strong>Figure 3.</strong> The list of build tasks in Android Studio.</p> - - -<h3 id="buildCmd">Build the project from the command line</h3> - -<p>To build the project from the command line, open a terminal window and navigate to the project -root. On Windows platforms, type this command:</p> - -<pre> -> gradlew.bat assembleDebug -</pre> - -<p>On Mac OS and Linux platforms, type these commands:</p> - -<pre> -$ chmod +x gradlew -$ ./gradlew assembleDebug -</pre> - -<p>The first command (<code>chmod</code>) adds the execution permission to the Gradle wrapper -script and is only necessary the first time you build this project from the command line.</p> - -<p>The output of <code>gradlew</code> is similar to the output in the Gradle Console from -figure 2.</p> - -<p>The <code>assembleDebug</code> build task builds the debug version of your app and signs it -with the default local certificate, so that you can install it on the emulator and on real devices -for debugging purposes.</p> - -<p>After you build the project, the output APK for the app module is located in -<code>app/build/outputs/apk/</code>, and the output AAR for the lib module is located in -<code>lib/build/outputs/libs/</code>.</p> - -<p>To see a list of all available build tasks for your project, type this command:</p> - -<pre> -$ ./gradlew tasks -</pre> - - -<h3 id="buildRelease">Build a release version</h3> - -<p>You can build the release version of your application from the command line or using Android -Studio. To build it from the command line, invoke the <code>assembleRelease</code> build task using -the Gradle wrapper script (<code>gradlew assembleRelease</code>). To build it from Android -Studio:</p> - -<ol> - <li>Click <strong>Gradle</strong> on the right side of the IDE window.</li> - <li>On the <em>All tasks</em> section of the sidebar that appears, expand - <strong>BuildSystemExample</strong>.</li> - <li>Expand <strong>:app</strong> and double-click <strong>assembleRelease</strong>.</li> -</ol> - -<p>You can use this procedure to invoke any build task from Android Studio.</p> - - - -<h2 id="configBuild">Configure the Build</h2> - -<p>This section uses the <code>BuildSystemExample</code> project from the previous section and -shows you how to:</p> - -<ul> - <li>Use the syntax from the Android plugin for Gradle in build files.</li> - <li>Declare dependencies.</li> - <li>Configure ProGuard settings.</li> - <li>Configure signing settings.</li> - <li>Work with build variants.</li> -</ul> - -<h3 id="buildFileBasics">Build file basics</h3> - -<p>Android Studio projects contain a top-level build file and a build file for each module. The -build files are called <code>build.gradle</code>, and they are plain text files that use -<a href="http://groovy.codehaus.org">Groovy</a> syntax to configure the build with the elements -provided by the Android plugin for Gradle. In most cases, you only need to edit the build files -at the module level. For example, the build file for the app module in the -<code>BuildSystemExample</code> project looks like this:</p> - -<pre> -apply plugin: 'android' - -android { - compileSdkVersion 19 - buildToolsVersion "19.0.0" - - defaultConfig { - minSdkVersion 8 - targetSdkVersion 19 - versionCode 1 - versionName "1.0" - } - buildTypes { - release { - runProguard true - proguardFiles getDefaultProguardFile('proguard-android.txt'), \ - 'proguard-rules.txt' - } - } -} - -dependencies { - compile project(":lib") - compile 'com.android.support:appcompat-v7:19.0.1' - compile fileTree(dir: 'libs', include: ['*.jar']) -} -</pre> - -<p><code>apply plugin: 'android'</code> applies the Android plugin for Gradle to this build. -This adds Android-specific build tasks to the top-level build tasks and makes the -<code>android {...}</code> element available to specify Android-specific build options.</p> - -<p><code>android {...}</code> configures all the Android-specific build options:</p> - -<ul> - <li>The <code>compileSdkVersion</code> property specifies the compilation target.</li> - <li><p>The <code>buildToolsVersion</code> property specifies what version of the build tools - to use. To install several versions of the build tools, use the SDK Manager.</p> - <p class="note"><strong>Note:</strong> Always use a build tools version whose major - revision number is higher or equal to that of your compilation target and target SDK.</p> - </li> - <li><p>The <code>defaultConfig</code> element configures core settings and - entries in the manifest file (<code>AndroidManifest.xml</code>) dynamically from the - build system. The values in <code>defaultConfig</code> override those in the manifest - file.</p> - <p>The configuration specified in the <code>defaultConfig</code> element applies - to all build variants, unless the configuration for a build variant overrides some - of these values.</p> - </li> - <li>The <code>buildTypes</code> element controls how to build and package your app. - By default, the build system defines two build types: <em>debug</em> and - <em>release</em>. The debug build type includes debugging symbols and is signed with - the debug key. The release build type is not signed by default. - In this example the build file configures the release version to use - ProGuard.</li> -</ul> - -<p>The <code>dependencies</code> element is outside and after the <code>android</code> element. -This element declares the dependencies for this module. Dependencies are covered in the following -sections.</p> - -<p class="note"><strong>Note:</strong> When you make changes to the build files in your project, -Android Studio requires a project sync to import the build configuration changes. Click -<strong>Sync Now</strong> on the yellow notification bar that appears for Android Studio -to import the changes.</p> - -<img src="{@docRoot}images/tools/as-gradlesync.png" alt="" /> -<p class="img-caption"><strong>Figure 4.</strong> Sync the project in Android Studio.</p> - -<h3 id="declareDeps">Declare dependencies</h3> - -<p>The <code>app</code> module in <code>BuildSystemExample</code> declares three -dependencies:</p> - -<pre> -... -dependencies { - // Module dependency - compile project(":lib") - - // Remote binary dependency - compile 'com.android.support:appcompat-v7:19.0.1' - - // Local binary dependency - compile fileTree(dir: 'libs', include: ['*.jar']) -} -</pre> - -<p>Each of these dependencies is described below. The build system adds all the -<code>compile</code> dependencies to the compilation classpath and includes them in the final -package.</p> - -<h4>Module dependencies</h4> - -<p>The <code>app</code> module depends on the <code>lib</code> module, because -<code>MainActivity</code> launches <code>LibActivity1</code> as described in -<a href="#openActFromLib">Open an Activity from a Library Module</a>.</p> - -<p><code>compile project(":lib")</code> declares a dependency on the <code>lib</code> -module of <code>BuildSystemExample</code>. When you build the <code>app</code> module, -the build system assembles and includes the <code>lib</code> module.</p> - -<h4>Remote binary dependencies</h4> - -<p>The <code>app</code> and <code>lib</code> modules both use the <code>ActionBarActivity</code> -class from the Android Support Library, so these modules depend on it.</p> - -<p><code>compile 'com.android.support:appcompat-v7:19.0.1'</code> declares a dependency on -version 19.0.1 of the Android Support Library by specifying its Maven coordinates. The Android Support -Library is available in the <em>Android Repository</em> package of the Android SDK. If your -SDK installation does not have this package, download and install it using the SDK Manager.</p> - -Android Studio configures -projects to use the Maven Central Repository by default. (This configuration is included in the -top-level build file for the project.)</p> - -<h4>Local binary dependencies</h4> - -<p>The modules in <code>BuildSystemExample</code> do not use any binary dependencies from the -local file system. If you have modules that require local binary dependencies, copy the JAR -files for these dependencies into <code><moduleName>/libs</code> inside your project.</p> - -<p><code>compile fileTree(dir: 'libs', include: ['*.jar'])</code> tells the build system that any -JAR file inside <code>app/libs</code> is a dependency and should be included in the compilation -classpath and in the final package.</p> - -<p>For more information about dependencies in Gradle, see -<a href="http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html">Dependency -Management Basics</a> in the Gradle User Guide.</p> - -<h3 id="runProguard">Run ProGuard</h3> - -<p>The build system can run -<a href="http://developer.android.com/tools/help/proguard.html">ProGuard</a> to obfuscate your -classes during the build process. In <code>BuildSystemExample</code>, modify the build file for -the app module to run ProGuard for the release build:</p> - -<pre> -... -android { - ... - buildTypes { - release { - runProguard true - proguardFiles getDefaultProguardFile('proguard-android.txt'), \ - 'proguard-rules.txt' - } - } -} -... -</pre> - -<p><code>getDefaultProguardFile('proguard-android.txt')</code> obtains the default ProGuard -settings from the Android SDK installation. Android Studio adds the module-specific rules file -<code>proguard-rules.txt</code> at the root of the module, where you can add custom ProGuard -rules.</p> - -<h3 id="configureSigning">Configure signing settings</h3> - -<p>The debug and the release versions of the app differ on whether the application can be -debugged on secure devices and on how the APK is signed. The build system signs the debug -version with a default key and certificate using known credentials to avoid a password prompt at -build time. The build system does not sign the release version unless you explicitly define a -signing configuration for this build.</p> - -<p>To sign the release version of <code>BuildSystemExample</code>:</p> - -<ol> - <li><p>Copy your release key to the root directory of the <code>app</code> module - (<code>app/</code>).</p> - <p>This ensures that the build system can find your key when you move the location of your - project or when you build the project on a different machine. If you do not have a release - key, you can generate one as described in - <a href="{@docRoot}tools/publishing/app-signing.html">Signing your Applications</a>.</p> - </li> - <li><p>Add the signing configuration to the build file for the <code>app</code> module:</p> - <p><pre> -... -android { - ... - defaultConfig { ... } - signingConfigs { - release { - storeFile file("myreleasekey.keystore") - storePassword "password" - keyAlias "MyReleaseKey" - keyPassword "password" - } - } - buildTypes { - release { - ... - signingConfig signingConfigs.release - } - } -} -... -</pre></p> - </li> - <li>Invoke the <code>assembleRelease</code> build task from Android Studio or from the command - line.</li> -</ol> - -<p>The package in <code>app/build/apk/app-release.apk</code> is now signed with your release key.</p> - -<p class="note"><strong>Note:</strong> Including the passwords for your release key and keystore -inside the build file is not a good security practice. Alternatively, you can configure the build -file to obtain these passwords from environment variables or have the build process prompt you -for these passwords.</p> - -<p>To obtain these passwords from environment variables:</p> - -<pre> -storePassword System.getenv("KSTOREPWD") -keyPassword System.getenv("KEYPWD") -</pre> - -<p>To have the build process prompt you for these passwords if you are invoking the build from -the command line:</p> - -<pre> -storePassword System.console().readLine("\nKeystore password: ") -keyPassword System.console().readLIne("\nKey password: ") -</pre> - -<h3 id="workBuildVariants">Work with build variants</h3> - -<p>This section describes how the build system can help you create different versions of the same -application from a single project. This is useful when you have a demo version and a paid version -of your app, or if you want to distribute multiple APKs for different device configurations on -Google Play.</p> - -<p>The build system uses <em>product flavors</em> to create different versions of your app. Each -version of your app can have different features or device requirements. The build system generates -a different APK for each version of your app.</p> - -<h4>Build variants</h4> + <img src="{@docRoot}images/build.png" /> -<p>Each version of your app is represented in the build system by a <em>build variant</em>. -Build variants are combinations of build types and product flavor configurations. Android Studio -projects define two build types (<em>debug</em> and <em>release</em>) and no product flavors by -default. These projects consists of two build variants, debug and release, and the build system -generates an APK for each.</p> +<p>The general process for a typical build is outlined below. The build system merges all the +resources from the configured product flavors, build types, and dependencies. If different +folders contain resources with the same name or setting, the following override priority order is: +dependencies override build types, which override product flavors, which override the main source +directory.</p> -<p>The exercise in this section defines two product flavors, <em>demo</em> and <em>full</em>. -This generates four build variants:</p> + <ul> -<ul> - <li>demo-debug</li> - <li>demo-release</li> - <li>full-debug</li> - <li>full-release</li> -</ul> - -<p>In this case the build system creates four APKs, one for each of these build variants.</p> - -<p>Some projects have complex combinations of features along more than one dimension, but they -still represent the same app. For example, in addition to having a demo and a full version of the -app, some games may contain binaries specific to a particular CPU/ABI. The flexibility of -the build system makes it possible to generate the following build variants for such a project:</p> - -<ul> - <li>x86-demo-debug</li> - <li>x86-demo-release</li> - <li>x86-full-debug</li> - <li>x86-full-release</li> - <li>arm-demo-debug</li> - <li>arm-demo-release</li> - <li>arm-full-debug</li> - <li>arm-full-release</li> - <li>mips-demo-debug</li> - <li>mips-demo-release</li> - <li>mips-full-debug</li> - <li>mips-full-release</li> -</ul> - -<p>This project would consist of two build types (<em>debug</em> and <em>release</em>) -and two <em>dimensions</em> of product flavors, one for app type (demo or full) and one for -CPU/ABI (x86, ARM, or MIPS). For more information on flavor dimensions, see the -<a href="http://tools.android.com/tech-docs/new-build-system/user-guide">Gradle Plugin User -Guide</a>.</p> - -<h4>Source directories</h4> - -<p>To build each version of your app, the build system combines source code and -resources from:</p> - -<ul> - <li><code>src/main/</code> - the main source directory (common to all variants)</li> - <li><code>src/<buildType>/</code> - the build type source directory</li> - <li><code>src/<flavorName>/</code> - the flavor source directory</li> -</ul> - -<p>The number of flavor source directories used in the build depends on the flavor configuration -of your project:</p> -<ul> - <li><p>For projects that do not define any flavors, the build system does not use any - flavor source directories. For example, to generate the <em>release</em> build variant - in projects with no flavors, the build system uses:</p> - <ul> - <li><code>src/main/</code></li> - <li><code>src/release/</code> (build type)</li> - </ul> - </li> - <li><p>For projects that define a set of flavors, the build system uses one flavor source - directory. For example, to generate the <em>full-debug</em> build variant in the example - in this section, the build system uses:</p> - <ul> - <li><code>src/main/</code></li> - <li><code>src/debug/</code> (build type)</li> - <li><code>src/full/</code> (flavor)</li> - </ul> - </li> - <li><p>For projects that use flavor dimensions, the build system uses one flavor source - directory per dimension. For example, to generate the <em>arm-demo-release</em> build - variant in the previous example, the build system uses:</p> - <ul> - <li><code>src/main/</code></li> - <li><code>src/release/</code> (build type)</li> - <li><code>src/demo/</code> (flavor - app type dimension)</li> - <li><code>src/arm/</code> (flavor - ABI dimension)</li> - </ul> - </li> -</ul> - -<p class="note"><strong>Note:</strong> The build type and flavor source directories are optional, -and Android Studio does not create these directories for you. The build system does not use them -if they are not present.</p> - -<p>The source code from these directories is used together to generate the output for a build -variant. You can have classes with the same name in different directories as long as those -directories are not used together in the same variant. The exercise in this section shows you -how to create different versions of the same activity class in different variants.</p> - -<p>The build system merges all the manifests into a single manifest, so each build variant -can define different components or permissions in the final manifest.</p> - -<p>The build system merges all the resources from the all the source directories. If different -folders contain resources with the same name for a build variant, the priority order is the -following: build type resources override those from the product flavor, which override the -resources in the main source directory.</p> - -<p class="note"><strong>Note:</strong> Build variants enable you to reuse common activities, -application logic, and resources across different versions of your app.</p> - -<h4>Product flavors in BuildSystemExample</h4> - -<p>To create different versions of your app:</p> - -<ol> - <li>Define product flavors in the build file.</li> - <li>Create additional source directories for each flavor.</li> - <li>Add the flavor-specific sources to your project.</li> -</ol> + <li>The Android Asset Packaging Tool (aapt) takes your application resource files, such as the + <code>AndroidManifest.xml</code> file and the XML files for your Activities, and compiles them. + An <code>R.java</code> is also produced so you can reference your resources from your Java code.</li> -<p>The rest of this section walks you through these steps in detail using the -<code>BuildSystemExample</code> project. You create two flavors of the -<code>BuildSystemExample</code> app, a demo flavor and a full flavor. Both flavors share -<code>MainActivity</code>, to which you add a new button to launch a new activity, -<code>SecondActivity</code>. This new activity is different for each flavor, so you simulate a -situation where the new activity would have more features in the full flavor than in the demo -flavor. At the end of the exercise, you end up with two different APKs, one for each flavor.</p> + <li>The aidl tool converts any <code>.aidl</code> interfaces that you have into Java interfaces.</li> -<h4>Define product flavors in the build file</h4> + <li>All of your Java code, including the <code>R.java</code> and <code>.aidl</code> files, are + compiled by the Java compiler and .class files are output.</li> -<p>To define two product flavors, edit the build file for the app module to add the following -configuration:</p> + <li>The dex tool converts the .class files to Dalvik byte code. Any 3rd party libraries and + .class files that you have included in your module build are also converted into <code>.dex</code> + files so that they can be packaged into the final <code>.apk</code> file.</li> -<pre> -... -android { - ... - defaultConfig { ... } - signingConfigs { ... } - buildTypes { ... } - productFlavors { - demo { - applicationId "com.buildsystemexample.app.demo" - versionName "1.0-demo" - } - full { - applicationId "com.buildsystemexample.app.full" - versionName "1.0-full" - } - } -} -... -</pre> + <li>All non-compiled resources (such as images), compiled resources, and the .dex files are + sent to the apkbuilder tool to be packaged into an <code>.apk</code> file.</li> -<p>The product flavor definitions support the same properties as the <code>defaultConfig</code> -element. The base configuration for all flavors is specified in <code>defaultConfig</code>, and each -flavor can override any value. The build file above uses the <code>applicationId</code> property -to assign a different package name to each flavor: since each flavor definition creates a -different app, they each need a distinct package name.</p> + <li>Once the <code>.apk</code> is built, it must be signed with either a debug or release key + before it can be installed to a device.</li> -<p class="note"><strong>Note:</strong> To distribute your app using -<a href="{@docRoot}google/play/publishing/multiple-apks.html">Multiple APK Support</a> in -Google Play, assign the same package name to all variants and give each variant a different -<code>versionCode</code>. To distribute different variants of your app as separate apps in Google -Play, assign a different package name to each variant.</p> + <li>Finally, if the application is being signed in release mode, you must align the + <code>.apk</code> with the zipalign tool. Aligning the final <code>.apk</code> decreases memory + usage when the application is -running on a device.</li> + </ul> -<h4>Add additional source directories for each flavor</h4> +<p class="note"><b>Note:</b> Apps are limited to a 64K method reference limit. If your app reaches +this limit, the build process outputs the following error message: -<p>Now you create source folders and add a <code>SecondActivity</code> to each flavor. To create -the source directory structure for the demo flavor:</p> +<pre>Unable to execute dex: method ID not in [0, 0xffff]: 65536.</pre> -<ol> - <li>On the <em>Project</em> panel, expand <strong>BuildSystemExample</strong>, and then expand - the <strong>app</strong> directory.</li> - <li>Right click the <strong>src</strong> directory under <em>app</em> and select - <strong>New</strong> > <strong>Directory</strong>.</li> - <li>Enter "demo" as the name of the new directory and click <strong>OK</strong>.</li> - <li><p>Similarly, create the following directories:</p> - <ul> - <li><code>app/src/demo/java</code></li> - <li><code>app/src/demo/res</code></li> - <li><code>app/src/demo/res/layout</code></li> - <li><code>app/src/demo/res/values</code></li> - </ul> - </li> -</ol> - -<p>The resulting directory structure looks like figure 5.</p> - -<img src="{@docRoot}images/tools/as-demoflavordirs.png" alt="" /> -<p class="img-caption"><strong>Figure 5.</strong> New source directories for the demo flavor.</p> - -<h4>Add a new activity to each flavor</h4> - -<p>To add <code>SecondActivity</code> to the <code>demo</code> flavor:</p> - -<ol> - <li>On the <em>Project</em> panel, right click on the <strong>app</strong> module and select - <strong>New</strong> > <strong>Activity</strong>.</li> - <li>Select <strong>Blank Activity</strong> and click <strong>Next</strong>.</li> - <li>Enter "SecondActivity" as the activity name.</li> - <li>Enter "com.buildsystemexample.app" as the package name and click - <strong>Finish</strong>.</li> - <li>Right click on the <strong>java</strong> directory under <em>app/src/demo</em> and select - <strong>New</strong> > <strong>Package</strong>.</li> - <li>Enter "com.buildsystemexample.app" as the package name and click <strong>OK</strong>.</li> - <li>Drag <strong>SecondActivity</strong> and drop it under the new package in - <em>app/src/demo/java</em>.</li> - <li>Accept the default values and click <strong>Refactor</strong>.</li> -</ol> - -<p>To add the layout for <code>SecondActivity</code> and a strings resource to the demo flavor:</p> - -<ol> - <li>Drag <strong>activity_second.xml</strong> from <em>app/src/main/res/layout</em> and drop it - inside <em>app/src/demo/res/layout</em>.</li> - <li>Accept the default values on the window that appears and click <code>OK</code>.</li> - <li>Copy <strong>strings.xml</strong> from <em>app/src/main/res</em> into - <em>app/src/demo/res</em>.</li> - <li><p>Replace the contents of the new copy of <code>strings.xml</code> with the - following:</p> - <p><pre> -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="hello_world">Demo version only.</string> -</resources> -</pre></p> - </li> -</ol> +To avoid this error, see +<a href="{@docRoot}tools/building/multidex.html">Building Apps with Over 65K Methods</a>. +</p> -<p>Now you add source folders and <code>SecondActivity</code> to the full flavor by making a copy -of the <code>demo</code> flavor:</p> -<ol> - <li>On the <em>Project</em> panel, right click on the <strong>demo</strong> directory under - <em>app/src</em> and select <strong>Copy</strong>.</li> - <li>Right-click on the <strong>src/</strong> directory under <em>app/</em> and select - <strong>Paste</strong>.</li> - <li>On the window that appears, enter "full" as the new name and click <strong>OK</strong>.</li> - <li><p>Replace the contents of <strong>strings.xml</strong> under <em>src/full/res/values</em> - with the following:</p> - <p><pre> -<?xml version="1.0" encoding="utf-8"?> -<resources> - <string name="hello_world">This is the full version!</string> -</resources> -</pre></p> - </li> -</ol> - -<p class="note"><strong>Note:</strong> From this point on, you could develop -<code>SecondActivity</code> independently inside each -flavor. You can add more features to this activity in the <code>full</code> flavor.</p> - -<p>To work on files from a particular flavor, click on <strong>Build Variants</strong> on the left -of the IDE window and select the flavor you want to modify in the <em>Build Variants</em> panel, -as shown in figure 5. Android Studio may show errors in source files from flavors other than the -one selected in the <em>Build Variants</em> panel, but this does not affect the outcome of the -build.</p> - -<img src="{@docRoot}images/tools/as-buildvariants.png" alt="" /> -<p class="img-caption"><strong>Figure 6.</strong> The Build Variants panel.</p> - -<h4>Launch a flavor-specific activity from the main activity</h4> - -<p>Since the flavor-specific activity (<code>SecondActivity</code>) has the same package name and -activity name in both flavors, you can launch it from the main activity, which is common to all -flavors. To modify the main activity:</p> +<h3>Build output</h3> -<ol> - <li><p>Edit <code>activity_main.xml</code> and add a new button to - <code>MainActivity</code>:</p> - <p><pre> -<LinearLayout ...> - ... - <Button - android:id="@+id/button2" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:text="@string/button2" - android:onClick="onButton2Clicked"/> -</LinearLayout> -</pre></p> - </li> - <li>Click on the areas marked in red in the layout file and press <strong>Alt</strong>+ - <strong>Enter</strong>. Follow the suggestions from Android Studio to add a new string - resource with value “Open Second Activity” and an <code>onButton2Clicked</code> method to - <code>MainActivity</code>.</li> - <li><p>Add the following code to the <code>onButton2Clicked</code> method of - <code>MainActivity</code>:</p> - <p><pre> -public void onButton2Clicked(View view) { - Intent intent = new Intent(this, SecondActivity.class); - startActivity(intent); -} -</pre></p> - </li> - <li><p>Edit the app's manifest to include a reference to <code>SecondActivity</code>:</p> - <p><pre> -<manifest ...> - <application ...> - ... - <activity - android:name="com.buildsystemexample.app.SecondActivity" - android:label="@string/title_activity_second" > - </activity> - </application> -</manifest> -</pre></p> - </li> -</ol> - -<h4>Build output</h4> - -<p>The <code>BuildSystemExample</code> app is now complete. To build it, invoke the -<code>assemble</code> task from Android Studio or from the command line.</p> - -<p>The build generates an APK for each build variant: +<p>The build generates an APK for each build variant in the <code>app/build</code> folder: the <code>app/build/apk/</code> directory contains packages named <code>app-<flavor>-<buildtype>.apk</code>; for example, <code>app-full-release.apk</code> and <code>app-demo-debug.apk</code>.</p> -<h2 id="reference">Reference</h2> - -<p>The build system is very flexible and has more features than those described here. For a -complete reference, see the -<a href="http://tools.android.com/tech-docs/new-build-system/user-guide">Android Plugin for Gradle -User Guide</a>.</p> |