16 April 2015

Project Structure บน Android Studio

Updated on


        ผู้ที่หลงเข้ามาอ่านคนใดได้ใช้ Android Studio กันแล้ว ก็จะเห็นว่า Project Structure ของ Android Project ใน Android Studio นั้นมีความแตกต่างกับ Eclipse ADT อยู่พอสมควร (แต่ก็เข้าใจได้ไม่ยาก) ทั้งนี้ก็เพราะว่า Eclipse ADT กับ Android Studio ใช้ Build System ที่ต่างกันนั่นเอง

ว่าแต่บน Android Studio มันมีไฟล์และโฟลเดอร์อะไรบ้างเนี่ย

        ยกตัวอย่างเป็นโปรเจคที่พึ่งสร้างขึ้นมาใหม่ๆบน Android Studio 1.2 Beta 3 โดยจะมีโครงสร้างแบบนี้


        สำหรับโปรเจคของผู้ที่หลงเข้ามาอ่าน ถ้ามีลักษณะไม่เหมือนกับในภาพข้างบน ลองเปลี่ยนรูปแบบการแสดงผลให้เป็น Project แทนนะครับ (ปกติโปรแกรมจะเลือกเป็น Android ไว้ให้)


        เจ้าของบล็อกขออธิบายแต่ละไฟล์ใน Root Project ก่อนนะครับ นั่นก็คือไฟล์ทั้งหมดที่อยู่ในโฟลเดอร์ MyApplication เพราะว่าเดี๋ยวจะมีไฟล์แยกย่อยลงไปในแต่ละ Module อีก ไว้ค่อยอธิบายทีหลัง

        .gradle โฟลเดอร์เก็บไฟล์สำหรับ Gradle
        .idea โฟลเดอร์เก็บการตั้งค่าของโปรเจคนั้นๆ เป็นโฟลเดอร์สำหรับ IntelliJ (ถ้าบน Eclipse จะเป็น project.properties)
        app ชื่อ Module ของโปรเจคนั้นๆ (สามารถเปลี่ยนชื่อได้)
        build โฟลเดอร์เก็บไฟล์ต่างๆที่ได้จากการ Build Project
        gradle โฟลเดอร์สำหรับเก็บไฟล์ gradle-wrapper
        .gitignore ไฟล์ที่มีไว้สำหรับกำหนดชื่อไฟล์ไม่ต้องการให้ Git ทำงาน
        build.gradle ไฟล์กำหนดการทำงานของ Gradle ว่าจะให้ Build Project อะไรยังไง สามารถกำหนดค่าต่างๆในนี้ได้ เพื่อใช้ในการ Build Project
        gradle.properties ไฟล์ตั้งค่าสำหรับ Gradle
        gradlew Gradle Script สำหรับบน Unix (Mac และ Linux)
        gradlew.bat Gradle Script สำหรับบน Windows
        local.properties ไฟล์กำหนดการตั้งค่าโปรเจค เช่น กำหนด Path ของ Android SDK
        MyApplication.iml ไฟล์สำหรับเก็บรายละเอียดของ Module และ Library ที่ใช้ในโปรเจค เป็นไฟล์สำหรับ IntelliJ โดยจะมีชื่อไฟล์ตามชื่อโปรเจค
        settings.gradle ไฟล์ระบุโปรเจคย่อยที่ต้องการให้ Gradle ทำงาน

        External Libraties อันนี้ไม่ใช่โฟลเดอร์ในโปรเจค มีไว้แค่บอก References Libraries และ Platform SDK ที่ใช้ในโปรเจคเท่านั้น
   

