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

استخدم المعلومات الواردة في هذه الصفحة لإنشاء ملفات 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 هذه هي النكهة الافتراضية.
  • تثبيت الوحدات الموسومة بـ 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 إلى مسار متعلق بدليل المستوى الأعلى. يصبح هذا المسار جذر ظل يتم البحث عنه مع الجذر الحالي عندما يبحث نظام الإنشاء عن الموارد.

يتم تضمين الإعدادات المخصصة الأكثر شيوعًا في أطر عمل الملف / 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:

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

  4. قم بإنشاء ملف 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
    
  5. قم بإنشاء ملف BoardConfig.mk makefile يحتوي على التكوينات الخاصة باللوحة. للحصول على مثال ، راجع device/google/marlin/BoardConfig.mk .
  6. بالنسبة لنظام التشغيل Android 9 والإصدارات الأقدم فقط ، قم بإنشاء ملف 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 أثناء معايرة المصنع ، يمكنك تكوين القيود دون تحويل المرشح إلى صورة النظام. تأكد من انتقاء هذه الخصائص من قسم 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.

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

  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 إذا لم يكن قد تم تعيينه بالفعل.