الكاميرات في الأقراص المدمجة المخصصة: كيف يمكن للمطورين عمل الأجهزة دون شفرة المصدر

مع إصدار Android Oreo والعديد من الأجهزة مثل Xiaomi Redmi Note 3 و Google Nexus 5 وغيرها من الأجهزة التي تستقبلها بشكل غير رسمي ، ربما يكون من العدل أن نتساءل عن سبب تمزق نفس الميزات (معظمها الكاميرا) عندما يقوم المطورون بتطبيق Android Open مشروع المصدر (AOSP) مقرها ROM. من المحتمل أن تكون قد شاهدت مؤشرات ترابط ROM مدمجة مع قائمة طويلة من الميزات المقطوعة. "ما الذي ينجح" متبوعًا بقائمة من ميزات العمل ، ثم أسفل ذلك الرمز "ما الذي لا ينجح؟ أنت تخبرني! "هما إمتناعان شائعان في منتدياتنا التي أصبحت من الناحية العملية ميم في أماكن مثل رديت وتويتر.

لماذا يتم تعطيل الكثير من الوظائف كلما حاول مطور توصيل AOSP ROM على أجهزتهم؟ الإجابة الأساسية هي أنه نظرًا لأن الوظائف تتغير عبر إصدارات مختلفة من Android ، فلن تعمل برامج تشغيل الأجهزة القديمة التي تم حزمها مثل BLOBs مع الإصدارات الأحدث من Android ، أو حتى مع AOSP فقط. للتغلب على ذلك ، يستفيد المطورون مما يسمى "shim" ، لكن العملية المعنية صعبة ، وتستغرق وقتًا كبيرًا ، وفي بعض الأحيان يصعب تصحيحها.

في هذه المقالة ، سنقوم بتوضيح كيفية عمل الحشوات ، خاصة فيما يتعلق بتشغيل الكاميرا بشكل صحيح على ROM المدمجة القائمة على AOSP. سنستخدم جهاز OnePlus 3T كمثال. لاحظ أن صعوبة المشاركة في تشغيل هذه الميزات محددة للغاية في الجهاز.

ون بلس 3T تشغيل OxygenOS. على الرغم من أن هواتف OnePlus معروفة بمهاراتها في مجال التطوير المخصص ، إلا أن هناك الكثير من العمل الذي يقوم به المطورون وراء الكواليس لإنشاء منافذ مستقرة لـ AOSP.


ما هو الرقائق أو BLOB؟

حتى نبدأ في فهم جزء مما يفعله المطورون ، نحتاج أولاً إلى شرح بعض الأشياء. على الرغم من أن نظام التشغيل أندرويد مفتوح المصدر (يطلق عليه مشروع أندرويد مفتوح المصدر لسبب ما) ، فإن البرنامج (بلا النواة) التي يتم شحنها على الآلاف من أجهزة أندرويد ليس كذلك. لا يمكن للمطورين الوصول إلى التعليمات البرمجية المصدر الخاصة بـ Samsung Experience أو EMUI أو OxygenOS أو أي من النكهات الأخرى من Android.

الآن ، ربما لا يهتم المطورون بنقل AOSP إلى جهاز غير تابع لشركة Google حول الكود المصدري لجلود Android هذه لأنهم لن يقوموا بتعديل هذه الأقراص المدمجة وإنشاءها. قد يكون ذلك صحيحًا ، إن لم يكن لسبب واحد كبير ، ألا وهو أن الأجزاء الضرورية لتشغيل الكاميرا بشكل صحيح ، وخصوصًا الكاميرا HAL (طبقة تجريد الأجهزة) ، هي أيضًا مصدر مغلق .

