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

click fraud protection

بدون كود المصدر، كيف يمكن للمطورين الحصول على مكونات الأجهزة مثل الكاميرات التي تعمل في ذاكرة القراءة فقط (ROM) المخصصة؟ الجواب هو BLOB، والرقائق، والكثير من التصحيح.

مع إصدار Android Oreo والعديد من الأجهزة مثل شاومي ريدمي نوت 3, جوجل نيكزس 5 و آخرون يتلقونها بشكل غير رسمي، ربما يكون من العدل أن نتساءل عن سبب تعطل نفس الميزات (الكاميرا في الغالب) عندما يقوم المطورون بنقل ذاكرة ROM المستندة إلى مشروع Android مفتوح المصدر (AOSP). من المحتمل أنك شاهدت سلاسل رسائل منتدى XDA الخاصة بالأقراص المدمجة (ROM) مع قائمة طويلة من الميزات المعطلة في الأعلى. "ما الذي ينجح" متبوعًا بقائمة من ميزات العمل، ثم في الأسفل يوجد رمز "ما الذي لا يعمل؟ أخبرني أنت!" هما عبارة عن امتناعت شائعة في منتدياتنا والتي أصبحت عمليًا بمثابة ميم في أماكن مثل Reddit وTwitter.

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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


كيف يعمل الوميض؟

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

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

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

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

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

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

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


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

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

الرقائق رقم 1 - تغيير اسم حزمة الكاميرا

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

الرقائق رقم 2 - تعطيل QuadraCfa

بالنسبة لرقاقته التالية، كان عليه تعطيل QuadraCfa والتي من المفترض أنها تقنية مملوكة لشركة Qualcomm تتعلق بالكاميرا. نقول ذلك لأنه لا أنا ولا Sultanxda متأكدان تمامًا من ماهية QuadraCfa، لكن Sultanxda يعلم أنها عطلت الكاميرا الأمامية كلما تم تمكينها.

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

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

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

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

الرقائق رقم 3 - إصلاح أعطال الضوء الساطع

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

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

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

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


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

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

أتمنى أن تكون مغامرات الكاميرا الخاصة بك أقل إيلامًا من مغامراتي. -سلطانxda

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

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

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