ระบบการสร้าง Soong

ก่อนการเปิดตัว Android 7.0 Android ใช้ GNU Make เพียงอย่างเดียวในการอธิบายและดำเนินการตามกฎการสร้าง ระบบสร้างบิลด์คือ รองรับและใช้งานกันอย่างแพร่หลาย แต่ Android จำนวนมากกลับทำงานช้าและมีแนวโน้มที่จะเกิดข้อผิดพลาด ไม่สามารถปรับขนาดได้ และทดสอบได้ยาก ระบบการสร้างของ Soong ให้ความยืดหยุ่นที่จำเป็นสำหรับบิลด์ Android

ด้วยเหตุนี้ เราจึงคาดหวังว่านักพัฒนาแพลตฟอร์มจะเปลี่ยนไปใช้ Soong จาก Make โดยเร็วที่สุด ส่งคำถามไปยัง การสร้าง Android Google Group เพื่อรับการสนับสนุน

Soong คืออะไร

ระบบบิลด์ Soong เปิดตัวใน Android 7.0 (Nougat) เพื่อแทนที่ Make ใช้ประโยชน์จาก Kati GNU สร้างเครื่องมือโคลนและระบบบิลด์ของ Ninja เพื่อเร่งความเร็วบิลด์ต่างๆ ของ Android

โปรดดู ระบบบิลด์ของ Android ในโครงการโอเพนซอร์ส Android (AOSP) ทั่วไป วิธีการ และ สร้างการเปลี่ยนแปลงระบบสำหรับผู้เขียน Android.mk เพื่อเรียนรู้เกี่ยวกับการปรับเปลี่ยนที่จำเป็นในการ ปรับเปลี่ยนจาก Make เป็น Soong

ดูรายการที่เกี่ยวข้องกับรุ่นใน สำหรับคำจำกัดความของคำสำคัญ ไฟล์อ้างอิงในเร็วๆ นี้เพื่อดูรายละเอียดทั้งหมด

การเปรียบเทียบเพลงกับแบรนด์

นี่คือการเปรียบเทียบการกำหนดค่า "กำหนดค่า" กับ 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

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

จนกว่า Android จะเปลี่ยนจาก Make เป็น Soong โดยสมบูรณ์ การกําหนดค่าผลิตภัณฑ์ Make ต้องระบุค่า PRODUCT_SOONG_NAMESPACES คือ ควรเป็นรายการเนมสเปซที่ Soong ส่งออกไปที่ โดยใช้การเว้นวรรค จะสร้างด้วยคำสั่ง m หลังจากการแปลง Android เป็น Soong เสร็จสมบูรณ์แล้ว รายละเอียดของการเปิดใช้เนมสเปซอาจเปลี่ยนแปลง

Soong ช่วยให้โมดูลในไดเรกทอรีต่างๆ สามารถระบุ ชื่อเดียวกัน ตราบใดที่มีการประกาศแต่ละโมดูลภายในเนมสเปซแยกกัน คุณสามารถประกาศเนมสเปซได้ดังนี้

soong_namespace {
    imports: ["path/to/otherNamespace1", "path/to/otherNamespace2"],
}

โปรดทราบว่าเนมสเปซไม่มีพร็อพเพอร์ตี้ชื่อ ของ URL จะเปลี่ยนเส้นทางโดยอัตโนมัติ เป็นชื่อ

โมดูล 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 ใน Namespace I1, I2, I3...
  4. สุดท้าย Soong จะค้นหาในเนมสเปซรูท