إن مشكلة عدم وجود الكاميرا HAL فحسب ، بل أيضًا مصدر ROM المغلق ، هي أن المطورين الذين يعملون على نقل AOSP على أجهزتهم سيعملون بشكل أعمى . يكون مصدر ذاكرة الوصول العشوائي (OEM ROM) المصدر المغلق قادرًا على التفاعل مع الكاميرا HAL تمامًا نظرًا لأن الشركة المصنّعة للمعدات الأصلية لديها حق الوصول إلى مصدر الكاميرا HAL. الكاميرا HAL هي ما يسمح لـ ROM "بالتحدث" مع أجهزة الكاميرا - وبدون ذلك ، ستكون الكاميرا غير وظيفية. فكر في الكاميرا HAL باعتبارها عجلة القيادة ودواسات السيارة. تسمح عجلة القيادة / الدواسات بالتحكم في المكونات الداخلية للسيارة من خلال توفير واجهة خارجية للسائق (ROM) للاستفادة من المكونات الداخلية.

رسم بياني يوضح بنية الكاميرا. المصدر: جوجل

نظرًا لأن أجهزة الكاميرا تصبح أكثر تعقيدًا (ظهور الكاميرات المزدوجة ، على سبيل المثال) ، فإن الوصول إلى مصدر HAL الخاص بالكاميرا من شأنه أن يجعل نقل AOSP ROM بكاميرا وظيفية أسهل بكثير.

ومع ذلك ، لا توفر الشركات المصنعة الأصلية إمكانية الوصول إلى مصدر HAL الخاص بالكاميرا لأسباب مختلفة. أولاً ، إذا لم يكن لديهم جميع حقوق ملكية الكاميرا HAL (مثل عندما تدمج الملكية الفكرية من شركات أخرى) ، فلن يتمكنوا من توزيع المصدر. ثانياً ، قد يؤدي إطلاق مصدر HAL الخاص بالكاميرا إلى تعريض الملكية الفكرية الخاصة بهم للخطر. أخيرًا ، ليست الشركات ملزمة قانونًا بتوفير شفرة المصدر هذه (على عكس شفرة مصدر kernel التي يتعين عليها إصدارها بموجب الترخيص العام) ، وبالتالي ليس لديهم أي حافز لإصدارها. لذلك ، من دون الوصول إلى مصدر HAL الخاص بالكاميرا ، كيف يعمل المطورون بالضبط على تشغيل ROM AOSP؟ الجواب هو BLOB ، shim ، والكثير والكثير من التصحيح.

يحتوي جهاز BLOB (Binary Large OBject) على ثنائيات تم تعبئتها مسبقًا وهي شكل مترجم من البرامج. في هذه الحالة ، يتم تجميع مصدر HAL الخاص بالكاميرا بواسطة OEM ويتم شحنها على أجهزة مثل الثنائيات. عندما يتحدث المطورون عن BLOBs ، فإنهم يشيرون إلى تلك الثنائيات التي يتم شحنها على الأجهزة الحية التي يمكنهم استخراجها. الآن ، ابتلى موضوع "BLOBs للكاميرا" OnePlus منذ فترة طويلة لعدة أشهر ، ولكن الحقيقة هي أن المطورين تمكنوا دائمًا من الوصول إلى BLOBs الخاصة بالكاميرا. رمز مصدر HAL الخاص بالكاميرا هو التذكرة الذهبية للمطورين هنا ، لكن لن يتم إصدارها أبدًا بسبب المخاطر القانونية التي ستضعها شركات مثل OnePlus.

وبالتالي ، لا يُترك للمطورين الذين يتطلعون إلى جلب AOSP إلى جهاز ما إلا من خلال BLOBs من الكاميرا HAL التي لا يمكنهم الوصول إلى الكود المصدري لها. نادراً ما كان بإمكان أحد المطورين إقران كود AOSP ROM الخاص بهم بالكاميرا HAL BLOB ويتوقع أن تعمل ، لذلك من أجل سد الفجوة بين الاثنين ، يقوم المطورون بإنشاء ما يسمى بـ " shim ".

