ความลึกลับ: โครงสร้างโครงการและระบบสร้างของ Android Studio
ฉันไม่รู้ว่านี่เป็นเพราะ Gradle Build System หรือเปล่า (ฉันจะเดิมพัน) แต่ฉันจะบอกคุณว่าฉันเข้าใจอะไรจนถึงตอนนี้
ปรับปรุง 4: 2014/09/11 เพิ่มโกงแผ่นสำหรับBuildTypes
, Flavors
และVariants
(ในที่สุดผมก็รู้สึกมั่นใจที่จะเขียนนี้: D)
ปรับปรุง 3: 2014/09/11 ปรับปรุงพื้นที่ทำงานการเปรียบเทียบและโครงการที่จะแม่นยำ
ปรับปรุง 2: 2014/04/17 เพิ่มรายละเอียดเพิ่มเติมในโครงสร้างโครงการ AS
อัปเดต 1: 2013/07/29 เพิ่มโครงสร้างโครงการ IntelliJ
โครงสร้างโครงการของ IntelliJ (แสดงไว้ตอนท้าย) ใช้สำหรับ IntelliJ ที่มีปลั๊กอิน android อย่างไรก็ตาม Android Studio มีโครงสร้างโครงการที่แบ่งออกดังนี้:
โครงสร้าง: โครงการและโมดูล
โมดูลในAndroid Studioก็เหมือนกับโปรเจ็กต์ในEclipse
โปรเจ็กต์ในAndroid Studioเปรียบเสมือนพื้นที่ทำงานในEclipse (พูดให้ถูกต้องคือพื้นที่ทำงานที่มีโปรเจ็กต์ที่พึ่งพาซึ่งกันและกัน)
จากเอกสารประกอบ (Android Studio อิงตาม Intellij IDEA):
ไม่ว่าคุณจะทำอะไรใน IntelliJ IDEA คุณก็ทำในบริบทของโปรเจ็กต์ โครงการคือหน่วยขององค์กรที่แสดงถึงโซลูชันซอฟต์แวร์ที่สมบูรณ์
ผลิตภัณฑ์สำเร็จรูปของคุณอาจถูกย่อยสลายเป็นชุดของโมดูลที่แยกจากกันไม่ต่อเนื่อง แต่เป็นคำจำกัดความของโครงการที่นำผลิตภัณฑ์เหล่านี้มารวมกันและเชื่อมโยงเข้าด้วยกันทั้งหมด
สำหรับ Android หมายถึงหนึ่งโครงการต่อแอปและหนึ่งโมดูลต่อไลบรารีและต่อแอปทดสอบ
มีปัญหาหลายประการหากคุณพยายามสร้างหลายแอปภายในโครงการเดียวกัน เป็นไปได้ แต่ถ้าคุณลอง (เหมือนที่ฉันทำ) คุณจะเห็นว่าเกือบทุกอย่างถูกออกแบบมาให้ทำงานกับแอปเดียวต่อโครงการ
ตัวอย่างเช่นมีตัวเลือกในการ "สร้างโปรเจ็กต์ใหม่" ซึ่งไม่สมเหตุสมผลกับแอพหลายตัวการตั้งค่าโปรเจ็กต์อื่น ๆ อีกมากมายจะไม่มีประโยชน์และระบบ VCS ในตัวจะไม่ดีเมื่อคุณมีที่เก็บหลายแห่ง
โครงสร้าง: โครงสร้างโฟลเดอร์
โฟลเดอร์ระดับบนสุด
1. โครงการหลัก
นี่จะเป็นบริบทโครงการทั้งหมด( Eclipse Land:เช่นเดียวกับพื้นที่ทำงานของคุณ แต่ จำกัด เฉพาะสิ่งที่เกี่ยวข้องกับโครงการของคุณ) เช่นHelloWorldProject
หากชื่อแอปพลิเคชันที่คุณระบุคือHelloWorld
2. .idea
Android Studio (AS) จัดเก็บข้อมูลเมตาเฉพาะโครงการ ( Eclipse Land: project.properties
ไฟล์)
3. โมดูลโครงการ
นี่คือโครงการที่เกิดขึ้นจริง เช่นHelloWorld
หากชื่อแอปพลิเคชันของคุณที่คุณตั้งคือ HelloWorld
4. ไล่สี
นี่คือที่มาของ jar wrapper ของระบบ gradle build เช่น jar นี้เป็นวิธีที่ AS สื่อสารกับ gradle ที่ติดตั้งใน Windows (ระบบปฏิบัติการในกรณีของฉัน)
5. ห้องสมุดภายนอก
นี่ไม่ใช่โฟลเดอร์จริง ๆ แต่เป็นตำแหน่งที่แสดง Referenced Libraries ( Eclipse Land: Referenced Libraries) นี่คือตำแหน่งที่แสดงแพลตฟอร์มเป้าหมายเป็นต้น
[ หมายเหตุด้านข้าง:ที่ซึ่งพวกเราหลายคนใน Eclipse Land ใช้ในการลบไลบรารีที่อ้างอิงและ Fix Project Properties เพื่อแก้ไขข้อผิดพลาดในการอ้างอิงจำได้ไหม]
โฟลเดอร์โครงการโดยละเอียด
นี่คือหมายเลข # 3 ในรายการด้านบน มี dirs ย่อยดังต่อไปนี้
1. สร้าง
สิ่งนี้มีผลลัพธ์ทั้งหมดของmake
กระบวนการเช่น class.dex คลาสที่คอมไพล์และทรัพยากรเป็นต้น
ใน Android Studio GUI จะแสดงโฟลเดอร์เพียงไม่กี่โฟลเดอร์ ส่วนที่สำคัญคือR.java ของคุณอยู่ที่นี่ภายใต้build/source/<flavor>/r/<build type(optional)>/<package>/R.java
2. libs
นี่คือโฟลเดอร์ libs มาตรฐานที่คุณเห็นในeclipse landด้วย
3. src
ที่นี่คุณจะเห็นเพียงjava
และres
โฟลเดอร์ซึ่งสอดคล้องกับsrc
โฟลเดอร์และres
โฟลเดอร์ในEclipse ที่ดิน นี่เป็นสิ่งที่น่ายินดีอย่างยิ่งสำหรับการทำให้ IMHO เข้าใจง่าย
หมายเหตุเกี่ยวกับโมดูล:
โมดูลก็เหมือนกับโครงการEclipse Land แนวคิดก็คือคุณมีโครงการแอปพลิเคชันหนึ่งโครงการ (โมดูล # 3 ในรายการด้านบน) และโครงการห้องสมุดหลายโครงการ (เป็นโมดูลแยกต่างหากภายใต้โฟลเดอร์โครงการส่วนกลาง (# 1 ในรายการด้านบน)) ซึ่งโครงการแอปพลิเคชันขึ้นอยู่กับ โครงการห้องสมุดเหล่านี้สามารถใช้ซ้ำในแอปพลิเคชันอื่นได้อย่างไรฉันยังไม่พบ
[ หมายเหตุด้านข้าง:การจัดระเบียบใหม่ทั้งหมดมีประโยชน์บางอย่างเช่นการทำให้ง่ายขึ้นในโฟลเดอร์ src แต่มีข้อยุ่งยากมากมาย ความยุ่งยากส่วนใหญ่เกิดจากเอกสารที่บางมากเกี่ยวกับเค้าโครงโครงการใหม่นี้]
ระบบสร้างใหม่
คู่มือผู้ใช้สำหรับระบบสร้างใหม่
คำอธิบายรสชาติและ buildTypes ฯลฯ - hullabaloo เกี่ยวกับอะไร?
CheatSheet สำหรับรสชาติและ buildTypes
BuildType: debug
และrelease
มีความbuildTypes
พร้อมใช้งานโดยค่าเริ่มต้นในทุกโครงการ ใช้สำหรับสร้าง / รวบรวมSAME CODEเพื่อสร้าง APK ที่แตกต่างกัน ตัวอย่างเช่นในrelease
APK ที่คุณต้องการเรียกใช้ proguard (สำหรับการทำให้สับสน) ลงนามด้วยคีย์ของคุณ (เทียบกับคีย์การแก้ไขข้อบกพร่อง) เรียกใช้การเพิ่มประสิทธิภาพ (อาจผ่านทางโปรการ์ดหรือเครื่องมืออื่น ๆ ) ใช้งานที่แตกต่างกันเล็กน้อยpackageNames
(เราใช้com.company.product
สำหรับrelease
และcom.company.product.debug
สำหรับdebug
) เป็นต้นนอกจากนี้เรายังใช้แฟล็กการดีบัก ( BuildConfig.DEBUG
) เพื่อปิดการบันทึกไปยัง logcat (เนื่องจากทำให้แอปทำงานช้า) ในrelease
บิลด์ สิ่งนี้ทำให้การdebug
สร้างเร็วขึ้นในระหว่างการพัฒนา แต่ยังเป็นงานrelease
สร้างที่ปรับให้เหมาะสมเพื่อวางบน Play Store
รสชาติของผลิตภัณฑ์:ไม่มีรสชาติเริ่มต้นให้ใช้งานได้ (หรือพูดให้ชัดเจนคือรสชาติเริ่มต้นคือว่างเปล่า / ไม่มีชื่อ) Flavors
อาจเป็นเวอร์ชันฟรีหรือเวอร์ชันที่ต้องชำระเงินซึ่งมีรหัสที่แตกต่างกัน พวกเขาใช้Main
รหัสเดียวกันแต่คนละเวอร์ชัน (หรือไม่มีเวอร์ชัน) ของไฟล์ซอร์สโค้ดหรือทรัพยากร
BuildVariant: A buildVariant
คือสิ่งที่ APK ที่สร้างขึ้นนั้นสอดคล้องกับจริง พวกเขาจะถูกตั้งชื่อเช่นดังนั้น (ตามลำดับ) Product Flavor
+Build Type
Build Variant
=
ตัวอย่างที่ 1:ถ้าคุณมีfree
และpaid
เป็นสองรสชาติ รูปแบบการสร้างที่คุณจะได้รับ ได้แก่
Free - debug
Free - release
Paid - debug
Paid - release
นั่นคือการกำหนดค่า APK ที่เป็นไปได้ 4 แบบ การกำหนดค่าบางอย่างอาจไม่สมเหตุสมผลในโครงการใดโครงการหนึ่ง แต่มีให้ใช้งาน
ตัวอย่างที่ 2: (สำหรับโปรเจ็กต์ใหม่ / ไม่มีรสชาติ) คุณมี 2 buildVariants
หรือ APK ที่พร้อมใช้งานเนื่องจากรสชาติเริ่มต้นคือไม่มีชื่อ / ว่างเปล่า: การ
เปิดตัวการ
แก้ปัญหา
โฟลเดอร์ .idea (1)มีโฟลเดอร์ย่อยจำนวนหนึ่งโดยส่วนใหญ่มีข้อมูล IntelliJ IDEA ภายใน
โฟลเดอร์src (2)มีซอร์สโค้ดไฟล์ MyActivity.java (3)ที่ใช้ฟังก์ชันการทำงานของแอปพลิเคชันของคุณ ไฟล์เป็นของแพ็คเกจ com.example
โฟลเดอร์res (4)ประกอบด้วยทรัพยากรภาพต่างๆ
ไฟล์ layout / main.xml (5)กำหนดลักษณะที่ปรากฏของแอปพลิเคชันที่ประกอบด้วยทรัพยากรประเภทต่างๆ
โฟลเดอร์ค่า (6)มีไว้สำหรับจัดเก็บไฟล์. xml ที่อธิบายทรัพยากรประเภทต่างๆ ปัจจุบันโฟลเดอร์มีไฟล์ strings.xml ที่มีนิยามทรัพยากรสตริง ดังที่คุณจะเห็นจากส่วนการเพิ่มสีโฟลเดอร์เค้าโครงยังสามารถมีตัวอย่างเช่นตัวบอกสี
โฟลเดอร์ที่วาดได้ (7)มีรูปภาพ
โฟลเดอร์ gen (8)มีไฟล์R.java (9)ที่เชื่อมโยงวิชวลรีซอร์สและซอร์สโค้ด Java ดังที่คุณจะเห็นจากส่วนด้านล่าง IntelliJ IDEA สนับสนุนการผสานรวมอย่างแน่นหนาระหว่างทรัพยากรแบบคงที่และ R.java ทันทีที่มีการเพิ่มหรือลบทรัพยากรใด ๆ คลาสและฟิลด์คลาสที่เกี่ยวข้องใน R.java จะถูกสร้างหรือลบออกโดยอัตโนมัติ ไฟล์ R.java ยังเป็นของแพ็คเกจ com.example