ต้องดูไฟล์และโฟลเดอร์ไหนบ้าง?

        เนื่องจากมีไฟล์และโฟลเดอร์โผล่มาเยอะแยะ จนผู้ที่หลงเข้ามาอ่านบางคนไม่รู้ว่าจะต้องดูไฟล์และโฟลเดอร์ไหนบ้าง

        ซึ่งเอาเข้าจริงก็จะเหลือแค่นี้


        app จริงๆคือไม่ใช่แค่โฟลเดอร์ app แต่เจ้าของบล็อกจะหมายถึง Module ทั้งหมดในโปรเจคนั้นๆมากกว่า แต่พอดีโปรเจคตัวนี้พึ่งสร้างจึงมี Module อยู่แค่ตัวเดียว นั่นก็คือ app
        .gitignore ในกรณีที่ผู้ที่หลงเข้ามาอ่านใช้ Git สำหรับ Version Control จะสามารถกำหนดในไฟล์นี้ได้ว่า ไฟล์หรือโฟลเดอร์ใดบ้างที่ไม่ต้องให้ Git มายุ่ง (อ่านรายละเอียดเพิ่มเติมได้ที่ [Dev] Git ไม่ต้องมายุ่งน่า~!! มาทำความรู้จักกับไฟล์ .gitignore กันหน่อย)
        build.gradle สำหรับกำหนดค่าบางอย่างใน Root Project (เช่นเลือกเวอร์ชัน Gradle ที่จะใช้ในการ Build)

ดูไฟล์และโฟลเดอร์ต่างๆที่อยู่ในแต่ละ Module กันต่อ

        สำหรับโปรเจคที่พึ่งสร้างขึ้นมาใหม่ก็จะมี Module อยู่แค่ตัวเดียว ชื่อว่า app ดังนั้นเมื่อเปิดโฟลเดอร์ของ Module ดังกล่าวก็จะเจอกับไฟล์และโฟลเดอร์ดังนี้


        build เหมือนกับโฟลเดอร์ที่อยู่ใน Root Project เลย แต่ว่าโฟลเดอร์นี้จะมีไว้สำหรับเก็บไฟล์และโฟลเดอร์ที่ได้จากการ Build Module นั้นๆ (โฟลเดอร์ buid จะมีแยกย่อยไปตามแต่ละ Module)
        libs โฟลเดอร์เก็บไลบรารีที่เป็นไฟล์ .jar (อยากใช้ไลบรารี .jar ตัวไหนก็เอามาใส่ไว้ในนี้)
        src โฟลเดอร์เก็บโค๊ดของ Module นั้นๆ
        .gitignore เหมือนกับอันที่อยู่ใน Root Project โดยอันนี้จะเอาไว้กำหนดไฟล์ที่อยู่ใน Module นั้นๆ (ไฟล์ .gitignore จะมีแยกย่อยไปตามแต่ละ Module)
        app.iml เหมือนกับไฟล์ .iml ที่อยู่ใน Root Project แต่ไฟล์นี้จะเก็บรายละเอียดของ Module และ Library ที่ใช้ใน Module ตัวนั้นๆ โดยจะมีชื่อไฟล์ตามชื่อ Module
        build.gradle เหมือนกับไฟล์ที่อยู่ใน Root Project แต่ไฟล์ตัวนี้จะมีไว้กำหนดการทำงานของ Gradle สำหรับ Module ตัวนั้นๆ
        proguard-rules.pro กำหนดการทำงานของ Proguard

        สำหรับในแต่ละ Module จะมีแค่ไฟล์ที่มีนามสกุลเป็น .iml ที่ไม่ต้องไปสนใจ

