استخدم المعلومات الواردة في هذه الصفحة لإنشاء ملفات makefiles لجهازك ومنتجك.
يجب أن تحتوي كل وحدة Android جديدة على ملف تكوين لتوجيه نظام الإنشاء ببيانات وصفية للوحدة ، وتبعيات وقت التجميع ، وتعليمات الحزم. يستخدم Android نظام بناء Soong . راجع إنشاء Android للحصول على مزيد من المعلومات حول نظام إنشاء Android.
فهم طبقات البناء
يتضمن التسلسل الهرمي للبناء طبقات التجريد التي تتوافق مع التركيب المادي للجهاز. يتم وصف هذه الطبقات في الجدول أدناه. ترتبط كل طبقة بالطبقة التي فوقها بعلاقة رأس بأطراف. على سبيل المثال ، يمكن أن تحتوي العمارة على أكثر من لوحة واحدة ويمكن أن تحتوي كل لوحة على أكثر من منتج واحد. يمكنك تعريف عنصر في طبقة معينة كتخصص لعنصر في نفس الطبقة ، مما يلغي النسخ ويبسط الصيانة.
طبقة | مثال | وصف |
---|---|---|
منتج | myProduct ، myProduct_eu ، myProduct_eu_fr ، j2 ، sdk | تحدد طبقة المنتج مواصفات الميزة لمنتج الشحن مثل الوحدات النمطية المراد إنشاؤها ، واللغات المدعومة ، والتكوين لمختلف اللغات. بمعنى آخر ، هذا هو اسم المنتج الإجمالي. يتم تحديد المتغيرات الخاصة بالمنتج في ملفات تعريف المنتج. يمكن للمنتج أن يرث من تعريفات المنتجات الأخرى ، مما يبسط الصيانة. تتمثل إحدى الطرق الشائعة في إنشاء منتج أساسي يحتوي على ميزات تنطبق على جميع المنتجات ، ثم إنشاء متغيرات المنتج بناءً على هذا المنتج الأساسي. على سبيل المثال ، يمكن أن يرث منتجان يختلفان فقط من خلال أجهزة الراديو الخاصة بهما (CDMA مقابل GSM) من نفس المنتج الأساسي الذي لا يعرف الراديو. |
مجلس / جهاز | مارلين ، بلولين ، مرجان | تمثل طبقة اللوحة / الجهاز الطبقة المادية للبلاستيك على الجهاز (أي ، التصميم الصناعي للجهاز). تمثل هذه الطبقة أيضًا المخططات المجردة للمنتج. وتشمل هذه الأجهزة الطرفية على اللوحة وتكوينها. الأسماء المستخدمة هي مجرد رموز لتكوينات مختلفة للوحة / الجهاز. |
قوس | الذراع ، 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
إلى مسار متعلق بدليل المستوى الأعلى. يصبح هذا المسار جذر ظل يتم البحث عنه مع الجذر الحالي عندما يبحث نظام الإنشاء عن الموارد.
يتم تضمين الإعدادات المخصصة الأكثر شيوعًا في أطر عمل الملف / base / core / res / res / القيم / 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
. من تكوين هذا الجهاز ، يتم إنشاء منتج بملف تعريف منتج يقوم بتعريف المعلومات الخاصة بالمنتج حول الجهاز مثل الاسم والطراز. يمكنك عرض دليل device/google/marlin
لمعرفة كيفية إعداد كل هذا.
كتابة makefiles المنتج
تصف الخطوات التالية كيفية إعداد ملفات ميكانيكية للمنتج بطريقة مشابهة لتلك الخاصة بخط إنتاج Pixel:
- قم بإنشاء دليل
device/ <company-name> / <device-name>
لمنتجك. على سبيل المثال ،device/google/marlin
. سيحتوي هذا الدليل على شفرة المصدر لجهازك بالإضافة إلى ملفات makefiles لبنائها. - قم بإنشاء ملف
device.mk
يقوم بالتصريح عن الملفات والوحدات النمطية المطلوبة للجهاز. للحصول على مثال ، راجعdevice/google/marlin/device-marlin.mk
. - قم بإنشاء ملف تعريف منتج لإنشاء منتج معين بناءً على الجهاز. ملف 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
راجع إعداد متغيرات تعريف المنتج للمتغيرات الإضافية الخاصة بالمنتج والتي يمكنك إضافتها إلى ملفات makefiles الخاصة بك.
- قم بإنشاء ملف
AndroidProducts.mk
يشير إلى ملفات makefiles الخاصة بالمنتج. في هذا المثال ، يلزم فقط تعريف المنتج 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
. - بالنسبة لنظام التشغيل Android 9 والإصدارات الأقدم فقط ، قم بإنشاء ملف
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
أثناء معايرة المصنع ، يمكنك تكوين القيود دون تحويل المرشح إلى صورة النظام. تأكد من انتقاء هذه الخصائص من قسم OEM عن طريق إضافتها إلى متغير 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 and -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
إذا لم يكن قد تم تعيينه بالفعل.