Студия Android: новый проект и новый модуль

Android Studio использует концепцию modules, тогда как другие IDE, такие как Eclipse, используют projects. Однако в меню AS File есть возможность создать New Module, а также new Project.

Каковы различия между этими двумя, если они есть?

Какой из них рекомендуется использовать?

Ответ 1

Из документация (Android Studio основана на Intellij IDEA):

Что бы вы ни делали в IntelliJ IDEA, вы делаете это в контексте проект. Проект является организационной единицей, которая представляет собой полное программное решение.

Готовый продукт можно разложить на несколько дискретных, изолированных модулей, но это определение проекта, которое приносит им вместе и связывает их с большим целым.

Для Android это означает один проект для каждого приложения и один модуль для каждой библиотеки и для каждого тестового приложения.

При попытке создания нескольких приложений в одном проекте существует несколько проблем. Это возможно, но если вы попробуете (как и я), вы увидите, что почти все предназначено для работы с одним приложением для каждого проекта.

Например, существует возможность "перестроить проект", что не имеет смысла в нескольких приложениях, многие другие параметры проекта будут бесполезны, а встроенная система VCS невелика, когда у вас несколько репозиториев.

Ответ 2

Ответ KISS:

модуль в Android Studio похож на проект в Eclipse

проект в Android Studio похож на рабочее пространство в Eclipse

Ответ 3

A проект в Android Studio представляет собой полное приложение для Android. Проекты Android Studio состоят из одного или нескольких модулей.

A модуль - это компонент вашего приложения, который вы можете самостоятельно создавать, тестировать или отлаживать.

Модули содержат исходный код и ресурсы для вашего приложения.

Ответ 4

Из обновленных документов [2019]:

Модули предоставляют контейнер для вашего исходного кода приложения, ресурса файлы и настройки уровня приложения, такие как файл сборки на уровне модуля и Файл манифеста Android. Каждый модуль может быть независимо собран, протестирован, и отлажены.

Android Studio использует модули, чтобы упростить добавление новых устройств к вашему проект. Выполнив несколько простых шагов в Android Studio, вы можете создать модуль, содержащий код, соответствующий типу устройства, например Как носить ОС или Android TV. Android Studio автоматически создает модуль каталоги, такие как каталоги источников и ресурсов, а также каталоги по умолчанию Файл build.gradle, соответствующий типу устройства. Также Android Studio создает модули устройства с рекомендуемыми конфигурациями сборки, например, использование библиотеки Leanback для модулей Android TV.

Пример:

  • Телефон & Модуль планшета
  • Модуль Android Wear
  • Модуль Android TV
  • Стеклянный модуль

Помимо этого, вы также можете иметь "модуль локальной библиотеки". Скажем, вы разрабатываете Account Management Framework как библиотечный модуль, который в конечном итоге будет использоваться в вашем приложении, вы можете сделать это как отдельный модуль в том же проекте. Чтобы включить это в свое приложение, вам нужно написать что-то вроде

compile project(':mylibrary')

Документы говорят,

Это объявляет зависимость от модуля библиотеки Android с именем "mylibrary" (это имя должно совпадать с именем библиотеки, определенной как включите в ваш файл settings.gradle). Требуется система сборки для скомпилируйте модуль библиотеки с вашим модулем приложения и включите Полученный файл 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>

Ответ 5

IntelliJ IDEA создает проект для всей базы кода, с которой вы работаете, и модуль для каждого из его отдельных компонентов. Таким образом, модуль IntelliJ IDEA больше похож на проект Eclipse, а проект примерно похож на рабочее пространство Eclipse. Там нет точного эквивалента рабочего пространства Eclipse, которое содержит всю вашу работу, но вы можете одновременно открывать несколько проектов в нескольких кадрах.

Вот страница IntelliJ IDEA Q & A для пользователей Eclipse -

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

Ответ 6

Модули похожи на apkLibs, т.е. имеют свои собственные res, manifest, tests и т.д., но основное приложение обычно использует различные apklibs/modules, чтобы помочь собрать все вместе в одном решении.

Ответ 7

Ссылаясь на ответ @Oded Breiner, я бы сказал, что:

модуль в Android Studio похож на проект в Eclipse

проект в Android Studio похож на рабочий набор в Eclipse