جهاز فك التشفير والتجارب مع Android في حاوية LXC

كيف نشأت حاجة غريبة لتشغيل Android في حاوية Linux ، وماذا جاء منها

الخلفية


إن تشغيل Android في حاوية LXC ، في رأيي ، هو قرار منطقي إذا كنت ترغب في الحصول على شفافية وموثوقية Bare Linux واستخدام الإمكانات الهائلة لتطبيقات Android الجيدة (وغير الجيدة) للجهات الخارجية. كما أن هذا التكوين مهم باعتباره نظامًا أساسيًا لتصحيح صورة AOSP الخاصة بك في ظروف قريبة من القتال قدر الإمكان.
للتجارب ، تم اختيار جهاز فك تشفير صيني تقدمي وغير مكلف على أساس 64 بت ARMv8 من Amlogic S905x (وحدة المعالجة المركزية - 4 نوى ، ذاكرة الوصول العشوائي - 2 جيجابايت ، MMC - 8 جيجابايت). أيضًا ، كانت الحجة الجيدة (بالمقارنة مع البائعين الآخرين) هي أساس الشفرة في OpenSource ووجود برنامج تشغيل kernel kernel المصدر لـ Mali-450. مكتبة مساحة المستخدم مالي اليوم في المجال العام على الموقع الرسمي لـ ARM Limited. مكتبات الوصول الثنائية لـ Linux-FB و Linux-Wayland و Android.

كان الغرض الرئيسي من التجارب هو تطبيق دور السينما والتطبيقات عبر الإنترنت للعمل مع استضافة وسائط الشبكة. على سبيل المثال ، مع Youtube على Linux ، بدأت المشاكل على الفور. أولاً: بدأت طريقة الهاكر في الحصول على روابط إلى المحتوى من خلال تحليل نص JS النصي وإنشاء توقيع (تم تنفيذه سابقًا في minitube من Tordini وفي youtube-dl) تتعطل بانتظام بسبب صراع Google الذي لا يرحم مع طرق الزحف إلى الإعلانات. ثانيًا: كان الحد الأقصى لدقة المحتوى 720 بكسل - لم يتم إصدار المزيد من Google-API. ثالثًا: فقد WebKit الدعم العادي ولم يتم دعمه مؤخرًا إلا من قبل مجموعة صغيرة من المتحمسين. المصير نفسه أصاب ميناء كيو تي. ونتيجة لذلك ، رفضت صفحة youtube / tv العمل في وقت ما ، مستشهدة بالشيخوخة لمحرك الويب. حسنًا ، في النهاية ، قدم مفاجأة WebEngine (Qt-Chromium). اتضح أن هذا الجمال لا يدعم تسريع الأجهزة. يتم إجراء استثناء فقط لمنفذ Android الخاص به ، وفرع VAAPI الهامشي في Linux. طريق مسدود. بشكل عام ، لم أجد طريقة بسيطة لتمكين فك تشفير الفيديو المسرّع للأجهزة لـ Chromium على Linux. بدا تنفيذ VAAPI لـ Amlogic بمثابة عمل شاق وعديم الفائدة بالنسبة لي. شعرت أيضًا بالبرنامج المساعد للفلفل - للأسف لا يسمح PPAPI بتشغيل الفيديو خارج الشاشة.

Android


لماذا لا تقوم بتشغيل Android في حاوية؟ ألهم مشروع Anbox هذا الإنجاز. أظهرت دراسة شاملة لـ Anbox أنها لا تناسبنا. لكن الفكرة كانت واضحة. ادعت مقالات كتبها مؤلفون آخرون أن تشغيل Android في حاوية هو مهمة غبية. ولكن في الواقع ، تبين أن كل شيء أكثر تعقيدًا. ببساطة عن طريق تكوين ملفات التكوين ، لم نتمكن من النزول.

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

كان الاختبار الأول فحص Busybox في الحاوية. بعد التأكد من أن كل شيء يعمل ، بدأت التجربة.

