【问题标题】:Android studio: new project vs new moduleAndroid Studio:新项目与新模块
【发布时间】:2013-06-15 17:48:36
【问题描述】:

Android Studio 使用 modules 的概念,而 Eclipse 等其他 IDE 使用 projects。 但是 AS File 菜单可以选择创建 New Modulenew Project

如果有的话,这两者有什么区别?

推荐使用哪一种?

【问题讨论】:

    标签: android android-studio


    【解决方案1】:

    亲吻答案:

    Android Studio 中的

    module 类似于 Eclipse

    中的 项目 Android Studio 中的

    项目 就像 Eclipse

    中的工作区

    【讨论】:

    • 我自己一直在努力解决这个问题,虽然这似乎是概念上的情况,但我很困惑。当我在 Android Studio 中创建一个新的“项目”时,我会看到一个向导,询问我有关主题、ActionBar 的使用、网格布局等内容。我原以为这些事情会留给模块。如果这些问题只是将适当的支持库添加到“项目”中,那么我理解,但在创建新模块时我也会看到这些相同的东西。相当混乱。
    • 你说得有道理,但接受的答案只是指出了尝试使用 android studio 时的问题,就好像它是 eclipse 一样。大多数寻找这个问题的人只需要知道类比是什么。
    • 在 Android 中创建一个新项目看起来不像是一个带有 manifest / res / 和 src 的应用程序 - 与“工作区”相对。创建模块时,提供的两种类型是 1) 应用程序模块和 2) android 库模块。 #1 对“新项目”来说似乎是多余的,而 #1 和 #2 似乎是一样的。
    • oO 真的是一个模块吗?!
    • @MartinPfeffer - 不,但这是最接近的类比,请在此处阅读更多内容:jetbrains.org/intellij/sdk/docs/basics/project_structure.html
    【解决方案2】:

    来自the documentation(Android Studio 基于 Intellij IDEA):

    无论您在 IntelliJ IDEA 中做什么,都是在 项目。项目是一个组织单位,代表一个 完整的软件解决方案。

    你的成品可能会分解成一系列离散的, 孤立的模块,但它是一个项目定义带来它们 将它们联系在一起,形成一个更大的整体。

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

    如果您尝试在同一个项目中构建多个应用程序,则会出现多个问题。这是可能的,但是如果你尝试(像我一样),你会发现几乎所有的东西都是为每个项目使用一个应用程序而设计的。

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

    【讨论】:

    • “这意味着每个应用程序一个项目,每个库和每个测试应用程序一个模块”......这是什么意思?如果“测试应用”是一个应用,那么每个项目只能有两个模块,一个用于应用(常规或测试应用),一个用于库。
    • @LarsH,我将其改写为:“每个主应用程序一个项目”
    • 这不是答案。不好的答案
    【解决方案3】:
    Android Studio 中的

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

    模块是您可以独立构建、测试或调试的应用组件。

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

    【讨论】:

      【解决方案4】:

      来自updated docs[2019]:

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

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

      例如:

      • 手机和平板模块
      • Android Wear 模块
      • Android 电视模块
      • 玻璃模块

      除此之外,您还可以拥有“本地库模块”。假设您开发了一个帐户管理框架作为最终在您的应用程序中使用的库模块,您可以在同一个项目中将其作为单独的模块来完成。要将其包含在您的应用程序中,您必须编写类似的内容,

      compile project(':mylibrary')
      

      文档说,

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

      最后,Intellij mentions 更多关于模块配置文件的详细信息:

      模块的配置信息存储在 .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>
      

      【讨论】:

      • 虽然公认的答案是固定的,但时间和谷歌的随风而变的趋势已经使它过时了(我敢说,@Deprecated?)。这更有意义。
      【解决方案5】:

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

      这是面向 Eclipse 用户的 IntelliJ IDEA Q&A 页面-

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

      【讨论】:

        【解决方案6】:

        模块就像 apkLibs,即它有自己的资源、清单、测试等,但主应用程序通常使用各种 apklibs/模块来帮助将它们放在一个解决方案中

        【讨论】:

          【解决方案7】:

          Android Studio 结构

          Project <- Module <- Configuration
          

          Project 合并单个或多个模块,模块可以没有、一个或多个配置(应用程序、测试...)

          Module 用于分组、重用、构建时间目的。它可以为应用程序或库/框架创建

          Single Project 允许您管理在同一个业务项目范围内可能遇到的所有案例。例如,您正在开发一些 SDK,这就是为什么您应该有 SDK 模块,还应该通过演示应用程序(Java 和 Kotlin 语言)提供消费者,这就是您创建包含您的 SDK 的应用程序模块的原因,然后您决定将您的 SDK 模块化并创建具有它们之间依赖关系的单独模块。

          [Xcode structure]
          [Swift module]

          【讨论】:

            【解决方案8】:

            参考@Oded Breiner 的回答,我想说:

            Android Studio 中的

            module 类似于 Eclipse

            中的 项目 Android Studio 中的

            项目 就像 Eclipse

            中的工作集

            【讨论】:

            • 并非如此。恕我直言,Eclipse 中的“工作集”只是当前工作空间的“过滤器”。 Eclipse中不能有两个工作区,也不能在同一个Android Studio实例中打开两个项目(实际上打开另一个项目时,必须替换前者,或者在一个新窗口)
            • 您可以建议编辑而不是参考原始答案,只需稍作改动!
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多