1page.title=Managing Projects Overview
2meta.tags="project, mipmap"
3page.tags="project", "mipmap"
4@jd:body
5
6 <div id="qv-wrapper">
7    <div id="qv">
8      <h2>In this document</h2>
9
10      <ol>
11        <li><a href="#ProjectFiles">Android Project Files</a></li>
12        <li><a href="#ApplicationModules">Android Application Modules</a></li>
13          <ol>
14            <li><a href="#mipmap">Managing Launcher Icons as mipmap Resources</a></li>
15          </ol>
16        <li><a href="#LibraryModules">Library Modules</a>
17          <ol>
18            <li><a href="#considerations">Development considerations</a></li>
19          </ol>
20        </li>
21
22        <li><a href="#TestModules">Test Modules</a></li>
23
24        <li><a href="#testing">Testing a Library Module</a></li>
25      </ol>
26    </div>
27  </div>
28
29  <p>An Android <em>project</em> contains everything that defines your Android app, from app
30  source code to build configurations and test code. The SDK tools require that your projects
31  follow a specific structure so it can compile and package your application correctly.
32  If you're using Android Studio, it takes care of all this for you.</p>
33
34  <p>A <em>module</em> is the first level of containment within a project that encapsulates
35  specific types of source code files and resources. There are several types of modules
36  with a project:</p>
37
38  <dl>
39
40    <dt><strong>Android Application Modules</strong></dt>
41
42    <dd>An Android Application Module is the container for your application's source code, resource
43    files, and application level settings, such as the module-level build file, resource  files, and
44    Android Manifest file. The application module contents are eventually
45    built into the <code>.apk</code> file that gets installed on a device.</dd>
46
47    <dt><strong>Test Modules</strong></dt>
48
49    <dd>These modules contain code to test your application projects and are built into
50    test applications that run on a device. By default, Android Studio creates the
51    <em>androidTest</em> module for inserting JUnit tests. </dd>
52
53    <dt><strong>Library Modules</strong></dt>
54
55    <dd>These modules contain shareable Android source code and resources that you can reference
56    in Android projects. This is useful when you have common code that you want to reuse.
57    Library modules cannot be installed onto a device, however, they are
58    pulled into the <code>.apk</code> file at build time.</dd>
59
60
61    <dt><strong>App Engine Modules</strong></dt>
62
63    <dd>Android Studio lets you easily add a cloud backend to your application. A backend allows you
64    to implement functionality such as backing up user data to the cloud, serving content to client
65    apps, real-time interactions, sending push notifications through Google Cloud Messaging for
66    Android (GCM), and more. App Engine modules are App Engine java Servlet Module for backend
67    development, App Engine java Endpoints Module to convert server-side Java code annotations into
68    RESTful backend APIs, and App Engine Backend with Google Cloud Messaging to send push notifications
69    from your server to your Android devices. </dd>
70
71  </dl>
72
73  <p>When you use the Android development tools to create a new project and the module, the essential files
74  and folders will be created for you. There are only a handful of files and folders generated for you,
75  and some of them depend on whether you use Android Studio or the {@code android} tool to
76  generate your module. As your application grows in complexity, you might require new kinds of
77  resources, directories, and files.</p>
78
79<p class="note"><strong>Note:</strong> Project folders and files apply across the entire Android
80project and override similar module file settings.</p>
81
82
83
84
85  <h2 id="ProjectFiles">Android Project Files</h2>
86
87  <p>Android Studio project files and settings provide project-wide settings that apply across all
88  modules in the project.  </p>
89
90	<dl>
91   <dt><code>.idea</code></dt>
92
93   <dd>Directory for IntelliJ IDEA settings.</dd>
94
95
96   <dt><code>app</code></dt>
97
98   <dd>Application module directories and files. </dd>
99
100
101   <dt><code>build</code></dt>
102
103   <dd>This directory stories the build output for all project modules.</dd>
104
105
106    <dt><code>gradle</code></dt>
107
108    <dd>Contains the gradler-wrapper files. </dd>
109
110
111    <dt><code>.gitignore</code></dt>
112
113    <dd>Specifies the untracked files that Git should ignore.</dd>
114
115
116    <dt><code>build.gradle</code></dt>
117
118    <dd>Customizable properties for the build system. You can edit this file to specify the default
119    build settings used by the application modules and also set the location of your keystore and key alias
120    so that the build tools can sign your application when building in release mode. This file is
121    integral to the project, so maintain it in a source revision control system. </dd>
122
123    <dt><code>gradle.properties</code></dt>
124
125    <dd>Project-wide Gradle settings.</dd>
126
127
128    <dt><code>gradlew</code></dt>
129
130    <dd>Gradle startup script for Unix.</dd>
131
132
133    <dt><code>gradlew.bat</code></dt>
134
135    <dd>Gradle startup script for Windows. </dd>
136
137   <dt><code>local.properties</code></dt>
138
139   <dd>Customizable computer-specific properties for the build system, such as the path to the SDK
140   installation. Because the content of the file is specific to the local installation of the SDK,
141   the <code>local.properties</code> should not be maintained in a source revision control system. </dd>
142
143
144    <dt><code><project>.iml</code></dt>
145
146    <dd>Module file created by the IntelliJ IDEA to store module information.</dd>
147
148    <dt><code>settings.gradle</code></dt>
149
150    <dd>Specifies the sub-projects to build.</dd>
151
152  </dl>
153
154
155  <h2 id="ApplicationModules">Android Application Modules</h2>
156
157  <p>Android Application Modules are the modules that eventually get built into the <code>.apk</code>
158  files based on your build settings. They contain things such as application source code and resource
159  files. Most code and resource files are generated for you by default, while others should be created if
160  required. The following directories and files comprise an Android application module:</p>
161
162  <dl>
163
164    <dt><code>build/</code></dt>
165
166    <dd>Contains build folders for the specified build variants. Stored in the main application module.</dd>
167
168
169    <dt><code>libs/</code></dt>
170
171    <dd>Contains private libraries. Stored in the main application module.</dd>
172
173
174
175
176    <dt><code>src/</code></dt>
177
178    <dd>Contains your stub Activity file, which is stored at
179    <code>src<em>/main/java/<namespace.applicationname>/ActivityName></em>.java</code>. All other source
180    code files (such as <code>.java</code> or <code>.aidl</code> files) go here as well.</dd>
181
182     <dl>
183       <dt><code>androidTest/</code></dt>
184
185       <dd>Contains the instrumentation tests. For more information, see the
186       <a href="{@docRoot}tools/testing/index.html">Android Test documentation</a>.</dd>
187
188       <dt><code>main/java/com.&gt;project&lt;.&gt;app&lt;</code></dt>
189
190       <dd>Contains Java code source for the app activities.</dd>
191
192       <dt><code>main/jni/</code></dt>
193
194       <dd>Contains native code using the Java Native Interface (JNI). For more information, see the
195       <a href="{@docRoot}tools/sdk/ndk/index.html">Android NDK documentation</a>.</dd>
196
197       <dt><code>main/gen/</code></dt>
198
199       <dd>Contains the Java files generated by Android Studio, such as your <code>R.java</code> file and
200       interfaces created from AIDL files.</dd>
201
202       <dt><code>main/assets/</code></dt>
203
204       <dd>This is empty. You can use it to store raw asset files. Files that you save here are
205       compiled into an <code>.apk</code> file as-is, and the original filename is preserved. You can
206       navigate this directory in the same way as a typical file system using URIs and read files as a
207       stream of bytes using the {@link android.content.res.AssetManager}. For example, this is a good
208       location for textures and game data.</dd>
209
210       <dt><code>main/res/</code></dt>
211
212       <dd>Contains application resources, such as drawable files, layout files, and string values
213       in the following directories. See
214       <a href="{@docRoot}guide/topics/resources/index.html">Application Resources</a> for more
215       information.
216
217       <dl>
218           <dt><code>anim/</code></dt>
219
220           <dd>For XML files that are compiled into animation objects. See the <a href=
221           "{@docRoot}guide/topics/resources/animation-resource.html">Animation</a> resource
222           type.</dd>
223
224           <dt><code>color/</code></dt>
225
226           <dd>For XML files that describe colors. See the <a href=
227        "  {@docRoot}guide/topics/resources/color-list-resource.html">Color Values</a> resource
228           type.</dd>
229
230           <dt><code>drawable/</code></dt>
231
232           <dd>For bitmap files (PNG, JPEG, or GIF), 9-Patch image files, and XML files that describe
233           Drawable shapes or Drawable objects that contain multiple states (normal, pressed, or
234           focused). See the <a href=
235           "{@docRoot}guide/topics/resources/drawable-resource.html">Drawable</a> resource type.</dd>
236
237
238           <dt><code>mipmap/</code></dt>
239
240           <dd>For app launcher icons. The Android system retains the resources in this folder
241           (and density-specific folders such as mipmap-xxxhdpi) regardless of the screen resolution
242           of the device where your app is installed. This behavior allows launcher apps to pick
243           the best resolution icon for your app to display on the home screen. For more information
244           about using the <code>mipmap</code> folders, see
245           <a href="#mipmap">Managing Launcher Icons as mipmap Resources</a>. </p>
246
247
248          <dt><code>layout/</code></dt>
249
250           <dd>XML files that are compiled into screen layouts (or part of a screen). See the <a href=
251           "{@docRoot}guide/topics/resources/layout-resource.html">Layout</a> resource type.</dd>
252
253           <dt><code>menu/</code></dt>
254
255           <dd>For XML files that define application menus.
256           See the <a href="{@docRoot}guide/topics/resources/menu-resource.html">Menus</a>
257           resource type.</dd>
258
259           <dt><code>raw/</code></dt>
260
261           <dd>For arbitrary raw asset files. Saving asset files here is essentially the same as
262           saving them in the <code>assets/</code> directory. The only difference is how you
263           access them. These files
264           are processed by aapt and must be referenced from the application using a resource
265           identifier in the {@code R} class. For example, this is a good place for media, such as MP3
266           or Ogg files.</dd>
267
268           <dt><code>values/</code></dt>
269
270           <dd>For XML files that define resources by XML element type. Unlike other resources in
271           the <code>res/</code> directory, resources written to XML files in this folder are not
272           referenced by the file name. Instead, the XML element type controls how the resources
273           defined within the XML files are placed into the {@code R} class.</dd>
274
275           <dt><code>xml/</code></dt>
276
277           <dd>For miscellaneous XML files that configure application components. For example, an XML
278           file that defines a {@link android.preference.PreferenceScreen}, {@link
279           android.appwidget.AppWidgetProviderInfo}, or
280           <a href="{@docRoot}reference/android/app/SearchManager.html#SearchabilityMetadata">
281           Searchability Metadata</a>. See
282           <a href="{@docRoot}guide/topics/resources/index.html">Application Resources</a>
283           for more information about configuring these application components.</dd>
284
285         </dl>
286
287      <dt><code>AndroidManifest.xml</code></dt>
288
289      <dd>The control file that describes the nature of the application and each of its components.
290      For instance, it describes: certain qualities about the activities, services, intent receivers,
291      and content providers; what permissions are requested; what external libraries are needed; what
292      device features are required, what API Levels are supported or required; and others. See the
293      <a href="{@docRoot}guide/topics/manifest/manifest-intro.html">AndroidManifest.xml</a>
294      documentation for more information</dd>
295
296   </dl>
297
298   <dt><code>.gitignore/</code></dt>
299
300   <dd>Specifies the untracked files ignored by git.</dd>
301
302   <dt><code>app.iml/</code></dt>
303
304   <dd>IntelliJ IDEA module</dd>
305
306   <dt><code>build.gradle</code></dt>
307
308   <dd>Customizable properties for the build system. You can edit this file to override default
309    build settings used by the manifest file and also set the location of your keystore and key alias
310    so that the build tools can sign your application when building in release mode. This file is
311    integral to the project, so maintain it in a source revision control system. </dd>
312
313    <dt><code>proguard-rules.pro</code></dt>
314
315    <dd>ProGuard settings file. </dd>
316
317
318  </dl>
319
320
321
322<h2 id="mipmap">Managing Launcher Icons as mipmap Resources</h2>
323
324<p>Different home screen launcher apps on different devices show app launcher icons at various
325resolutions. When app resource optimization techniques remove resources for unused
326screen densities, launcher icons can wind up looking fuzzy because the launcher app has to upscale
327a lower-resolution icon for display. To avoid these display issues, apps should use the
328<code>mipmap/</code> resource folders for launcher icons. The Android system
329preserves these resources regardless of density stripping, and ensures that launcher apps can
330pick icons with the best resolution for display. </p>
331
332<p>Make sure launcher apps show a high-resolution icon for your app by moving all densities of your
333launcher icons to density-specific <code>res/mipmap/</code> folders
334(for example <code>res/mipmap-mdpi/</code> and <code>res/mipmap-xxxhdpi/</code>). The
335<code>mipmap/</code> folders replace the <code>drawable/</code> folders for launcher icons. For
336xxhpdi launcher icons, be sure to add the higher resolution xxxhdpi versions of the
337icons to enhance the visual experience of the icons on higher resolution devices.</p>
338
339<p class="note"><strong>Note:</strong> Even if you build a single APK for all devices, it is still
340best practice to move your launcher icons to the <code>mipmap/</code> folders.</p>
341
342
343<h3>Manifest update</h3>
344
345<p>When you move your launcher icons to the <code>mipmap-[density]</code> folders, change the
346launcher icon references in the <code>AndroidManifest.xml</code> file so your manifest references
347the <code>mipmap/</code> location. This example changes the manifest file to reference the
348<code>ic_launcher</code> icon in the <code>mipmap/</code> folder. </p>
349
350<pre>
351...
352&lt;application android:name="ApplicationTitle"
353         android:label="@string/app_label"
354         android:icon="@mipmap/ic_launcher" &gt;
355         ...
356</pre>
357
358
359
360
361
362  <h2 id="LibraryModules">Library Module</h2>
363
364  <div class="sidebox-wrapper">
365    <div class="sidebox">
366      <h2>Library module example code</h2>
367
368      <p>The SDK includes an example application called <code>TicTacToeMain</code> that shows how a
369      dependent application can use code and resources from an Android Library module. The TicTacToeMain
370      application uses code and resources from an example library module called TicTacToeLib.</p>
371
372      <p>To download the sample applications and run them as modules in
373      your environment, use the <em>Android SDK Manager</em> to download the "Samples for
374      SDK API 8" (or later) module into your SDK.</p>
375
376      <p>For more information and to browse the code of the samples, see
377      the <a href="{@docRoot}resources/samples/TicTacToeMain/index.html">TicTacToeMain
378      application</a>.</p>
379    </div>
380  </div>
381
382    <p>An Android <em>library module</em> is a development module that holds shared Android
383    source code and resources. Other Android application modules can reference the library module
384    and, at build time, include its compiled sources in their <code>.apk</code> files. Multiple
385    application modules can reference the same library module and any single application module
386    can reference multiple library modules.</p>
387
388    <p class="note"><strong>Note:</strong> You need SDK Tools r14 or newer to use the new library
389    module feature that generates each library module into its own JAR file.
390    You can download the tools and platforms using the
391    <em>Android SDK Manager</em>, as described in
392    <a href="{@docRoot}tools/help/sdk-manager.html">SDK tools help</a>.</p>
393
394    <p>If you have source code and resources that are common to multiple Android projects, you
395    can move them to a library module so that it is easier to maintain across applications and
396    versions. Here are some common scenarios in which you could make use of library modules:</p>
397
398    <ul>
399      <li>If you are developing multiple related applications that use some of the same components,
400      you move the redundant components out of their respective application module and create a
401      single, reusable set of the same components in a library module.</li>
402
403      <li>If you are creating an application that exists in both free and paid versions. You move
404      the part of the application that is common to both versions into a library module. The two
405      dependent modules, with their different package names, will reference the library module
406      and provide only the difference between the two application versions.</li>
407    </ul>
408
409    <p>Structurally, a library module is similar to a standard Android application module. For
410    example, it includes a manifest file at the module root, as well as <code>src/</code>,
411    <code>res/</code> and similar directories. The module can contain the same types of source
412    code and resources as a standard Android module, stored in the same way. For example, source
413    code in the library module can access its own resources through its <code>R</code> class.</p>
414
415    <p>However, a library module differs from a standard Android application module in that you
416    cannot compile it directly to its own <code>.apk</code> and run it on an Android device.
417    Similarly, you cannot export the library module to a self-contained JAR file, as you would do
418    for a true library. Instead, you must compile the library indirectly, by referencing the
419    library in the dependent application and building that application.</p>
420
421    <p>When you build an application that depends on a library module, the SDK tools compile the
422    library into a temporary JAR file and use it in the main module, then uses the
423    result to generate the <code>.apk</code>. In cases where a resource ID is defined in both the
424    application and the library, the tools ensure that the resource declared in the application gets
425    priority and that the resource in the library module is not compiled into the application
426    <code>.apk</code>. This gives your application the flexibility to either use or redefine any
427    resource behaviors or values that are defined in any library.</p>
428
429    <p>To organize your code further, your application can add references to multiple library
430    modules, then specify the relative priority of the resources in each library. This lets you
431    build up the resources actually used in your application in a cumulative manner. When two
432    libraries referenced from an application define the same resource ID, the tools select the
433    resource from the library with higher priority and discard the other.</p>
434
435    <p>Once you have added references to library modules to your Android application module,
436    you can set their relative priority. At build time, the
437    libraries are merged with the application one at a time, starting from the lowest priority to
438    the highest.</p>
439
440    <p>Library modules can reference other library modules and can import an external library
441    (JAR) in the normal way.</p>
442
443  <h3 id="considerations">Development considerations</h3>
444
445  <p>As you develop your library modules and dependent applications, keep the points listed below
446  in mind:</p>
447
448  <ul>
449  <li><p><strong>Resource conflicts</strong></p>
450  <p>Since the tools merge the resources of a library module with those of a dependent application
451  module, a given resource ID might be defined in both modules. In this case, the tools select
452  the resource from the application, or the library with highest priority, and discard the other
453  resource. As you develop your applications, be aware that common resource IDs are likely to be
454  defined in more than one project and will be merged, with the resource from the application or
455  highest-priority library taking precedence.</p>
456  </li>
457
458  <li><p><strong>Use prefixes to avoid resource conflicts</strong></p>
459
460  <p>To avoid resource conflicts for common resource IDs, consider using a prefix or other
461  consistent naming scheme that is unique to the module (or is unique across all project modules).</p></li>
462
463  <li><p><strong>You cannot export a library module to a JAR file</strong></p>
464
465  <p>A library cannot be distributed as a binary file (such as a JAR file). This will be added in a
466  future version of the SDK Tools.</p></li>
467
468  <li><p><strong>A library module can include a JAR library</strong></p>
469
470  <p>You can develop a library module that itself includes a JAR library; however you need to
471  manually edit the dependent application modules's build path and add a path to the JAR file.</p></li>
472
473  <li><p><strong>A library module can depend on an external JAR library</strong></p>
474
475  <p>You can develop a library module that depends on an external library (for example, the Maps
476  external library). In this case, the dependent application must build against a target that
477  includes the external library (for example, the Google APIs Add-On). Note also that both the
478  library module and the dependent application must declare the external library in their manifest
479  files, in a <a href=
480  "{@docRoot}guide/topics/manifest/uses-library-element.html"><code>&lt;uses-library&gt;</code></a>
481  element.</p></li>
482
483  <li> <p><strong>Library modules cannot include raw assets</strong></p>
484
485  <p>The tools do not support the use of raw asset files (saved in the <code>assets/</code> directory)
486  in a library module. Any asset resources
487  used by an application must be stored in the <code>assets/</code> directory of the application
488  module itself. However, resource files saved in the <code>res/</code> directory are supported.</p></li>
489
490  <li><p><strong>Platform version must be lower than or equal to the Android module</strong></p>
491
492  <p>A library is compiled as part of the dependent application module, so the API used in the
493  library module must be compatible with the version of the Android library used to compile the
494  application module. In general, the library module should use an <a href=
495  "{@docRoot}guide/topics/manifest/uses-sdk-element.html#ApiLevels">API level</a> that is the same as &mdash; or lower
496  than &mdash; that used by the application. If the library module uses an API level that is
497  higher than that of the application, the application module will not compile. It is
498  perfectly acceptable to have a library that uses the Android 1.5 API (API level 3) and that is
499  used in an Android 1.6 (API level 4) or Android 2.1 (API level 7) module, for instance.</p></li>
500
501  <li> <p><strong>No restriction on library module names</strong></p>
502
503  <p>There is no requirement for the package name of a library to be the same as that of
504  applications that use it.</p></li>
505
506  <li><p><strong>Each library module creates its own R class </strong></p>
507
508  <p>When you build the dependent application modules, library modules are compiled and
509  merged with the application module. Each library has its own <code>R</code> class, named according
510  to the library's package name. The <code>R</code> class generated from main
511  module and the library module is created in all the packages that are needed including the main
512  module's package and the libraries' packages.</p></li>
513
514  <li><p><strong>Library module storage location</strong></p>
515
516  <p>There are no specific requirements on where you should store a library module, relative to a
517  dependent application module, as long as the application module can reference the library
518  module by a relative link. What is important is that the main
519  module can reference the library module through a relative link.</p></li>
520  </ul>
521
522  <h2 id="TestProjects">Test Projects</h2>
523
524  <p>Test projects contain Android applications that you write using the
525  <a href="{@docRoot}tools/testing/index.html">Testing and
526  Instrumentation framework</a>. The framework is an extension of the JUnit test framework and adds
527  access to Android system objects. </p>
528
529  <p>The test projects are now automatically part of the app source folder. When a new application
530  module is created, Android Studio creates the <code>src/androidTest</code> source set. This
531  source set contains tests for the default configuration and is combined with the <em>debug</em>
532  build type to generate a test application. </p>
533
534  <img src="{@docRoot}images/tools/studio-androidtest-folder.png">
535  <p class="img-caption"><strong>Figure 1.</strong> androidTest Folder.</p>
536
537  <p class="note"><strong>Note:</strong> The <code>src/androidTest</code> source set may not be
538  created for every type of available module template. If this source set is not created, you
539  can just create it for that module.</p>
540
541  <p>For each product flavor, create a test folder specific to that product flavor.  </p>
542
543  <dl>
544    <dt><code>src/main/</code></dt>
545    <dd><code>src/androidTest/</code></dt>
546
547    <dt><code>src/productFlavor1/</code></dt>
548    <dd><code>src/testproductFlavor1/</code></dd>
549
550    <dt><code>src/productFlavor2/</code></dt>
551    <dd><code>src/testproductFlavor2/</code></dd>
552
553  </dl>
554
555  <p>The test manifests are always generated so a manifest in a test source set is optional.</p>
556
557  <p>The test applications run against the <em>debug</em> build type.  This can be configured
558  using the <code>testBuildType</code> property in the build file.</p>
559
560
561  <p>For more information, see the
562  <a href="{@docRoot}tools/testing/index.html">Testing</a> section.</p>
563
564
565  <h2 id="testing">Testing a Library Module</h2>
566
567  <p>There are two recommended ways of setting up testing on code and resources in a library
568  module:</p>
569
570  <ul>
571    <li>You can set up a <a href="{@docRoot}tools/testing/testing_otheride.html">test
572    module</a> that instruments an application module that depends on the library module. You
573    can then add tests to the module for library-specific features.</li>
574
575    <li>You can set up a standard application module that depends on the library and put
576    the instrumentation in that module. This lets you create a self-contained module that
577    contains both the tests/instrumentations and the code to test.</li>
578  </ul>
579