Android Studio:新项目与新模块


141

Android Studio使用的概念modules,而Eclipse等其他IDE则使用projects。但是,AS File菜单具有创建New Module和的选项new Project

两者之间有什么区别?

建议使用哪一个?

Answers:


102

文档(Android Studio基于Intellij IDEA):

无论您在IntelliJ IDEA中做什么,都可以在项目环境中进行。项目是代表完整软件解决方案的组织单位。

您的成品可能会分解为一系列离散的,隔离的模块,但这是一个项目定义,将它们组合在一起并将它们联系在一起成为一个更大的整体。

对于Android,这意味着每个应用程序一个项目,每个库和每个测试应用程序一个模块。

如果您尝试在同一项目中构建多个应用程序,则会出现多个问题。有可能,但是如果您尝试(像我一样),您会发现几乎所有内容都旨在与每个项目的单个应用程序一起使用。

例如,有一个选项“重建项目”,这对于多个应用程序没有任何意义,许多其他项目设置将毫无用处,并且当您有多个存储库时,内置的VCS系统也不是很好。


1
“这意味着每个应用程序一个项目,每个库和每个测试应用程序一个模块”……这是什么意思?如果“测试应用程序”是一个应用程序,则每个项目只能有两个模块,一个模块用于一个应用程序(常规或测试应用程序),一个模块用于库。
LarsH 2015年

2
@LarsH,我将其改写为:“每个主应用程序都有一个项目”
Nico

4
这不是答案。错误的答案
metis

169

吻答案:

模块Android的工作室就像一个项目Eclipse中

项目Android的工作室就像一个工作区Eclipse中


8
我本人一直在为这个问题而苦苦挣扎,虽然这似乎是概念上的情况,但我感到困惑。当我在Android Studio中创建新的“项目”时,会看到一个向导,向我询问诸如主题,ActionBar使用,网格布局等问题。我本以为这些事情将留给模块。如果仅是这些问题,那么就可以将适当的支持库添加到“项目”中,那么我理解了,但是在创建新模块时,我也会看到同样的事情。相当混乱。
Scott Naef 2014年

2
您有一个要点,但是被接受的答案只是指出了尝试与android studio一起工作时遇到的问题,就像日食一样。寻找这个问题的大多数人只需要知道类比是什么。
Oded Breiner 2014年

在Android中创建新项目看起来并不像带有manifest / res /和src的应用程序(与“工作区”相对应)。创建模块时,提供的两种类型是1)应用程序模块和2)android库模块。#1似乎对“新项目”是多余的,而#1和#2似乎是相同的。
user1679130 2015年

哦,模块真的那么多吗?
Martin Pfeffer

1
@MartinPfeffer-不,但这是最接近的类比,请在此处阅读更多信息:jetbrains.org/intellij/sdk/docs/basics/project_structure.html
Oded Breiner 2015年

35

一个项目Android Studio中代表一个完整的Android应用程序。Android Studio项目由一个或多个 模块组成

一个模块是你的应用程序,你可以独立构建,测试和调试的一个组成部分。

模块包含应用程序的源代码和资源。


10

更新的文档 [2019]:

模块为应用程序的源代码,资源文件和应用程序级别设置(例如模块级别的构建文件和Android清单文件)提供了容器。每个模块都可以独立构建,测试和调试。

Android Studio使用模块可以轻松地将新设备添加到项目中。通过在Android Studio中执行一些简单的步骤,您可以创建一个模块,以包含特定于设备类型(例如Wear OS或Android TV)的代码。Android Studio会自动创建模块目录(例如源目录和资源目录)以及适用于设备类型的默认build.gradle文件。此外,Android Studio会使用推荐的构建配置来创建设备模块,例如将Leanback库用于Android TV模块。

例如:

  • 手机和平板电脑模块
  • Android Wear模块
  • Android TV模块
  • 玻璃模组

除了这些,您还可以有一个“本地库模块”。假设您将帐户管理框架开发为最终要在您的App中使用的库模块,则可以将其作为同一项目中的单独模块来进行开发。要将其包含在您的应用中,您将必须编写如下内容:

compile project(':mylibrary')

医生说,

这声明了对名为“ mylibrary”的Android库模块的依赖性(此名称必须与在settings.gradle文件中定义为include的库名称匹配)。它要求构建系统将库模块与您的应用程序模块一起编译,并将生成的AAR文件包含在您的APK中。

最后,Intellij提到了有关模块配置文件的更多详细信息:

模块的配置信息存储在.iml模块文件中。默认情况下,此类文件位于模块的内容根文件夹中。

通常,开发团队.iml通过版本控制共享模块文件。

这个.iml文件看起来有点吓人。这是我的项目中的一个示例:

