การสร้างทรัพยากรในโครงการ Android — RegisterGeneratedResFolder

Feb 12 2023
ในโลกของ Android แนวคิดของรหัสและการสร้างทรัพยากรนั้นเป็นที่รู้จักกันดี การสร้างโค้ดจะใช้ในโครงการส่วนใหญ่ โดยเป็นกลไกหลักที่อยู่เบื้องหลังกริช ห้อง และห้องสมุดอื่นๆ แต่ทรัพยากรล่ะ ตัวอย่างเช่น ในระหว่างกระบวนการสร้าง บริการ Google ของคุณ

ในโลกของ Android แนวคิดของรหัสและการสร้างทรัพยากรนั้นเป็นที่รู้จักกันดี การสร้างโค้ดจะใช้ในโครงการส่วนใหญ่ โดยเป็นกลไกหลักที่อยู่เบื้องหลังกริช ห้อง และห้องสมุดอื่นๆ แต่ทรัพยากรล่ะ ตัวอย่างเช่น ในระหว่างกระบวนการสร้าง ไฟล์ของคุณgoogle-services.jsonจะถูกแยกวิเคราะห์และแปลงเป็นvalues.xmlไฟล์ในgeneratedโฟลเดอร์ที่จะใช้โดยไลบรารี Firebase ปรากฎว่าการสร้างและใช้ทรัพยากรที่สร้างขึ้นเองนั้นเป็นเรื่องง่ายตราบใดที่คุณรู้ว่าต้องทำอย่างไรเมื่อมีทรัพยากรเหล่านั้น ดูเหมือนว่าจะค่อนข้างง่าย — คุณสร้างไฟล์ที่จำเป็นและวางไว้ในโฟลเดอร์ที่สร้างขึ้น อย่างไรก็ตาม ต้องใช้งานเพิ่มอีกเล็กน้อย

งาน Gradle สำหรับการแปลงสตริง

มาสร้างงาน Gradle ง่ายๆ ที่แปลงไฟล์ JSON ด้วยสตริงเป็นไฟล์ XML สตริงของ Android และบันทึกผลลัพธ์ลงในgeneratedโฟลเดอร์ เมื่อพิจารณาจากไฟล์อื่นๆ ในไดเร็กทอรีนั้น พาธควรเป็นดังนี้:

app/build/generated/res/${generator}/${sourceSet}/values/strings.xml

แค่นี้ก็น่าจะเพียงพอแล้วใช่ไหม? หากคุณพยายามสร้างแอปโดยใช้ทรัพยากรจากไฟล์ที่สร้างขึ้น แอปจะไม่ทำงาน ทั้ง Android Studio และ Gradle จะไม่รู้จักไฟล์ของคุณในฐานะส่วนหนึ่งของโครงการ มีวิธีที่จะทำให้พวกเขาทำเช่นนั้น

RegisterGeneratedResFolderช่วยเหลือ

มีวิธีการมหัศจรรย์ในBaseVariantอินเทอร์เฟซของระบบการสร้าง Android ที่เรียกว่าregisterGeneratedResFolderทำอย่างนั้น

มันต้องการFileCollectionวัตถุที่ชี้ไปยังโฟลเดอร์ของเราและระบุงานที่สร้างมันขึ้นมา

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

app/build/generated/res/${generator}/${sourceSet}

generateStringsFileงานจะถูกเรียกใช้ก่อนmergeResourcesทำให้ทรัพยากรใหม่ทั้งหมดพร้อมใช้งานสำหรับขั้นตอนการสร้างถัดไปและใน Android Studio คุณยังสามารถเรียกใช้ด้วยตนเองเพื่อสร้างไฟล์ที่จำเป็น ดังนั้นจึงไม่มีข้อผิดพลาด "ไม่พบทรัพยากร" ในขณะที่คุณทำงาน

อะไรต่อไป?

แม้ว่าตัวอย่างข้างต้นจะเพียงพอสำหรับกรณีง่ายๆ แต่ก็มีข้อเสียเปรียบที่สำคัญ นั่นคือ งานจะไม่เพิ่มขึ้น กล่าวอีกนัยหนึ่ง จะมีการรันทุกครั้งที่สร้างโปรเจ็กต์ ซึ่งจะเพิ่มเวลาในการสร้างอย่างหลีกเลี่ยงไม่ได้ นอกจากนี้ ขณะนี้ยังไม่มีวิธีการระบุไฟล์ที่ต้องใช้เป็นอินพุตและโฟลเดอร์สำหรับจัดเก็บผลลัพธ์ เราสามารถแก้ปัญหาแรกได้ด้วยการทำให้งานเพิ่มขึ้น วิธีที่สองแก้ไขได้โดยการเพิ่มอินพุตงานและรวมไว้ในปลั๊กอิน การสร้างปลั๊กอิน แบบกำหนดเองอยู่นอกเหนือขอบเขตของบทความนี้ แต่คุณสามารถค้นหาโค้ดได้ในrepo GitHub ของฉัน

นี่เป็นการเจาะลึกครั้งแรกของฉันเกี่ยวกับระบบการสร้าง Gradle และ Android และฉันหวังว่ามันจะช่วยให้คุณจัดการกับความท้าทายของคุณเองได้ มีความสุขในการเข้ารหัส!