ก่อนการเผยแพร่ Android 7.0 Android ใช้ GNU Make เพื่ออธิบายและเรียกใช้กฎการสร้างโดยเฉพาะ ระบบสร้างบิลด์ได้รับการรองรับและใช้งานอย่างแพร่หลาย แต่ Android จำนวนมากกลับทำงานช้า มีโอกาสเกิดข้อผิดพลาด ไม่สามารถปรับขนาดได้ และทดสอบได้ยาก ระบบบิลด์ของ Soong ให้ความยืดหยุ่นที่จำเป็นสำหรับบิลด์ Android
ด้วยเหตุนี้ นักพัฒนาซอฟต์แวร์แพลตฟอร์มจึงคาดว่าจะเปลี่ยนจากบริษัทผู้ผลิตและนำไปใช้งานโดยเร็วที่สุด ส่งคำถามไปยัง Google Group android-building เพื่อรับการสนับสนุน
Soong คืออะไร
ระบบบิลด์ Soong เปิดตัวใน Android 7.0 (Nougat) เพื่อแทนที่ Make เครื่องมือนี้ใช้ประโยชน์จาก เครื่องมือโคลนของ Kati GNU และองค์ประกอบระบบสร้างของ Ninja เพื่อเร่งบิลด์ของ Android
ดูคำอธิบายระบบบิลด์ Make ของ Android ในโปรเจ็กต์โอเพนซอร์ส Android (AOSP) เพื่อดูวิธีการทั่วไปและการเปลี่ยนแปลงระบบบิลด์สำหรับผู้เขียน Android.mk เพื่อดูข้อมูลเกี่ยวกับการแก้ไขที่จำเป็นในการเปลี่ยนจาก Make เป็น Soong
ดูรายละเอียดทั้งหมดได้ที่รายการที่เกี่ยวข้องกับเวอร์ชันในอภิธานศัพท์สำหรับคำจำกัดความของคำสำคัญ และไฟล์อ้างอิงของ Soong
การเปรียบเทียบเพลงกับแบรนด์
ต่อไปนี้เป็นการเปรียบเทียบการกำหนดค่า Make กับ Soong ที่ใช้วิธีเดียวกันในไฟล์การกำหนดค่า Soong (Blueprint หรือ .bp
)
สร้างตัวอย่าง
LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := libxmlrpc++
LOCAL_MODULE_HOST_OS := linux
LOCAL_RTTI_FLAG := -frtti
LOCAL_CPPFLAGS := -Wall -Werror -fexceptions
LOCAL_EXPORT_C_INCLUDES := $(LOCAL_PATH)/src
LOCAL_SRC_FILES := $(call \
all-cpp-files-under,src)
include $(BUILD_SHARED_LIBRARY)
ตัวอย่าง Soong
cc_library_shared {
name: "libxmlrpc++",
rtti: true,
cppflags: [
"-Wall",
"-Werror",
"-fexceptions",
],
export_include_dirs: ["src"],
srcs: ["src/**/*.cpp"],
target: {
darwin: {
enabled: false,
},
},
}
ดูตัวอย่างการกำหนดค่า Soong เฉพาะสำหรับการทดสอบได้ที่การกำหนดค่าบิลด์แบบง่าย
ดูคำอธิบายของช่องในไฟล์ Android.bp ได้ที่รูปแบบไฟล์ Android.bp
โมดูลพิเศษ
กลุ่มโมดูลพิเศษบางกลุ่มมีลักษณะเฉพาะ
โมดูลเริ่มต้น
คุณสามารถใช้โมดูลค่าเริ่มต้นเพื่อใช้พร็อพเพอร์ตี้เดียวกันซ้ำในหลายโมดูลได้ เช่น
cc_defaults {
name: "gzip_defaults",
shared_libs: ["libz"],
stl: "none",
}
cc_binary {
name: "gzip",
defaults: ["gzip_defaults"],
srcs: ["src/test/minigzip.c"],
}
โมดูลที่สร้างไว้ล่วงหน้า
โมดูลบางประเภทที่สร้างไว้ล่วงหน้าช่วยให้โมดูลมีชื่อเหมือนกับโมดูลที่อิงตามแหล่งที่มา เช่น อาจมี cc_prebuilt_binary
ชื่อ foo
เมื่อมี cc_binary
ที่ใช้ชื่อเดียวกันอยู่แล้ว ซึ่งช่วยให้นักพัฒนาซอฟต์แวร์เลือกเวอร์ชันที่จะรวมไว้ในผลิตภัณฑ์ขั้นสุดท้ายได้อย่างยืดหยุ่น หากการกําหนดค่าบิลด์มีทั้ง 2 เวอร์ชัน ค่า Flag prefer
ในคําจํากัดความของโมดูลที่สร้างไว้ล่วงหน้าจะกําหนดว่าเวอร์ชันใดมีลําดับความสําคัญมากกว่า
โปรดทราบว่าโมดูลที่สร้างไว้ล่วงหน้าบางรายการมีชื่อที่ไม่ได้ขึ้นต้นด้วย prebuilt
เช่น android_app_import
โมดูลเนมสเปซ
จนกว่า Android จะเปลี่ยนจาก Make เป็น Soong โดยสมบูรณ์ การกําหนดค่าผลิตภัณฑ์ Make ต้องระบุค่า PRODUCT_SOONG_NAMESPACES
ค่าของตัวแปรนี้ควรเป็นรายการเนมสเปซที่คั่นด้วยเว้นวรรคซึ่ง Soong ส่งออกไปยัง Make เพื่อที่จะสร้างโดยคำสั่ง m
หลังจากการแปลง Android เป็น Soong เสร็จสมบูรณ์
รายละเอียดการเปิดใช้เนมสเปซอาจมีการเปลี่ยนแปลง
Soong ช่วยให้โมดูลในไดเรกทอรีต่างๆ ระบุชื่อเดียวกันได้ ตราบใดที่มีการประกาศแต่ละโมดูลภายในเนมสเปซแยกกัน โดย Namespace สามารถประกาศได้ดังต่อไปนี้
soong_namespace {
imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}
โปรดทราบว่าเนมสเปซไม่มีพร็อพเพอร์ตี้ชื่อ ระบบจะกำหนดเส้นทางของเนมสเปซเป็นชื่อโดยอัตโนมัติ
โมดูล Soong แต่ละรายการจะได้รับการกำหนดเนมสเปซตามตำแหน่งของโมดูลในแผนผัง
ระบบจะถือว่าโมดูล Soong แต่ละรายการอยู่ในเนมสเปซที่กําหนดโดย soong_namespace
ที่พบในไฟล์ Android.bp
ในไดเรกทอรีปัจจุบันหรือไดเรกทอรีบรรพบุรุษที่ใกล้ที่สุด หากไม่พบโมดูล soong_namespace
ดังกล่าว ระบบจะถือว่าโมดูลดังกล่าวอยู่ในเนมสเปซรูทโดยนัย
ตัวอย่างคือ Soong พยายามแก้ไขข้อกําหนด D ที่ประกาศโดยโมดูล M ในเนมสเปซ N ที่นําเข้าเนมสเปซ I1, I2, I3…
- จากนั้นหาก D เป็นชื่อที่สมบูรณ์ในตัวเองของรูปแบบ
//namespace:module
ระบบจะค้นหาชื่อโมดูลที่ระบุเฉพาะในเนมสเปซที่ระบุเท่านั้น - มิฉะนั้น Soong จะมองหาโมดูลชื่อ D ที่ประกาศในเนมสเปซ N ก่อน
- หากไม่มีโมดูลดังกล่าว Soong จะค้นหาโมดูลชื่อ D ในเนมสเปซ I1, I2, I3…
- สุดท้าย Soong จะค้นหาในเนมสเปซรูท