إلى "shim" هو "إسفين (شيء ما) أو ملء مساحة." هذا هو ما يفعله المطور عند كتابة shim - يضيفون رمزًا للسماح لـ BLOB بالتفاعل مع شفرة مصدر AOSP التي يعملون معها . يتم استخدام الحشوات لجعل BLOBs من جميع الأنواع المختلفة تعمل مع AOSP ، ولكن عادةً ما تكون الكاميرا BLOB هي الأكثر تطلبًا. كما ذكرنا من قبل ، لا يتطلب الأمر shimming فقط لنقل الإصدارات الأحدث من Android على جهاز (مثل كل تلك الأندرويد غير الرسمية لـ Android Oreo) ولكن أيضًا مطلوب عند نقل AOSP من نفس إصدار Android على هذا الجهاز.

القراءة الموصى بها: من المتجر إلى الرف: استسلام متعمق عن سبب استبعاد أجهزة MSM8974 من Nougat

على سبيل المثال ، تلقى OnePlus 2 آخر تحديث رسمي لنظام التشغيل في شكل Android 6.0 Marshmallow. ومع ذلك ، يحتوي الجهاز فعليًا على مدمجة مخصصة تعتمد على AOSP تستند إلى نظام Android Nougat ، وذلك بفضل العمل الجاد للمطورين وألواحهم. سنقوم بتفصيل بعض الأمثلة على الحشوات ، لكن أولاً ، علينا أن نتحدث عن كيفية عمل الحشوات بالضبط.


كيف يعتم العمل؟

نظرًا لأن المطورين لا يستطيعون الوصول إلى مصدر الكاميرا HAL أو OEM ROM (وفقط الثنائيات المترجمة مسبقًا) ، فإنهم لا يستطيعون معرفة الوظائف التي تتوقعها الكاميرا HAL. لهذا السبب ، غالبًا ما يكون هناك عدم تطابق بين اسم الوظيفة التي تبحث عنها الكاميرا HAL والاسم الفعلي للوظيفة في رمز AOSP الذي يعمل معه المطور.

لحل هذه المشكلة ، يقوم المطور ببساطة بإنشاء وظيفة جديدة تستخدم نفس اسم الوظيفة التي تتوقعها الكاميرا HAL BLOB ، لكن هذه الوظيفة الجديدة تنفذ فقط ما يريده المطور. هذه الوظيفة الجديدة التي تعمل كوسيط بين BLOB و AOSP هي الرقائق. هذا السيناريو المحدد حيث فشل BLOB في العثور على الوظيفة التي يبحث عنها هو واحد من أكثرها شيوعًا حيث تكون هناك حاجة إلى shim.

رسم تخطيطي MS بسيط جدًا يوضح مكان الحاجة إلى الرقائق.

ربما ستكون الأمور أكثر منطقية مع مثال افتراضي يتضمن OnePlus 3T. سنقوم بإنشاء مثال باستخدام OxygenOS وكاميرا OnePlus. إذا استخدمنا BLOBs للكاميرا مأخوذة من OxygenOS Nougat لجهاز OnePlus 3T لبناء ROM Nougat على AOSP ، فقد نواجه بعض المشكلات. وذلك لأن الكاميرا BLOBs (التي تم تجميعها في الأصل من قبل OEM) ستكون قادرة على الإشارة إلى جميع الوظائف التي تحتاجها داخل OxygenOS ، ولكن لأن AOSP ROM المترجمة قد لا يكون لها تلك الوظائف أو ربما قام بتجميعها تحت اسم مختلف ( وبالتالي يؤدي إلى عدم تطابق بين رموز الوظيفة) ، سيكون هناك خطأ. يمكن إصلاح ذلك عن طريق إنشاء وظيفة جديدة داخل AOSP ROM بالاسم الذي يتوقعه BLOB - شيم لدينا.

يتم استخدام الرموز في سياق البرمجة للإشارة إلى وظائف محددة في التعليمات البرمجية. الرموز ضرورية لأن موضع الوظيفة يمكن أن يتغير عندما يتم تحرير الكود ، ولذا لتجنب المترجم الثابت للوظائف ، يقوم المترجم بإنشاء جدول من الرموز التي يمكن أن تستخدمها الوظائف الأخرى للإشارة دائمًا إلى الوظيفة الصحيحة. عندما تقوم بتغيير اسم دالة قبل التحويل البرمجي ، يتغير رمزها أيضًا ، لذا فإن أي تغييرات يقوم بها OEM على مصدر HAL الخاص بالكاميرا قبل التحويل البرمجي سوف تتطلب من المطورين إنشاء شيم جديد.

