استخدِم المعلومات الواردة في هذه الصفحة لإنشاء ملفات makefile لجهازك ومنتجك.
يجب أن يتضمّن كل نموذج Android جديد ملف إعداد لتوجيه نظام الإنشاء باستخدام البيانات الوصفية للنموذج والتبعيات في وقت الترجمة وتعليمات التعبئة. يستخدم Android نظام تصميم Soong. لمزيد من المعلومات حول نظام إنشاء Android، يُرجى الاطّلاع على إنشاء Android.
فهم طبقات الإنشاء
يتضمّن المخطط الهرمي للإصدار طبقات التجريد التي تتوافق مع التركيب المادي للجهاز. يتم وصف هذه الطبقات في الجدول أدناه. ترتبط كل طبقة بالطبقة التي تعلوها بعلاقة واحد إلى متعدد. على سبيل المثال، يمكن أن يتضمّن التصميم أكثر من لوحة واحدة، ويمكن أن تتضمّن كل لوحة أكثر من منتج واحد. يمكنك تعريف عنصر في طبقة معيّنة على أنّه تخصص لعنصر في الطبقة نفسها، ما يمنع النسخ ويبسّط عملية الصيانة.
الطبقة | مثال | الوصف |
---|---|---|
المنتَج | myProduct, myProduct_eu, myProduct_eu_fr, j2, sdk | تحدّد طبقة المنتج مواصفات ميزة منتج شحن، مثل الوحدات التي سيتم إنشاؤها واللغات المتوافقة والإعدادات الخاصة باللغات المختلفة. بعبارة أخرى، هذا هو اسم المنتج بشكل عام. يتم تحديد المتغيرات الخاصة بالمنتج في ملفات makefile الخاصة بتعريف المنتج. يمكن أن يرث المنتج من تعريفات منتجات أخرى، ما يسهّل عملية الصيانة. تتمثّل إحدى الطرق الشائعة في إنشاء منتج أساسي يتضمّن ميزات تنطبق على جميع المنتجات، ثم إنشاء صيغ منتجات استنادًا إلى هذا المنتج الأساسي. على سبيل المثال، يمكن أن يرث منتجان يختلفان فقط في أجهزة الراديو (CDMA مقابل GSM) من المنتج الأساسي نفسه الذي لا يحدّد جهاز راديو. |
اللوحة/الجهاز | سمك المرلين، وسمك البلو لاين، وسمك المرجان | تمثّل طبقة اللوحة/الجهاز الطبقة المادية من البلاستيك على الجهاز (أي التصميم الصناعي للجهاز). تمثّل هذه الطبقة أيضًا المخططات الأساسية للمنتج. وتشمل هذه الأجهزة الطرفية الموجودة على اللوحة وإعداداتها. والأسماء المستخدَمة هي مجرد رموز لإعدادات مختلفة للوحات/الأجهزة. |
قوس | arm وx86 وarm64 وx86_64 | تصف طبقة البنية إعدادات المعالج وواجهة التطبيق الثنائية (ABI) التي تعمل على اللوحة. |
استخدام صيغ الإنشاء
عند إنشاء إصدار لمنتج معيّن، من المفيد أن تتضمّن الإصدارات النهائية اختلافات بسيطة. في تعريف الوحدة، يمكن للوحدة تحديد علامات باستخدام LOCAL_MODULE_TAGS
،
والتي يمكن أن تكون قيمة واحدة أو أكثر من optional
(القيمة التلقائية) وdebug
وeng
.
إذا لم تحدّد الوحدة علامة (باستخدام LOCAL_MODULE_TAGS
)، سيتم تلقائيًا ضبط علامتها على optional
. لا يتم تثبيت الوحدة الاختيارية إلا إذا كانت مطلوبة من خلال إعدادات المنتج باستخدام PRODUCT_PACKAGES
.
هذه هي صيغ الإصدار المحدّدة حاليًا.
السعر المتغير | الوصف |
---|---|
eng
|
هذا هو الإصدار التلقائي.
|
user
|
الصيغة التي من المفترض أن تكون وحدات الإصدار النهائي.
|
userdebug
|
الأسعار نفسها في فندق user ، مع الاستثناءات التالية:
|
إرشادات بشأن userdebug
يساعد تشغيل إصدارات userdebug في الاختبار مطوّري الأجهزة على فهم أداء الإصدارات التي لا تزال قيد التطوير وقدرتها. للحفاظ على الاتساق بين إصدارات المستخدم وإصدارات userdebug، وللحصول على مقاييس موثوقة في الإصدارات المستخدَمة لتصحيح الأخطاء، على مطوّري الأجهزة اتّباع الإرشادات التالية:
- يتم تعريف userdebug على أنّه إصدار مستخدم تم تفعيل إذن الوصول إلى الجذر فيه، باستثناء ما يلي:
- تطبيقات userdebug فقط التي يشغّلها المستخدم عند الطلب
- العمليات التي يتم تنفيذها فقط أثناء الصيانة في وضع الخمول (عند توصيل الجهاز بالشاحن أو عند شحنه بالكامل)، مثل استخدام
dex2oatd
بدلاً منdex2oat
لعمليات التجميع في الخلفية
- لا تضمِّن ميزات يتم تفعيلها أو إيقافها تلقائيًا استنادًا إلى نوع الإصدار. ننصح المطوّرين بتجنُّب استخدام أي شكل من أشكال التسجيل التي تؤثّر في عمر البطارية، مثل تسجيل تصحيح الأخطاء أو تفريغ الذاكرة المؤقتة.
- يجب تحديد أي ميزات لتصحيح الأخطاء يتم تفعيلها تلقائيًا في userdebug بوضوح ومشاركتها مع جميع المطوّرين العاملين على المشروع. يجب تفعيل ميزات تصحيح الأخطاء لفترة محدودة فقط إلى أن يتم حلّ المشكلة التي تحاول تصحيحها.
تخصيص الإصدار باستخدام تراكبات الموارد
يستخدم نظام الإصدار في Android عمليات تراكب الموارد لتخصيص منتج في وقت الإنشاء. تحدّد تراكبات الموارد ملفات الموارد التي يتم تطبيقها فوق الإعدادات التلقائية. لاستخدام تراكبات الموارد، عدِّل ملف إنشاء المشروع لتحديد PRODUCT_PACKAGE_OVERLAYS
على مسار نسبي إلى الدليل ذي المستوى الأعلى. ويصبح هذا المسار جذرًا مخفيًا يتم البحث فيه مع الجذر الحالي عندما يبحث نظام الإنشاء عن موارد.
تتضمّن frameworks/base/core/res/res/values/config.xml الإعدادات الأكثر تخصيصًا.
لإعداد تراكب موارد على هذا الملف، أضِف دليل التراكب إلى ملف إنشاء المشروع باستخدام إحدى الطرق التالية:
PRODUCT_PACKAGE_OVERLAYS := device/device-implementer/device-name/overlay
أو
PRODUCT_PACKAGE_OVERLAYS := vendor/vendor-name/overlay
بعد ذلك، أضِف ملفًا متراكبًا إلى الدليل، على سبيل المثال:
vendor/foobar/overlay/frameworks/base/core/res/res/values/config.xml
يتم استبدال أي سلاسل أو مصفوفات سلاسل تم العثور عليها في ملف التراكب config.xml
بتلك التي تم العثور عليها في الملف الأصلي.
إنشاء منتج
يمكنك تنظيم ملفات المصدر لجهازك بطرق مختلفة. في ما يلي وصف موجز لإحدى طرق تنظيم عملية تنفيذ Pixel.
يتم تنفيذ Pixel باستخدام إعدادات رئيسية للجهاز باسم marlin
. من إعدادات الجهاز هذه، يتم إنشاء منتج باستخدام ملف makefile لتعريف المنتج يوضّح معلومات خاصة بالمنتج حول الجهاز، مثل الاسم والطراز. يمكنك الاطّلاع على دليل
device/google/marlin
لمعرفة كيفية إعداد كل ذلك.
كتابة ملفات makefile للمنتجات
توضّح الخطوات التالية كيفية إعداد ملفات makefile للمنتجات بطريقة مشابهة لتلك المتّبعة في مجموعة منتجات Pixel:
- أنشئ دليلاً لمنتجك.
device/<company-name>/<device-name>
على سبيل المثال،device/google/marlin
. سيحتوي هذا الدليل على رمز المصدر لجهازك بالإضافة إلى ملفات makefile اللازمة لإنشائه. - أنشئ
device.mk
ملف makefile يعرّف الملفات والوحدات المطلوبة للجهاز. للاطّلاع على مثال، راجِعdevice/google/marlin/device-marlin.mk
. - أنشئ ملف makefile لتعريف المنتج من أجل إنشاء منتج معيّن استنادًا إلى الجهاز. تم أخذ ملف makefile التالي من
device/google/marlin/aosp_marlin.mk
كمثال. يُرجى العِلم أنّ المنتج يرث من ملفَيdevice/google/marlin/device-marlin.mk
وvendor/google/marlin/device-vendor-marlin.mk
من خلال ملف makefile، مع الإشارة أيضًا إلى المعلومات الخاصة بالمنتج، مثل الاسم والعلامة التجارية والطراز.# Inherit from the common Open Source product configuration $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk) PRODUCT_NAME := aosp_marlin PRODUCT_DEVICE := marlin PRODUCT_BRAND := Android PRODUCT_MODEL := AOSP on msm8996 PRODUCT_MANUFACTURER := Google PRODUCT_RESTRICT_VENDOR_FILES := true PRODUCT_COPY_FILES += device/google/marlin/fstab.common:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.marlin $(call inherit-product, device/google/marlin/device-marlin.mk) $(call inherit-product-if-exists, vendor/google_devices/marlin/device-vendor-marlin.mk) PRODUCT_PACKAGES += \ Launcher3QuickStep \ WallpaperPicker
راجِع ضبط متغيرات تعريف المنتج للاطّلاع على متغيرات إضافية خاصة بالمنتج يمكنك إضافتها إلى ملفات makefile.
- أنشئ ملف
AndroidProducts.mk
يشير إلى ملفات makefile الخاصة بالمنتج. في هذا المثال، يجب توفير ملف makefile الخاص بتعريف المنتج فقط. المثال أدناه مأخوذ منdevice/google/marlin/AndroidProducts.mk
(الذي يحتوي على كل من marlin، وهو Pixel، وsailfish، وهو Pixel XL، اللذين يتشاركان معظم الإعدادات):PRODUCT_MAKEFILES := \ $(LOCAL_DIR)/aosp_marlin.mk \ $(LOCAL_DIR)/aosp_sailfish.mk COMMON_LUNCH_CHOICES := \ aosp_marlin-userdebug \ aosp_sailfish-userdebug
- أنشئ
BoardConfig.mk
makefile يحتوي على إعدادات خاصة باللوحة. للاطّلاع على مثال، راجِعdevice/google/marlin/BoardConfig.mk
. - في الإصدار 9 من نظام التشغيل Android والإصدارات الأقدم فقط، أنشئ ملف
vendorsetup.sh
لإضافة منتجك (مثل "وجبة غداء متكاملة") إلى الإصدار مع نوع إصدار مفصولَين بشرطة. مثلاً:add_lunch_combo <product-name>-userdebug
- في هذه المرحلة، يمكنك إنشاء المزيد من خيارات المنتجات استنادًا إلى الجهاز نفسه.
ضبط متغيّرات تعريف المنتج
يتم تحديد المتغيرات الخاصة بالمنتج في ملف makefile الخاص بالمنتج. يعرض الجدول بعض المتغيرات التي يتم الاحتفاظ بها في ملف تعريف المنتج.
متغير | الوصف | مثال |
---|---|---|
PRODUCT_AAPT_CONFIG
|
aapt إعدادات لاستخدامها عند إنشاء حِزم
|
|
PRODUCT_BRAND
|
تمثّل هذه السمة العلامة التجارية (مثل مشغّل شبكة الجوّال) التي تم تخصيص البرنامج لها. | |
PRODUCT_CHARACTERISTICS
|
aapt للسماح بإضافة موارد خاصة بمتغير إلى حزمة.
|
tablet ، nosdcard
|
PRODUCT_COPY_FILES
|
قائمة بالكلمات المشابهة لـ "source_path:destination_path " يجب نسخ الملف في مسار المصدر إلى مسار الوجهة عند إنشاء هذا المنتج. يتم تحديد قواعد خطوات النسخ في config/makefile .
|
|
PRODUCT_DEVICE
|
اسم التصميم الصناعي وهذا هو أيضًا اسم اللوحة، ويستخدم نظام الإنشاء هذا الاسم
للعثور على BoardConfig.mk .
|
tuna
|
PRODUCT_LOCALES
|
قائمة مفصولة بمسافات تتضمّن أزواجًا من رموز اللغة المكوّنة من حرفَين ورموز البلد المكوّنة من حرفَين، وتصف هذه القائمة عدة إعدادات للمستخدم، مثل لغة واجهة المستخدم والتاريخ والوقت وتنسيق العملة. يتم استخدام اللغة الأولى المُدرَجة في PRODUCT_LOCALES كلغة تلقائية للمنتج.
|
en_GB ، de_DE ، es_ES ، fr_CA
|
PRODUCT_MANUFACTURER
|
تمثّل هذه السمة اسم الشركة المصنّعة. |
acme
|
PRODUCT_MODEL
|
اسم المنتج النهائي الذي يظهر للمستخدم النهائي | |
PRODUCT_NAME
|
اسم المنتج العام الذي يظهر للمستخدم النهائي يظهر في شاشة الإعدادات > لمحة عن. | |
PRODUCT_OTA_PUBLIC_KEYS
|
قائمة بالمفاتيح العامة للمنتج عبر الشبكة غير السلكية (OTA) | |
PRODUCT_PACKAGES
|
قائمة بملفات APK والوحدات المطلوب تثبيتها | جهات الاتصال في التقويم |
PRODUCT_PACKAGE_OVERLAYS
|
تحدّد هذه السمة ما إذا كان سيتم استخدام المراجع التلقائية أو إضافة أي تراكبات خاصة بالمنتج. |
vendor/acme/overlay
|
PRODUCT_SYSTEM_PROPERTIES
|
قائمة بتعيينات سمات النظام بالتنسيق "key=value" لقسم النظام يمكن ضبط خصائص النظام للأقسام الأخرى من خلال
PRODUCT_<PARTITION>_PROPERTIES كما هو الحال في
PRODUCT_VENDOR_PROPERTIES لقسم المورّد. أسماء الأقسام المتوافقة: SYSTEM وVENDOR وODM وSYSTEM_EXT وPRODUCT
|
ضبط الفلتر التلقائي للغة النظام وإعدادات اللغة
استخدِم هذه المعلومات لضبط اللغة التلقائية وفلتر اللغة المحلية للنظام، ثم فعِّل فلتر اللغة المحلية لنوع جهاز جديد.
الخصائص
اضبط اللغة التلقائية وفلتر اللغة المحلية للنظام باستخدام سمات النظام المخصّصة:
ro.product.locale
: لضبط اللغة التلقائية يتم ضبط هذه القيمة في البداية على اللغة الأولى في المتغيّرPRODUCT_LOCALES
، ويمكنك تجاهل هذه القيمة. (لمزيد من المعلومات، اطّلِع على جدول ضبط متغيرات تعريف المنتج).-
ro.localization.locale_filter
: لضبط فلتر خاص باللغة، باستخدام تعبير عادي يتم تطبيقه على أسماء اللغات على سبيل المثال:- الفلتر الشامل:
^(de-AT|de-DE|en|uk).*
- يسمح فقط باللغة الألمانية (بأنواعها في النمسا وألمانيا) وجميع أنواع اللغة الإنجليزية واللغة الأوكرانية - فلتر الاستبعاد:
^(?!de-IT|es).*
- يستبعد اللغة الألمانية (النوع الإيطالي) وجميع أنواع اللغة الإسبانية.
- الفلتر الشامل:
تفعيل فلتر اللغة
لتفعيل الفلتر، اضبط قيمة سلسلة سمة النظام ro.localization.locale_filter
.
من خلال ضبط قيمة سمة الفلتر واللغة التلقائية من خلال oem/oem.prop
أثناء المعايرة في المصنع، يمكنك ضبط القيود بدون تضمين الفلتر في صورة النظام.
عليك التأكّد من استرداد هذه السمات من قسم الشركة المصنّعة للجهاز الأصلي من خلال إضافتها إلى المتغيّر PRODUCT_OEM_PROPERTIES
على النحو الموضّح أدناه:
# Delegation for OEM customization
PRODUCT_OEM_PROPERTIES += \
ro.product.locale \
ro.localization.locale_filter
بعد ذلك، يتم كتابة القيم الفعلية في oem/oem.prop
في مرحلة الإنتاج، وذلك لتلبية المتطلبات المستهدَفة. باستخدام هذا الأسلوب، يتم الاحتفاظ بالقيم التلقائية أثناء إعادة الضبط على الإعدادات الأصلية، وبالتالي تبدو الإعدادات الأولية للمستخدم تمامًا كما لو كان يضبطها للمرة الأولى.
ضبط ADB_VENDOR_KEYS للربط عبر USB
يتيح متغير البيئة ADB_VENDOR_KEYS
لمصنّعي الأجهزة الوصول إلى الإصدارات التي يمكن تصحيح أخطائها (-userdebug و-eng، ولكن ليس -user) عبر adb بدون تفويض يدوي.
عادةً ما ينشئ adb مفتاح مصادقة RSA فريدًا لكل جهاز كمبيوتر عميل، ويرسله إلى أي جهاز متصل. هذا هو مفتاح RSA المعروض في مربّع حوار تفويض adb. كحلّ بديل، يمكنك إنشاء مفاتيح معروفة في صورة النظام ومشاركتها مع برنامج adb.
ويفيد ذلك في تطوير نظام التشغيل، وخاصةً في الاختبار، لأنّه يغنيك عن التفاعل يدويًا مع مربّع حوار تفويض adb.
لإنشاء مفاتيح المورّد، يجب أن يتّبع شخص واحد (عادةً مدير إصدار) الخطوات التالية:
- أنشئ مفتاحَي تشفير باستخدام
adb keygen
. بالنسبة إلى أجهزة Google، تنشئ Google زوج مفاتيح جديدًا لكل إصدار جديد من نظام التشغيل. - تحقَّق من أزواج المفاتيح في مكان ما في شجرة المصدر. وتخزِّنها Google في
vendor/google/security/adb/
مثلاً. - اضبط متغير الإصدار
PRODUCT_ADB_KEYS
للإشارة إلى دليل المفاتيح. تنفّذ Google ذلك من خلال إضافة ملفAndroid.mk
في دليل المفاتيح يتضمّن العبارةPRODUCT_ADB_KEYS := $(LOCAL_PATH)/$(PLATFORM_VERSION).adb_key.pub
، ما يساعد في ضمان تذكُّرنا بإنشاء زوج مفاتيح جديد لكل إصدار من نظام التشغيل.
في ما يلي ملف makefile الذي تستخدمه Google في الدليل الذي نخزّن فيه أزواج المفاتيح التي تم تسجيلها لكل إصدار:
PRODUCT_ADB_KEYS := $(LOCAL_PATH)/$(PLATFORM_VERSION).adb_key.pub ifeq ($(wildcard $(PRODUCT_ADB_KEYS)),) $(warning ========================) $(warning The adb key for this release) $(warning ) $(warning $(PRODUCT_ADB_KEYS)) $(warning ) $(warning does not exist. Most likely PLATFORM_VERSION in build/core/version_defaults.mk) $(warning has changed and a new adb key needs to be generated.) $(warning ) $(warning Please run the following commands to create a new key:) $(warning ) $(warning make -j8 adb) $(warning LOGNAME=android-eng HOSTNAME=google.com adb keygen $(patsubst %.pub,%,$(PRODUCT_ADB_KEYS))) $(warning ) $(warning and upload/review/submit the changes) $(warning ========================) $(error done) endif
لاستخدام مفاتيح المورّد هذه، ما على المهندس سوى ضبط متغير البيئة ADB_VENDOR_KEYS
للإشارة إلى الدليل الذي يتم فيه تخزين أزواج المفاتيح.
يطلب ذلك من adb
تجربة مفاتيح التحديد هذه أولاً، قبل الرجوع إلى مفتاح المضيف الذي تم إنشاؤه والذي يتطلّب تفويضًا يدويًا. عندما يتعذّر على adb
الاتصال بجهاز غير معتمَد، ستطلب منك رسالة الخطأ ضبط ADB_VENDOR_KEYS
إذا لم تكن قد ضبطته من قبل.