แปลงจากMake เป็น Soong

ก่อนการเผยแพร่ 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…

  1. จากนั้นหาก D เป็นชื่อที่สมบูรณ์ในตัวเองของรูปแบบ //namespace:module ระบบจะค้นหาชื่อโมดูลที่ระบุเฉพาะในเนมสเปซที่ระบุเท่านั้น
  2. มิฉะนั้น Soong จะมองหาโมดูลชื่อ D ที่ประกาศในเนมสเปซ N ก่อน
  3. หากไม่มีโมดูลดังกล่าว Soong จะค้นหาโมดูลชื่อ D ในเนมสเปซ I1, I2, I3…
  4. สุดท้าย Soong จะค้นหาในเนมสเปซรูท