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

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

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

Soong คืออะไร

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

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

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

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