Android สตูดิโอใช้แนวคิดของmodules
ขณะ IDEs อื่น ๆ projects
เช่นการใช้งาน อย่างไรก็ตามFile
เมนูAS มีตัวเลือกในการสร้างNew Module
new Project
เช่นเดียวกับ
อะไรคือความแตกต่างระหว่างสองสิ่งนี้ถ้ามี?
แนะนำให้ใช้อันไหน
Android สตูดิโอใช้แนวคิดของmodules
ขณะ IDEs อื่น ๆ projects
เช่นการใช้งาน อย่างไรก็ตามFile
เมนูAS มีตัวเลือกในการสร้างNew Module
new Project
เช่นเดียวกับ
อะไรคือความแตกต่างระหว่างสองสิ่งนี้ถ้ามี?
แนะนำให้ใช้อันไหน
คำตอบ:
จากเอกสาร (Android Studio ใช้ Intellij IDEA):
ไม่ว่าคุณจะทำอะไรใน IntelliJ IDEA คุณจะทำเช่นนั้นในบริบทของโครงการ โครงการเป็นหน่วยองค์กรที่แสดงถึงโซลูชันซอฟต์แวร์ที่สมบูรณ์
ผลิตภัณฑ์ที่เสร็จแล้วของคุณอาจถูกแยกย่อยเป็นชุดของโมดูลที่แยกและแยก แต่เป็นคำจำกัดความของโครงการที่รวมเข้าด้วยกัน
สำหรับ Android หมายถึงหนึ่งโครงการต่อหนึ่งแอพและหนึ่งโมดูลต่อไลบรารีและต่อแอปทดสอบ
มีหลายปัญหาหากคุณพยายามสร้างแอพหลายตัวภายในโครงการเดียวกัน เป็นไปได้ แต่ถ้าคุณลอง (เหมือนที่เคยทำ) คุณจะเห็นว่าเกือบทุกอย่างได้รับการออกแบบให้ทำงานกับแอพเดียวต่อโปรเจ็กต์
ตัวอย่างเช่นมีตัวเลือกในการ "สร้างโครงการใหม่" ซึ่งไม่เหมาะสมกับแอพหลายตัวการตั้งค่าโปรเจ็กต์อื่น ๆ จะไร้ประโยชน์และระบบ VCS ในตัวไม่ดีเมื่อคุณมีที่เก็บหลายแห่ง
จูบคำตอบ:
โมดูลในAndroid Studioเป็นเหมือนโครงการในEclipse
โปรเจ็กต์ในAndroid Studioเป็นเหมือนพื้นที่ทำงานในEclipse
โครงการในAndroid สตูดิโอแสดงให้เห็นถึงแอป Android สมบูรณ์ โครงการ Android Studio ประกอบด้วยหนึ่ง โมดูลขึ้นไปไป
โมดูลเป็นส่วนประกอบของแอปที่คุณสามารถสร้างทดสอบหรือการแก้ปัญหาได้อย่างเป็นอิสระ
โมดูลประกอบด้วยซอร์สโค้ดและแหล่งข้อมูลสำหรับแอปของคุณ
โมดูลจัดเตรียมคอนเทนเนอร์สำหรับซอร์สโค้ดของแอปไฟล์ทรัพยากรและการตั้งค่าระดับแอพของคุณเช่นไฟล์บิลด์ระดับโมดูลและไฟล์รายการ Android แต่ละโมดูลสามารถสร้างทดสอบและดีบักได้อย่างอิสระ
Android Studio ใช้โมดูลเพื่อให้ง่ายต่อการเพิ่มอุปกรณ์ใหม่ในโครงการของคุณ โดยทำตามขั้นตอนง่ายๆใน Android Studio คุณสามารถสร้างโมดูลเพื่อให้มีรหัสที่เฉพาะเจาะจงกับประเภทอุปกรณ์เช่น Wear OS หรือ Android TV Android Studio สร้างไดเรกทอรีโมดูลโดยอัตโนมัติเช่นแหล่งข้อมูลและไดเรกทอรีทรัพยากรและไฟล์ build.gradle เริ่มต้นที่เหมาะสมกับประเภทอุปกรณ์ นอกจากนี้ Android Studio ยังสร้างโมดูลอุปกรณ์ที่มีการกำหนดค่าการสร้างที่แนะนำเช่นการใช้ห้องสมุด Leanback สำหรับโมดูล Android TV
Ex:
นอกจากนี้คุณยังสามารถมี "โมดูลห้องสมุดท้องถิ่น" สมมติว่าคุณพัฒนา 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>
@Deprecated
หรือไม่?) มันสมเหตุสมผลมากกว่านี้
IntelliJ IDEA สร้างโครงการสำหรับฐานรหัสทั้งหมดที่คุณทำงานด้วยและโมดูลสำหรับแต่ละองค์ประกอบ ดังนั้นโมดูล IntelliJ IDEA จึงเป็นเหมือนโครงการ Eclipse และโครงการมีความคล้ายคลึงกับพื้นที่ทำงานคราส ไม่มีอะไรเทียบเท่ากับพื้นที่ทำงานของ Eclipse ที่มีงานทั้งหมดของคุณ แต่คุณสามารถเปิดหลายโครงการในหลายเฟรมในเวลาเดียวกัน
นี่คือหน้าถามตอบ IntelliJ IDEA สำหรับผู้ใช้ Eclipse-
http://www.jetbrains.com/idea/documentation/migration_faq.html
โมดูลเป็นเหมือน apkLibs เช่นมีความละเอียดรายการการทดสอบ ฯลฯ แต่แอปหลักมักจะใช้ apklibs / โมดูลต่าง ๆ เพื่อช่วยรวบรวมทั้งหมดไว้ในโซลูชันเดียว
หมายถึง @Oded Breiner คำตอบฉันจะบอกว่า:
โมดูลในAndroid Studioเป็นเหมือนโครงการในEclipse
โปรเจ็กต์ในAndroid Studioเป็นเหมือนชุดการทำงานในEclipse