<?xml version="1.0" encoding="UTF-8"?>
<module external.linked.project.id=":app" external.linked.project.path="$MODULE_DIR$" external.root.project.path="$MODULE_DIR$/.." external.system.id="GRADLE" external.system.module.group="LearnCity" external.system.module.version="unspecified" type="JAVA_MODULE" version="4">
  <component name="FacetManager">
    <facet type="android-gradle" name="Android-Gradle">
      <configuration>
        <option name="GRADLE_PROJECT_PATH" value=":app" />
      </configuration>
    </facet>
    <facet type="android" name="Android">
      <configuration>
        <option name="SELECTED_BUILD_VARIANT" value="debug" />
        <option name="ASSEMBLE_TASK_NAME" value="assembleDebug" />
        <option name="COMPILE_JAVA_TASK_NAME" value="compileDebugSources" />
        <afterSyncTasks>
          <task>generateDebugSources</task>
        </afterSyncTasks>
        <option name="ALLOW_USER_CONFIGURATION" value="false" />
        <option name="MANIFEST_FILE_RELATIVE_PATH" value="/src/main/AndroidManifest.xml" />
        <option name="RES_FOLDER_RELATIVE_PATH" value="/src/main/res/layouts/common/layout/ver3/layout" />
        <option name="RES_FOLDERS_RELATIVE_PATH" value="file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver3/layout;file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver3;file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver2/layout;file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver2;file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver1/layout;file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver1;file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver0/layout;file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver0;file://$MODULE_DIR$/src/main/res/layouts/common/layout;file://$MODULE_DIR$/src/main/res/layouts/learner/layout;file://$MODULE_DIR$/src/main/res/layouts/tutor/layout;file://$MODULE_DIR$/src/main/res/layouts/obsolete/layout;file://$MODULE_DIR$/src/main/res/layouts/common;file://$MODULE_DIR$/src/main/res/layouts/learner;file://$MODULE_DIR$/src/main/res/layouts/tutor;file://$MODULE_DIR$/src/main/res/layouts/obsolete;file://$MODULE_DIR$/src/main/res/layouts;file://$MODULE_DIR$/src/main/res;file://$MODULE_DIR$/src/debug/res" />
        <option name="ASSETS_FOLDER_RELATIVE_PATH" value="/src/main/assets" />
      </configuration>
    </facet>
  </component>
  <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_7" inherit-compiler-output="false">
    <output url="file://$MODULE_DIR$/build/intermediates/classes/debug" />
    <output-test url="file://$MODULE_DIR$/build/intermediates/classes/test/debug" />
    <exclude-output />
    <content url="file://$MODULE_DIR$">
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/debug" isTestSource="false" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/debug" isTestSource="false" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/debug" isTestSource="false" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/debug" isTestSource="false" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/debug" isTestSource="false" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/google-services/debug" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/debug" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/debug" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/r/androidTest/debug" isTestSource="true" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/aidl/androidTest/debug" isTestSource="true" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/buildConfig/androidTest/debug" isTestSource="true" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/rs/androidTest/debug" isTestSource="true" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/source/apt/androidTest/debug" isTestSource="true" generated="true" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/rs/androidTest/debug" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/build/generated/res/resValues/androidTest/debug" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/res" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/resources" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/assets" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/aidl" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/rs" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/debug/shaders" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/res" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/resources" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/assets" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/aidl" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/rs" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/testDebug/shaders" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver3/layout" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver3" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver2/layout" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver2" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver1/layout" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver1" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver0/layout" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/common/layout/ver0" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/common/layout" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/learner/layout" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/tutor/layout" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/obsolete/layout" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/common" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/learner" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/tutor" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts/obsolete" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res/layouts" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/res" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/assets" type="java-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/aidl" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/rs" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/main/shaders" isTestSource="false" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/res" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/resources" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/assets" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/aidl" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/rs" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/androidTest/shaders" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/res" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/resources" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/assets" type="java-test-resource" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/aidl" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/rs" isTestSource="true" />
      <sourceFolder url="file://$MODULE_DIR$/src/test/shaders" isTestSource="true" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/assets" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/blame" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/builds" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/classes" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-classes" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-runtime-classes" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-safeguard" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/incremental-verifier" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-resources" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/instant-run-support" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/jniLibs" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/manifests" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/multi-dex" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/pre-dexed" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/reload-dex" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/res" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/restart-dex" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/rs" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/shaders" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/split-apk" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/symbols" />
      <excludeFolder url="file://$MODULE_DIR$/build/intermediates/transforms" />
      <excludeFolder url="file://$MODULE_DIR$/build/outputs" />
      <excludeFolder url="file://$MODULE_DIR$/build/tmp" />
    </content>
    <orderEntry type="jdk" jdkName="Android API 25 Platform" jdkType="Android SDK" />
    <orderEntry type="sourceFolder" forTests="false" />
    <orderEntry type="library" exported="" name="google-http-client-android-1.22.0" level="project" />
    <orderEntry type="library" exported="" name="firebase-analytics-10.2.0" level="project" />
    <orderEntry type="library" exported="" name="firebase-core-10.2.0" level="project" />
    <orderEntry type="library" exported="" name="play-services-auth-base-10.2.0" level="project" />
    <orderEntry type="library" exported="" name="gson-2.8.0" level="project" />
    <orderEntry type="library" exported="" name="play-services-tasks-10.2.0" level="project" />
    <orderEntry type="library" exported="" name="constraint-layout-1.0.2" level="project" />
    <orderEntry type="library" exported="" name="appengine-api-1.0-sdk-1.9.50" level="project" />
    <orderEntry type="library" exported="" name="design-25.3.0" level="project" />
    <orderEntry type="library" exported="" name="android-job-1.1.8" level="project" />
    <orderEntry type="library" exported="" name="transition-25.3.0" level="project" />
    <orderEntry type="library" exported="" name="play-services-base-10.2.0" level="project" />
    <orderEntry type="library" exported="" name="multispinner-0.1.1" level="project" />
    <orderEntry type="library" exported="" name="play-services-auth-10.2.0" level="project" />
    <orderEntry type="library" exported="" name="support-core-ui-25.3.0" level="project" />
    <orderEntry type="library" exported="" name="simpleratingbar-0.1.5" level="project" />
    <orderEntry type="library" exported="" name="play-services-maps-10.2.0" level="project" />
    <orderEntry type="library" exported="" name="play-services-location-10.2.0" level="project" />
    <orderEntry type="library" exported="" name="firebase-iid-10.2.0" level="project" />
    <orderEntry type="library" exported="" name="support-core-utils-25.3.0" level="project" />
    <orderEntry type="library" exported="" name="jsr305-2.0.1" level="project" />
    <orderEntry type="library" exported="" name="support-fragment-25.3.0" level="project" />
    <orderEntry type="library" exported="" scope="TEST" name="multidex-instrumentation-1.0.1" level="project" />
    <orderEntry type="library" exported="" name="constraint-layout-solver-1.0.2" level="project" />
    <orderEntry type="library" exported="" name="androidannotations-api-3.2" level="project" />
    <orderEntry type="library" exported="" name="java-uuid-generator-3.1.4" level="project" />
    <orderEntry type="library" exported="" name="google-http-client-1.22.0" level="project" />
    <orderEntry type="library" exported="" name="firebase-messaging-10.2.0" level="project" />
    <orderEntry type="library" exported="" name="firebase-analytics-impl-10.2.0" level="project" />
    <orderEntry type="library" exported="" name="firebase-common-10.2.0" level="project" />
    <orderEntry type="library" exported="" name="eventbus-3.0.0" level="project" />
    <orderEntry type="library" exported="" name="cat-1.0.5" level="project" />
    <orderEntry type="library" exported="" name="play-services-basement-10.2.0" level="project" />
    <orderEntry type="library" exported="" name="support-compat-25.3.0" level="project" />
    <orderEntry type="library" exported="" name="support-v4-25.3.0" level="project" />
    <orderEntry type="library" exported="" name="multidex-1.0.1" level="project" />
    <orderEntry type="library" exported="" scope="TEST" name="hamcrest-core-1.3" level="project" />
    <orderEntry type="library" exported="" name="support-media-compat-25.3.0" level="project" />
    <orderEntry type="library" exported="" scope="TEST" name="junit-4.12" level="project" />
    <orderEntry type="library" exported="" name="recyclerview-v7-25.3.0" level="project" />
    <orderEntry type="library" exported="" name="appcompat-v7-25.3.0" level="project" />
    <orderEntry type="library" exported="" name="animated-vector-drawable-25.3.0" level="project" />
    <orderEntry type="library" exported="" name="support-annotations-25.3.0" level="project" />
    <orderEntry type="library" exported="" name="support-vector-drawable-25.3.0" level="project" />
    <orderEntry type="module" module-name="backend" exported="" />
    <orderEntry type="library" exported="" name="android-android-25" level="project" />
  </component>
