ระบบการสร้าง 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

ดูคำอธิบายเกี่ยวกับ Android Make Build System ใน Android Open Source Project (AOSP) สำหรับ วิธีการทั่วไป และ Build Systemการเปลี่ยนแปลงสำหรับผู้เขียน 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 เวอร์ชัน ค่าแฟล็ก prefer ในคำจำกัดความของโมดูลที่สร้างไว้ล่วงหน้าจะกำหนดเวอร์ชันที่มีลำดับความสำคัญ โปรดทราบว่าโมดูลที่สร้างไว้ล่วงหน้าบางรายการมีชื่อที่ไม่ได้ขึ้นต้นด้วย prebuilt เช่น android_app_import

โมดูลเนมสเปซ

การกำหนดค่า "ทำให้ผลิตภัณฑ์" ต้องระบุค่า PRODUCT_SOONG_NAMESPACES จนกว่า Android จะแปลงจาก Make เป็น Soong โดยสมบูรณ์ ค่าของรายการควรเป็นรายการเนมสเปซที่คั่นด้วยช่องว่างที่ 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 จะพยายามแก้ปัญหาทรัพยากร Dependency D ที่ประกาศโดยโมดูล M ในเนมสเปซ N ที่นำเข้าเนมสเปซ I1, I2, I3...

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