العرض الأولي هو /var/lib/lxc/abox.conf:

lxc.rootfs = /var/lib/lxc/abox/rootfs lxc.rootfs.backend = dir lxc.utsname = abox lxc.pts = 1024 lxc.cap.drop = mac_admin mac_override 

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

خروج صغير من الموضوع: الصينيون ، تكييف البرامج ، يبصقون على جميع القواعد التي وضعها المجتمع. على سبيل المثال ، النواة 3.14.29. يُستخدم رقم إصدار kernel الصامت هذا على جميع الأجهزة تقريبًا على معالجات Amlogic S8xx و S9xx. ولكن ، دائمًا ما تكون مختلفة تمامًا عن بعضها البعض ، حتى عدم التوافق التام للوحدات القديمة مع الصور الجديدة والعكس صحيح. يبدو أنه تم تصحيح اللب وفقًا للمبدأ: "في أسرع وقت ممكن دخول المنتج إلى السوق". الرمز ليس قذرًا فحسب - بل هو من نوعية مثيرة للاشمئزاز. عادة ما يؤدي تغيير التكوين إلى أخطاء عند تجميع أو ربط الصورة أو الوحدات النمطية. إن نظام Android المصحح هو من نفس الجودة ، ومبادئ التكيف متشابهة. تم تجاهل جميع توصيات فريق AOSP تقريبًا.

حسنا لا يوجد مكان للذهاب! نجمع.

المحاولة رقم 1 قم بتثبيت الصورة في الحاوية ، قم بتشغيلها. لا يعمل. يظهر التحليل أنه لا توجد كائنات نواة: الموثق والأشم. نضيف وحدات النواة.

المحاولة رقم 2 نبدأ مرة أخرى. تعطل Installd. اتضح أن الموثق الأصلي لا يعرف عن مساحات الأسماء. سحب الموثق من Anbox.

تبدأ المحاولة رقم 3 وتذهب على الفور إلى إعادة التشغيل. اتضح أن init يريد SELinux ويرفض العمل بدونه.

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

المحاولة رقم 5 وصلت عملية التمهيد إلى البيضة الملقحة. في السجلات ، يؤدي الشتائم من النواة إلى الحرف UID. في الموثق (والموثق من Anbox) ، يمكن مقارنة UID لعملية المالك بسهولة بالوحدة. الطريقة الوحيدة هي تعطيل التحقق ، خاصة وأن هذا الفحص لا معنى له في الحاوية.

ظهرت المحاولة رقم 6 تعارضات تتعلق بمشاركة الوصول إلى إدارة المعدات. أعلق على عناصر تحكم USB و Bluetooth في النصوص البرمجية init. أقوم بإزالة جميع الإدخالات من fstab ، وأمنع تثبيت جميع الوسائط والتحقق منها في البرامج النصية. أضف الآن بطاقة التثبيت إلى تكوين الحاوية. يحتوي على سطر واحد فقط. يتم تحميل الدليل /mnt/lxc.data على المضيف في قسم MMC حقيقي.

 lxc.mount.entry = /mnt/lxc.data data auto rw,bind 0 0 

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

لا تعمل الشبكة ، فهي تعمل بشكل أكثر دقة ، ولكن بعض التطبيقات تقوم بتقييم أدائها حسب حالة واجهات الشبكة. أيدي ملتوية في كلمة واحدة. لإزالة هذا العيب على المضيف ، نرفع جسر الشبكة (الجسر) والواجهة الافتراضية (veth).

 lxc.network.type = veth lxc.network.flags = up lxc.network.name = eth1 lxc.network.link = br0 lxc.network.veth.pair = veth-01 lxc.network.ipv4 = 10.0.0.10/24 lxc.network.ipv4.gateway = 10.0.0.1 lxc.network.hwaddr = 00:FE:CD:BA:09:87 