عرض جدول الرموز مع النطاط. المصدر: ابيوريت

التفسير الذي قدمناه حتى الآن يجعل الأمر يبدو كأن إنشاء الحشوات أمر سهل. تغيير بعض أسماء الوظائف هنا وليس هناك صوت صعب للغاية ، أليس كذلك؟ إلا إذا كانت بهذه السهولة. حقيقة الحشوات تنطوي على أكثر من مجرد وظيفة إعادة تسمية. لقد تحدثنا مع المطور المطور Sultanxda الذي كان قادرًا على تقديم مثال على واحدة من أصعب الحشوات التي عمل عليها.


يعتم - ليس سهلا كما يبدو

بالنسبة لأولئك غير المألوفين في OnePlus 3T ، تم كسر الكاميرا الأمامية في البداية على أقراص مدمجة مخصصة تعتمد على AOSP. بادئ ذي بدء ، فإن محاولة التقاط أي صورة أكثر من 8MP قد يؤدي إلى تعطل. في محاولته لحل هذه المشكلة ، صنع Sultanxda العديد من الحشوات للسماح للكاميرا الأمامية من OnePlus 3T بالعمل بشكل صحيح.

Shim # 1 - تغيير اسم حزمة الكاميرا

من أجل منع الكاميرا الأمامية من الانهيار كلما التقط المستخدم صورة أكثر من 8 ميجابكسل ، أجبر Sultanxda الكاميرا HAL على تحديد جميع الكاميرات على أنها كاميرا OnePlus. يتم ذلك لأن OnePlus قرر تخصيص وظيفة مساعدة لتطبيقات معينة ( isOnePlusCamera ، isFacebookCamera ، إلخ) لسبب ما. قام Sultanxda بإصلاح ذلك عن طريق إبطال الكاميرا HAL بحيث تشير إلى وظيفة جديدة تُرجع دائمًا "صواب" كما لو كان المستخدم يستخدم كاميرا OnePlus - حتى عندما لا يكونوا كذلك.

Shim # 2 - تعطيل QuadraCfa

بالنسبة إلى رغبته التالية ، اضطر إلى تعطيل QuadraCfa التي يُفترض أنها تقنية Qualcomm خاصة بالكاميرا. نقول أنه من المفترض أن لا نفسي ولا Sultanxda متأكدين تمامًا من هو QuadraCfa ، لكن Sultanxda يعلم أنه كسر الكاميرا الأمامية عندما تم تمكينها.

لاحظ أن QuadraCfa ستمكّن نفسها بطريقة ما ، لكنه لم يكن متأكدًا من سبب ذلك أو كيف يفعل ذلك. حل هذا يتطلب تعديلاً غير تقليدي من جانبه. في الرقائق التقليدية ، توفر وظيفة الرقائق ، عند تجميعها ، الرمز المفقود الذي تبحث عنه BLOB. في هذه الحالة ، كان لدى BLOB بالفعل الرموز التي يحتاجها — الرموز التي من المفترض أنها تمثل الوظائف التي بدأت في تشغيل QuadraCfa.

محرر Bless Hex. برنامج Sultanxda المستخدمة.

وبالتالي ، كان بحاجة إلى تجاوز الرموز التي تستخدمها الكاميرا HAL ، وجعلها "مفقودة" في جوهرها ، بحيث توفر حشواته تلك الرموز "المفقودة". الطريقة الوحيدة للقيام بذلك هي من خلال تحرير عرافة الكاميرا HAL نفسها . يبحث Hex في الأساس عن طريق مجموعة من رطانة غير منظمة في شكل بيانات ثنائية من أجل العثور على إبرة في كومة قش - إما وظيفة أو سلسلة كنت تبحث لتحريرها.

