ซ่งสร้างระบบ

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

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

ซุงคืออะไร?

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

ดูคำอธิบาย Android Make Build System ใน Android Open Source Project (AOSP) สำหรับ คำแนะนำ ทั่วไปและ Build System Changes สำหรับ Android.mk Writers เพื่อเรียนรู้เกี่ยวกับการแก้ไขที่จำเป็นเพื่อปรับจาก Make เป็น Soong

ดู รายการที่เกี่ยวข้องกับการสร้าง ในอภิธานศัพท์สำหรับคำจำกัดความของคำศัพท์สำคัญและ ไฟล์อ้างอิง Soong สำหรับรายละเอียดทั้งหมด

เปรียบเทียบเมคกับซูง

นี่คือการเปรียบเทียบระหว่าง Make configuration กับ 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)

ซูงตัวอย่าง

cc_library_shared {
     name: "libxmlrpc++",

     rtti: true,
     cppflags: [
           "-Wall",
           "-Werror",
           "-fexceptions",
     ],
     export_include_dirs: ["src"],
     srcs: ["src/**/*.cpp"],

     target: {
           darwin: {
                enabled: false,
           },
     },
}

สำหรับตัวอย่างการกำหนดค่า Soong เฉพาะการทดสอบ โปรดดูที่ การกำหนดค่า Simple Build

สำหรับคำอธิบายช่องต่างๆ ในไฟล์ 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 ที่มีชื่อเดียวกันอยู่แล้ว สิ่งนี้ทำให้นักพัฒนามีความยืดหยุ่นในการเลือกเวอร์ชันที่จะรวมไว้ในผลิตภัณฑ์ขั้นสุดท้าย หากการกำหนดค่า build มีทั้งสองเวอร์ชัน ค่าแฟล็ก prefer ในข้อกำหนดโมดูลที่สร้างไว้ล่วงหน้าจะกำหนดว่าเวอร์ชันใดมีลำดับความสำคัญ โปรดทราบว่าโมดูลที่สร้างไว้ล่วงหน้าบางโมดูลมีชื่อที่ไม่ได้ขึ้นต้นด้วย prebuilt เช่น android_app_import

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

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

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

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 จะดูในเนมสเปซรูท