1page.title=Configuring Gradle Builds 2 3@jd:body 4 5<div id="qv-wrapper"> 6<div id="qv"> 7<h2>In this document</h2> 8<ol> 9 <li><a href="#buildFileBasics">Build Configuration Basics</a> 10 <ol> 11 <li><a href="#buildFileBasics">Declare dependencies</a></li> 12 <li><a href="#buildFileBasics">Run ProGuard</a></li> 13 <li><a href="#configureSigning">Configure signing settings</a></li> 14 </ol> 15 </li> 16 17 18 <li><a href="#workBuildVariants">Work with build variants</a></li> 19</ol> 20 21 22<h2>See also</h2> 23<ul> 24<li><a href="{@docRoot}tools/building/plugin-for-gradle.html"> 25Android Plugin for Gradle</a></li> 26</ul> 27</div> 28</div> 29 30 31<p>This section builds on the 32<a href="{@docRoot}sdk/installing/studio-build.html">Build System Overview</a> and 33<a href="{@docRoot}tools/building/building-studio.html">Build and Running from Android Studio</a> 34to show you how to use build variants based on product flavors and build types.</p> 35 36 37<h2 id="buildFileBasics">Build Configuration Basics</h2> 38 39<p>Android Studio projects contain a top-level build file and a build file for each module. The 40build files are called <code>build.gradle</code>, and they are plain text files that use 41<a href="http://groovy.codehaus.org">Groovy</a> syntax to configure the build with the elements 42provided by the Android plugin for Gradle. In most cases, you only need to edit the build files 43at the module level. For example, the build file for the app module in the 44<code>BuildSystemExample</code> project looks like this:</p> 45 46<pre> 47apply plugin: 'com.android.application' 48 49android { 50 compileSdkVersion 19 51 buildToolsVersion "19.0.0" 52 53 defaultConfig { 54 minSdkVersion 8 55 targetSdkVersion 19 56 versionCode 1 57 versionName "1.0" 58 } 59 buildTypes { 60 release { 61 minifyEnabled true 62 proguardFiles getDefaultProguardFile('proguard-android.txt'), \ 63 'proguard-rules.txt' 64 } 65 } 66} 67 68dependencies { 69 compile project(":lib") 70 compile 'com.android.support:appcompat-v7:19.0.1' 71 compile fileTree(dir: 'libs', include: ['*.jar']) 72} 73</pre> 74 75<p><code>apply plugin: 'com.android.application'</code> applies the Android plugin for Gradle to this build. 76This adds Android-specific build tasks to the top-level build tasks and makes the 77<code>android {...}</code> element available to specify Android-specific build options.</p> 78 79<p><code>android {...}</code> configures all the Android-specific build options:</p> 80 81<ul> 82 <li>The <code>compileSdkVersion</code> property specifies the compilation target.</li> 83 <li><p>The <code>buildToolsVersion</code> property specifies what version of the build tools 84 to use. To install several versions of the build tools, use the SDK Manager.</p> 85 <p class="note"><strong>Note:</strong> Always use a build tools version whose major 86 revision number is higher or equal to that of your compilation target and target SDK.</p> 87 </li> 88 <li><p>The <code>defaultConfig</code> element configures core settings and 89 entries in the manifest file (<code>AndroidManifest.xml</code>) dynamically from the 90 build system. The values in <code>defaultConfig</code> override those in the manifest 91 file.</p> 92 <p>The configuration specified in the <code>defaultConfig</code> element applies 93 to all build variants, unless the configuration for a build variant overrides some 94 of these values.</p> 95 </li> 96 <li>The <code>buildTypes</code> element controls how to build and package your app. 97 By default, the build system defines two build types: <em>debug</em> and 98 <em>release</em>. The debug build type includes debugging symbols and is signed with 99 the debug key. The release build type is not signed by default. 100 In this example the build file configures the release version to use 101 ProGuard.</li> 102</ul> 103 104<p>The <code>dependencies</code> element is outside and after the <code>android</code> element. 105This element declares the dependencies for this module. Dependencies are covered in the following 106sections.</p> 107 108<p class="note"><strong>Note:</strong> When you make changes to the build files in your project, 109Android Studio requires a project sync to import the build configuration changes. Click 110<strong>Sync Now</strong> on the yellow notification bar that appears for Android Studio 111to import the changes.</p> 112 113<img src="{@docRoot}images/tools/as-gradlesync.png" alt="" /> 114<p class="img-caption"><strong>Figure 1.</strong> Sync the project in Android Studio.</p> 115 116<h3 id="declareDeps">Declare dependencies</h3> 117 118<p>The <code>app</code> module in this example declares three 119dependencies:</p> 120 121<pre> 122... 123dependencies { 124 // Module dependency 125 compile project(":lib") 126 127 // Remote binary dependency 128 compile 'com.android.support:appcompat-v7:19.0.1' 129 130 // Local binary dependency 131 compile fileTree(dir: 'libs', include: ['*.jar']) 132} 133</pre> 134 135<p>Each of these dependencies is described below. The build system adds all the 136<code>compile</code> dependencies to the compilation classpath and includes them in the final 137package.</p> 138 139<h4>Module dependencies</h4> 140 141<p>The <code>app</code> module depends on the <code>lib</code> module, because 142<code>MainActivity</code> launches <code>LibActivity1</code> as described in 143<a href="#openActFromLib">Open an Activity from a Library Module</a>.</p> 144 145<p><code>compile project(":lib")</code> declares a dependency on the <code>lib</code> 146module of <code>BuildSystemExample</code>. When you build the <code>app</code> module, 147the build system assembles and includes the <code>lib</code> module.</p> 148 149<h4>Remote binary dependencies</h4> 150 151<p>The <code>app</code> and <code>lib</code> modules both use the <code>ActionBarActivity</code> 152class from the Android Support Library, so these modules depend on it.</p> 153 154<p><code>compile 'com.android.support:appcompat-v7:19.0.1'</code> declares a dependency on 155version 19.0.1 of the Android Support Library by specifying its Maven coordinates. The Android Support 156Library is available in the <em>Android Repository</em> package of the Android SDK. If your 157SDK installation does not have this package, download and install it using the SDK Manager.</p> 158 159Android Studio configures projects to use the Maven Central Repository by default. (This 160configuration is included in the top-level build file for the project.)</p> 161 162<h4>Local binary dependencies</h4> 163 164<p>Some modules do not use any binary dependencies from the 165local file system. If you have modules that require local binary dependencies, copy the JAR 166files for these dependencies into <code><moduleName>/libs</code> inside your project.</p> 167 168<p><code>compile fileTree(dir: 'libs', include: ['*.jar'])</code> tells the build system that any 169JAR file inside <code>app/libs</code> is a dependency and should be included in the compilation 170classpath and in the final package.</p> 171 172<p>For more information about dependencies in Gradle, see 173<a href="http://www.gradle.org/docs/current/userguide/artifact_dependencies_tutorial.html">Dependency 174Management Basics</a> in the Gradle User Guide.</p> 175 176<h3 id="runProguard">Run ProGuard</h3> 177 178<p>The build system can run 179<a href="http://developer.android.com/tools/help/proguard.html">ProGuard</a> to obfuscate your 180classes during the build process. In <code>BuildSystemExample</code>, modify the build file for 181the app module to run ProGuard for the release build:</p> 182 183<pre> 184... 185android { 186 ... 187 buildTypes { 188 release { 189 minifyEnabled true 190 proguardFiles getDefaultProguardFile('proguard-android.txt'), \ 191 'proguard-rules.txt' 192 } 193 } 194} 195... 196</pre> 197 198<p><code>getDefaultProguardFile('proguard-android.txt')</code> obtains the default ProGuard 199settings from the Android SDK installation. Android Studio adds the module-specific rules file 200<code>proguard-rules.txt</code> at the root of the module, where you can add custom ProGuard 201rules.</p> 202 203<h3 id="configureSigning">Configure signing settings</h3> 204 205<p>The debug and the release versions of the app differ on whether the application can be 206debugged on secure devices and on how the APK is signed. The build system signs the debug 207version with a default key and certificate using known credentials to avoid a password prompt at 208build time. The build system does not sign the release version unless you explicitly define a 209signing configuration for this build. If you do not have a release key, you can generate one as 210described in <a href="{@docRoot}tools/publishing/app-signing.html">Signing your Applications</a>.</p> 211 212 213<h2 id="workBuildVariants">Work with build variants</h2> 214 215<p>This section describes how the build system can help you create different versions of the same 216application from a single project. This is useful when you have a demo version and a paid version 217of your app, or if you want to distribute multiple APKs for different device configurations on 218Google Play.</p> 219 220<p>The build system uses <em>product flavors</em> to create different product versions of your app. 221Each product version of your app can have different features or device requirements. The build 222system also uses build types to apply different build and packaging settings to each product version. 223Each product flavor and build type combination forms a build variant. The build system generates a 224different APK for each build variant of your app. </p> 225 226<h3>Build variants</h3> 227 228<p>This example project consists of the two default build types (<em>debug</em> and <em>release</em>) 229and two product flavors for app type (demo and full). For more information on advanced uses of 230build variants, see 231<a href="{@docRoot}sdk/installing/studio-build.html"> Build System Overview</a> .</p> 232 233 234<h4>Product flavors </h4> 235 236<p>To create different product versions of your app:</p> 237 238<ol> 239 <li>Define product flavors in the build file.</li> 240 <li>Create additional source directories for each flavor.</li> 241 <li>Add the flavor-specific sources to your project.</li> 242</ol> 243 244<p>The rest of this section walks you through these steps in detail using a 245<code>BuildSystemExample</code> project. You create two flavors of the 246<code>BuildSystemExample</code> app, a demo flavor and a full flavor. Both flavors share 247<code>MainActivity</code>, to which you add a new button to launch a new activity, 248<code>SecondActivity</code>. This new activity is different for each flavor, so you simulate a 249situation where the new activity would have more features in the full flavor than in the demo 250flavor. At the end of the exercise, you end up with two different APKs, one for each flavor.</p> 251 252<h3>Define product flavors in the build file</h3> 253 254<p>To define two product flavors, edit the build file for the app module to add the following 255configuration:</p> 256 257<pre> 258... 259android { 260 ... 261 defaultConfig { ... } 262 signingConfigs { ... } 263 buildTypes { ... } 264 productFlavors { 265 demo { 266 applicationId "com.buildsystemexample.app.demo" 267 versionName "1.0-demo" 268 } 269 full { 270 applicationId "com.buildsystemexample.app.full" 271 versionName "1.0-full" 272 } 273 } 274} 275... 276</pre> 277 278<p>The product flavor definitions support the same properties as the <code>defaultConfig</code> 279element. The base configuration for all flavors is specified in <code>defaultConfig</code>, and each 280flavor overrides any default values. The build file above uses the <code>applicationId</code> 281property to assign a different package name to each flavor: since each flavor definition creates a 282different app, they each need a distinct package name.</p> 283 284<p class="note"><strong>Note:</strong> To distribute your app using 285<a href="{@docRoot}google/play/publishing/multiple-apks.html">Multiple APK Support</a> in 286Google Play, assign the same package name to all variants and give each variant a different 287<code>versionCode</code>. To distribute different variants of your app as separate apps in Google 288Play, assign a different package name to each variant.</p> 289 290<h4>Add additional source directories for each flavor</h4> 291 292<p>Now you create source folders and add a <code>SecondActivity</code> to each flavor. To create 293the source directory structure for the demo flavor:</p> 294 295<ol> 296 <li>On the <em>Project</em> panel, expand <strong>BuildSystemExample</strong>, and then expand 297 the <strong>app</strong> directory.</li> 298 <li>Right-click the <strong>src</strong> directory under <em>app</em> and select 299 <strong>New</strong> > <strong>Directory</strong>.</li> 300 <li>Enter "demo" as the name of the new directory and click <strong>OK</strong>.</li> 301 <li><p>Similarly, create the following directories:</p> 302 <ul> 303 <li><code>app/src/demo/java</code></li> 304 <li><code>app/src/demo/res</code></li> 305 <li><code>app/src/demo/res/layout</code></li> 306 <li><code>app/src/demo/res/values</code></li> 307 </ul> 308 </li> 309</ol> 310 311<p>The resulting directory structure looks like figure 1.</p> 312 313<img src="{@docRoot}images/tools/as-demoflavordirs.png" alt="" /> 314<p class="img-caption"><strong>Figure 1.</strong> New source directories for the demo flavor.</p> 315 316<h4>Add a new activity to each flavor</h4> 317 318<p>To add <code>SecondActivity</code> to the <code>demo</code> flavor:</p> 319 320<ol> 321 <li>On the <em>Project</em> panel, right click on the <strong>app</strong> module and select 322 <strong>New</strong> > <strong>Activity</strong>.</li> 323 <li>Select <strong>Blank Activity</strong> and click <strong>Next</strong>.</li> 324 <li>Enter "SecondActivity" as the activity name.</li> 325 <li>Enter "com.buildsystemexample.app" as the package name and click 326 <strong>Finish</strong>.</li> 327 <li>Right click on the <strong>java</strong> directory under <em>app/src/demo</em> and select 328 <strong>New</strong> > <strong>Package</strong>.</li> 329 <li>Enter "com.buildsystemexample.app" as the package name and click <strong>OK</strong>.</li> 330 <li>Drag <strong>SecondActivity</strong> and drop it under the new package in 331 <em>app/src/demo/java</em>.</li> 332 <li>Accept the default values and click <strong>Refactor</strong>.</li> 333</ol> 334 335<p>To add the layout for <code>SecondActivity</code> and a strings resource to the demo flavor:</p> 336 337<ol> 338 <li>Drag <strong>activity_second.xml</strong> from <em>app/src/main/res/layout</em> and drop it 339 inside <em>app/src/demo/res/layout</em>.</li> 340 <li>Accept the default values on the window that appears and click <code>OK</code>.</li> 341 <li>Copy <strong>strings.xml</strong> from <em>app/src/main/res</em> into 342 <em>app/src/demo/res</em>.</li> 343 <li><p>Replace the contents of the new copy of <code>strings.xml</code> with the 344 following:</p> 345 <p><pre> 346<?xml version="1.0" encoding="utf-8"?> 347<resources> 348 <string name="hello_world">Demo version only.</string> 349</resources> 350</pre></p> 351 </li> 352</ol> 353 354<p>Now you add source folders and <code>SecondActivity</code> to the full flavor by making a copy 355of the <code>demo</code> flavor:</p> 356 357<ol> 358 <li>On the <em>Project</em> panel, right click on the <strong>demo</strong> directory under 359 <em>app/src</em> and select <strong>Copy</strong>.</li> 360 <li>Right-click on the <strong>src/</strong> directory under <em>app/</em> and select 361 <strong>Paste</strong>.</li> 362 <li>On the window that appears, enter "full" as the new name and click <strong>OK</strong>.</li> 363 <li><p>Replace the contents of <strong>strings.xml</strong> under <em>src/full/res/values</em> 364 with the following:</p> 365 <p><pre> 366<?xml version="1.0" encoding="utf-8"?> 367<resources> 368 <string name="hello_world">This is the full version!</string> 369</resources> 370</pre></p> 371 </li> 372</ol> 373 374<p class="note"><strong>Note:</strong> From this point on, you could develop 375<code>SecondActivity</code> independently inside each 376flavor. For example, you could add more features to this activity in the <code>full</code> flavor.</p> 377 378<p>To work on files from a particular flavor, click on <strong>Build Variants</strong> on the left 379of the IDE window and select the flavor you want to modify in the <em>Build Variants</em> panel, 380as shown in figure 2. Android Studio may show errors in source files from flavors other than the 381one selected in the <em>Build Variants</em> panel, but this does not affect the outcome of the 382build.</p> 383 384<img src="{@docRoot}images/tools/as-buildvariants.png" alt="" /> 385<p class="img-caption"><strong>Figure 2.</strong> The Build Variants panel.</p> 386 387<h4>Launch a flavor-specific activity from the main activity</h4> 388 389<p>Since the flavor-specific activity (<code>SecondActivity</code>) has the same package name and 390activity name in both flavors, you can launch it from the main activity, which is common to all 391flavors. To modify the main activity:</p> 392 393<ol> 394 <li><p>Edit <code>activity_main.xml</code> and add a new button to 395 <code>MainActivity</code>:</p> 396 <p><pre> 397<LinearLayout ...> 398 ... 399 <Button 400 android:id="@+id/button2" 401 android:layout_width="wrap_content" 402 android:layout_height="wrap_content" 403 android:text="@string/button2" 404 android:onClick="onButton2Clicked"/> 405</LinearLayout> 406</pre></p> 407 </li> 408 <li>Click on the areas marked in red in the layout file and press <strong>Alt</strong>+ 409 <strong>Enter</strong>. Follow the suggestions from Android Studio to add a new string 410 resource with value “Open Second Activity” and an <code>onButton2Clicked</code> method to 411 <code>MainActivity</code>.</li> 412 <li><p>Add the following code to the <code>onButton2Clicked</code> method of 413 <code>MainActivity</code>:</p> 414 <p><pre> 415public void onButton2Clicked(View view) { 416 Intent intent = new Intent(this, SecondActivity.class); 417 startActivity(intent); 418} 419</pre></p> 420 </li> 421 <li><p>Edit the app's manifest to include a reference to <code>SecondActivity</code>:</p> 422 <p><pre> 423<manifest ...> 424 <application ...> 425 ... 426 <activity 427 android:name="com.buildsystemexample.app.SecondActivity" 428 android:label="@string/title_activity_second" > 429 </activity> 430 </application> 431</manifest> 432</pre></p> 433 </li> 434</ol> 435 436 437<h4>Build types </h4> 438<p>Build types represent the build packaging versions generated for each app package. By default, 439the debug and release build types are provided. 440</p> 441 442<pre> 443... 444android { 445 ... 446 defaultConfig { ... } 447 signingConfigs { ... } 448 buildTypes { ... } 449 productFlavors {...} 450 buildTypes { 451 release { 452 minifyEnabled false 453 proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 454 } 455 debug { 456 debuggable true 457 } 458 } 459} 460... 461</pre> 462 463<p class="note"><strong>Note:</strong> Although only the <em>release</em> build type appears in 464the default <strong>build.gradle</strong> file, both the release and debug build types are 465applied to each build. </p> 466 467<p>In this example, the product flavors and build types create the following build variants: 468<ul> 469<li>demoDebug</li> 470<li>demoRelease</li> 471<li>fullDebug</li> 472<li>fullRelease</li> 473</ul> 474 475<p>To build this example, invoke the <code>assemble</code> task from Android Studio or from the 476command line.</p> 477 478<p>Separate output folders are created for each build variant. </p> 479