يعد تحرير دالة ما أكثر صعوبة من تحرير سلسلة سداسي عشرية ، لكن لحسن الحظ ، كان Sultanxda قادراً على تجنب الاضطرار إلى تحرير الوظائف الموجودة خلف QuadraCfa عن طريق تحرير ست عشري لأسماء الرموز لتفادي تلك الرموز.

شيم # 3 - برايت لايت كراش فيكس

بعد ذلك ، حدد Sultanxda أن التقاط صورة من الكاميرا الأمامية إذا كانت ظروف الإضاءة الساطعة قد تتسبب في تعطل الكاميرا. من أجل إعادة إنتاج هذا الخطأ على أجهزته الخاصة ، قام Sultanxda بالفعل بتشغيل وظيفة المصباح في OnePlus One الخاص به ، وألمع الضوء أمام الكاميرا الأمامية التي تواجه OnePlus 3T من أجل جعلها تتعطل وتنتج سجلات قابلة للاستخدام! بمجرد اكتشاف الوظيفة التي تسببت في التعطل ، قام بإنشاء رزمة لإجبار الجهاز على استخدام وضع الإضاءة الخافتة طوال الوقت للكاميرا الأمامية.

Shim # 4 - صور الكاميرا الأمامية المنخفضة الدقة

بعد إصلاح تعطل الضوء الساطع مع الرقائق السابقة ، اكتشف السلطانكسدا خطأ آخر نشأ بالفعل كنتيجة مباشرة لهذا الرقائق: صور الكاميرا الأمامية المنخفضة الدقة. بدلاً من التقاط الصور بدقة المستخدم المطلوبة (على سبيل المثال ، 16MP) ، سيتم التقاط الصورة الناتجة بدقة 4MP.

يتطلب حل هذا الأمر أن handleSuperResolution وظائف handleSuperResolution و isSuperResolution ليعود دائمًا إلى حقيقة ، ولكن فقط عندما تكون الكاميرا الأمامية الأمامية نشطة (لأنه بخلاف ذلك ، isSuperResolution الكاميرا عند التقاط الصور من المستشعر الخلفي).


الدرس المستفاد - يمكن أن يكون التقشير صعباً

يعترف Sultanxda بأن الحشوات التي كان يتعين عليه إنشاؤها للحصول على عمل الكاميرا الأمامية OnePlus 3T تعمل لا تمثل مثالك المعتاد على الرقائق. إنه فخور إلى حد ما بمظهره نظرًا لتعقيده وضرورته النادرة لتعديل BLOB نفسه. لكن هذا المثال يوضح فقط مدى صعوبة تشغيل أجهزة الكاميرا على أجهزة معينة.

قد تكون مغامرات الكاميرا الخاصة بك أقل إيلاما مما كانت عليه لي. -Sultanxda

سجلات ، سجلات ، والمزيد من السجلات. دون وجود طريقة ثابتة لإعادة إنتاج التعطل وبدون سجلات ، يكون لدى المطورين أمل ضئيل في العثور على مصدر المشكلة. حتى إذا وجدوا سبب المشكلة ، فليس دائمًا حل بسيط. قد تستغرق العملية الكاملة للعثور على هذه الأخطاء وسحقها أيامًا أو أسابيع ، وهذا هو السبب في أن إصلاح الكاميرا على AOSP ROMs يعد أحد أكثر المهام صعوبة.

إذا كان جهازك يحتوي على ذاكرة الوصول العشوائي (AOSP ROM) المنقولة إليه مع أجهزة تعمل بكامل طاقتها ، نأمل ، يمكنك البدء في تقدير الصراع الذي قد يواجهه هؤلاء المطورين من أجل تقديم هذه الميزات لك. نقدر لهم عملهم ، لأنه ليس بالأمر السهل. إنه كثير من العمل الذي لن تلاحظه الغالبية العظمى من المستخدمين ، لأن المطورين الموهوبين في منتدياتنا يعتنون بالعديد من الأجزاء غير المرئية من Android.

نود تقديم شكر خاص إلى Sultanxda على العديد من المساهمات التي اقترحها في إعداد هذا المقال.