ดูในโฟลเดอร์ src กันต่อ

        เมื่อเปิดโฟลเดอร์​ src ก็จะเห็นว่ามีโฟลเดอร์ย่อยอีกสองโฟลเดอร์


        androidTest มีไว้สำหรับเขียนโค๊ดเพื่อทำ Unit Test ให้กับแอพตัวนั้นๆ
        main สำหรับผู้ที่หลงเข้ามาอ่านมือใหม่ เจ้าของบล็อกขอให้เข้าใจว่ามันคือโฟลเดอร์ที่มีไว้เก็บโค๊ดในแอพนั้นๆ

        เพิ่มเติม จริงๆแล้วโฟลเดอร์ main จะเรียกว่า Flavor ซึ่งเจ้า Flavor จะทำให้สามารถแบ่งชุดโค๊ดแยกกันเพื่อ Build ออกเป็นหลายๆแบบได้ (เช่น แอพเวอร์ชันฟรีกับเสียเงินซื้อ) แต่ทว่าโปรเจคที่พึ่งสร้างขึ้นมาใหม่ๆจะมีเพียงแค่ Flavor เดียวเท่านั้น ซึ่งตั้งชื่อว่า main ซึ่งเป็น Flavor หลักในการเขียนโค๊ด

โฟลเดอร์ androidTest

        อย่างที่บอกไปแล้วว่าโฟลเดอร์นี้มีไว้สำหรับทำ Unit Test ดังนั้นในนี้ก็จะมีแค่ไฟล์ .java เพื่อเขียนโค๊ดสำหรับทำUnit Test นั่นเอง


โฟลเดอร์ main

        สำหรับไฟล์และโฟลเดอร์โดยพื้นฐานที่อยู่ใน main ก็จะมีดังนี้


        java โฟลเดอร์นี้มีไว้เขียนโค๊ด Java
        res โฟลเดอร์เก็บไฟล์ที่ใช้ภายในแอพ เช่น ภาพ เสียง หรืออื่นๆ (Resource Folder)
        AndroidManifest.xml ไฟล์สำหรับตั้งค่าโปรเจค เช่น Activity ที่มีในแอพ หรือ Permission เป็นต้น

ทำไมโฟลเดอร์ res ของผู้ที่หลงเข้ามาอ่านมี mipmap แทน drawable ล่ะ?

        เนื่องจากบน Android Studio 1.1 ขึ้นไป ได้เปลี่ยนจาก drawable มากลายเป็น mipmap แล้ว ทำให้โปรเจคเก่าๆยังใช้ drawable อยู่ ในขณะที่โปรเจคหลังๆเปลี่ยนไปใช้ mipmap แทน ซึ่งจะช่วยในเรื่อง Quality ของภาพที่ถูกนำมาแสดงในแอพ แต่ทว่า mipmap นั้นรองรับเฉพาะ Android 3.0 ขึ้นไปเท่านั้น ดังนั้นถ้าเปิดบน Android 2.3.6 หรือต่ำกว่า ก็จะใช้งานไม่ได้



        สำหรับ mipmap สามารถอ่านต่อกันแบบละเอียดๆได้ที่ [NuuNeoi] รู้จักกับ mipmap ในวันที่ Android Studio 1.1 ย้ายไอคอนใน Template จาก drawable ไป mipmap

ถึงแม้ Structure จะเปลี่ยนแต่ไฟล์หลักๆก็ยังคงเหมือนเดิม

        มีผู้ที่หลงเข้ามาอ่านบางคนบอกว่าไม่เข้าใจ Project Structure บน Android Studio เลย เพราะมันไม่เหมือนเดิม ทำให้กลับไปใช้ Eclipse แทนเพราะเข้าใจอยู่แล้ว

        แต่ถ้าดูดีๆก็จะเห็นว่ามันไม่ได้ต่างกันซักเท่าไร การเขียนโค๊ดก็ยังคงทำใน src อยู่ดี และการเก็บไฟล์จำพวกภาพก็จะอยู่ในโฟลเดอร์ res เช่นกัน และก็มี AndroidManifest.xml เหมือนเดิม เพียงแค่ย้ายไปอยู่ลึกหน่อยก็เท่านั้น

        ที่มีเพิ่มเข้ามาก็จะเป็น build.gradle เป็นหลัก เพราะไฟล์นี้จะใช้สำหรับกำหนดการ Build Project ซึ่งเป็นหัวใจสำคัญในการใช้เจ้า Build System ที่ชื่อว่า Gradle