تحتاج أيضًا إلى رفع خادم DHCP ، وإلا ستكون هناك مشاكل في DNS. لسوء الحظ ، لا يقوم Android بتحليل resolv.conf ولا يلعب موقعه في نظام الملفات أي دور. يمكنك تكوين اتصال الشبكة يدويًا ، ولكن إذا قمت بحذف البيانات من قسم البيانات ، فسيتم إعادة تعيين جميع الإعدادات.

الملخص


تعمل جميع تطبيقات الأسهم. مع تثبيت من السوق هناك مشاكل. على سبيل المثال: طالب الإصدار 3 من Youtube.tv بتحديث إطار عمل خدمة Google ، وبعد ذلك تعطل النظام. ظهرت مشكلة في ملف تخزين المفاتيح (لم يتم حلها بعد). تم تعطيل TEE أيضًا مؤقتًا ، لذلك لا تعمل widevine. تعمل الألعاب والتطبيقات بشكل جيد دون متطلبات خاصة للأجهزة. يقوم Chrome بتحريف فيديو HTML5 باستخدام وحدة فك ترميز البرامج ، ويرفض ربط وحدة فك ترميز الأجهزة. في هذه المناسبة ، هناك رأي حول AOSP المغسول من قبل الصينيين. لكن الفانيليا AOSP تطلق قاذفة مع شاشة تعمل باللمس - من المستحيل التحكم في المسافة البعيدة.

خاتمة


في المستقبل القريب - لإنشاء مشغل لتشغيل تطبيقات Android مباشرة من Linux. يتوفر مثال على ذلك في مصدر wpa-supplicant. يمكنك أيضًا إلقاء نظرة خاطفة على كيفية إجراء ذلك في Anbox.

شكرا لكم على اهتمامكم!

الإضافة 1


في اليوم الآخر راجعت قابلية التوسع في تطبيقات Qt. مبدئيًا ، تتم كتابة تطبيق عميل IPTV بتنسيق QML لنظام Linux. يعمل المشغل من خلال المكوّن الإضافي QtMultimedia. أثناء التجميع ، ظهرت تبعيات إشكالية. لحسن الحظ ، كان كل شيء يقتصر على QtDbus ، وهو ليس في Android. ما زلت لا أفهم لماذا يحتاج Android إلى إعادة اختراع العجلة - الموثق. ما الذي لم يعجبه مطورو DBus؟ أنه يعمل في مساحة المستخدم؟ أو اعتبارات الترخيص؟
DBus غير متصل. كان هذا غير مؤلم ، حيث كانت القناة ضرورية لبعض الوظائف المتعلقة بنظام التشغيل. جمعت apk. لا توجد صعوبة في التجميع ، حيث أستخدم QtCreator (وأوصي بذلك).
في AOSP ، كان علي رسم جسر Mediaplayer - وريث من android :: MediaPlayerInterface. تم تنفيذ أساليب setDataSource () و stop () فيه. تصنع المقابس للبقية. لدى setDataSource ثلاث واجهات. كان مطلوبا فقط تنفيذ:
 setDataSource(const sp<IMediaHTTPService> &httpService, const char *uri, const KeyedVector<String8, String8> *headers) 


إذا كنت تريد تحريف الملفات من الوسائط ، فيجب عليك العبث بها
 setDataSource(int fd, int64_t offset, int64_t length) 

يجب الحصول على اسم الملف من خلال "/ proc / self / fd /" + fd ؛

بعد التثبيت ، حصل التطبيق وذهب البث. عظيم! توقعت الكثير من المشاكل ، ولكن لا توجد مشاكل تقريبًا. بفضل مطوري Qt و QtCreator للعمل الرائع والمفيد!
ونتيجة لذلك ، حصلت على مثل هذه المجموعة: لاعب الخفي المضيف. في الحاوية ، هناك برنامج العميل وشريط بث مكالمات android :: Mediaplayer إلى المضيف. تعمل الحزمة من خلال مقبس UDP.

Source: https://habr.com/ru/post/ar413809/


All Articles