</module>

尽管公认的答案是一成不变的,但时间和Google随风而变的趋势已使它过时了(我敢说@Deprecated吗?)。这更有意义。
Scott Biggs

1

IntelliJ IDEA为您使用的整个代码库创建一个项目,并为其每个单独的组件创建一个模块。因此,IntelliJ IDEA模块更像是一个Eclipse项目,并且该项目与Eclipse工作区大致相似。包含您所有工作的Eclipse工作空间并不完全等效,但是您可以同时在多个框架中打开多个项目。

这是Eclipse用户的IntelliJ IDEA问答页面-

http://www.jetbrains.com/idea/documentation/migration_faq.html


1

模块就像apkLibs一样,即它具有自己的资源,清单,测试等,但是主应用程序通常使用各种apklibs /模块来将它们整合到一个解决方案中


-5

提到@Oded Breiner的答案,我会说:

模块Android的工作室就像一个项目Eclipse中

项目Android的工作室就像一个工作组Eclipse中


1
并不是的。Eclipse中的恕我直言“工作集”只是当前工作空间的“过滤器”。您在Eclipse中不能有两个工作区,也不能在同一Android Studio实例中打开两个项目(实际上,当您打开另一个项目时,必须替换前一个项目,或在其中打开后者一个新窗口)
ocramot

1
您可以建议编辑,而只需稍作改动即可引用原始答案!
kokabi '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.