إضافة جهاز جديد

استخدِم المعلومات الواردة في هذه الصفحة لإنشاء ملفات 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 هذا هو الإصدار التلقائي.
  • تثبِّت هذه السمة الوحدات التي تمّت الإشارة إليها بالعلامة eng أو debug.
  • تثبِّت هذه السمة الوحدات وفقًا لملفات تعريف المنتج، بالإضافة إلى الوحدات الموسومة.
  • ro.secure=0
  • ro.debuggable=1
  • ro.kernel.android.checkjni=1
  • يتم تفعيل adb تلقائيًا.
user الصيغة التي من المفترض أن تكون وحدات الإصدار النهائي.
  • تثبيت الوحدات التي تحمل العلامة user
  • تثبِّت هذه السمة الوحدات وفقًا لملفات تعريف المنتج، بالإضافة إلى الوحدات الموسومة.
  • ro.secure=1
  • ro.debuggable=0
  • يكون خيار adb غير مفعَّل تلقائيًا.
userdebug الأسعار نفسها في فندق user، مع الاستثناءات التالية:
  • يتم أيضًا تثبيت الوحدات التي تحمل العلامة debug.
  • ro.debuggable=1
  • يتم تفعيل adb تلقائيًا.

إرشادات بشأن 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:

  1. أنشئ دليلاً لمنتجك.device/<company-name>/<device-name> على سبيل المثال، device/google/marlin. سيحتوي هذا الدليل على رمز المصدر لجهازك بالإضافة إلى ملفات makefile اللازمة لإنشائه.
  2. أنشئ device.mk ملف makefile يعرّف الملفات والوحدات المطلوبة للجهاز. للاطّلاع على مثال، راجِع device/google/marlin/device-marlin.mk.
  3. أنشئ ملف 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.

  4. أنشئ ملف 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
    
  5. أنشئ BoardConfig.mk makefile يحتوي على إعدادات خاصة باللوحة. للاطّلاع على مثال، راجِع device/google/marlin/BoardConfig.mk.
  6. في الإصدار 9 من نظام التشغيل Android والإصدارات الأقدم فقط، أنشئ ملف vendorsetup.sh لإضافة منتجك (مثل "وجبة غداء متكاملة") إلى الإصدار مع نوع إصدار مفصولَين بشرطة. مثلاً:
    add_lunch_combo <product-name>-userdebug
    
  7. في هذه المرحلة، يمكنك إنشاء المزيد من خيارات المنتجات استنادًا إلى الجهاز نفسه.

ضبط متغيّرات تعريف المنتج

يتم تحديد المتغيرات الخاصة بالمنتج في ملف 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.

لإنشاء مفاتيح المورّد، يجب أن يتّبع شخص واحد (عادةً مدير إصدار) الخطوات التالية:

  1. أنشئ مفتاحَي تشفير باستخدام adb keygen. بالنسبة إلى أجهزة Google، تنشئ Google زوج مفاتيح جديدًا لكل إصدار جديد من نظام التشغيل.
  2. تحقَّق من أزواج المفاتيح في مكان ما في شجرة المصدر. وتخزِّنها Google في vendor/google/security/adb/ مثلاً.
  3. اضبط متغير الإصدار 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 إذا لم تكن قد ضبطته من قبل.