يوم جيد للجميع! تتناول هذه المقالة كيفية تعريف ألعاب الوحدة على Android باستخدام Android Studio. سأتحدث عن كيفية تكوين Android Studio والحصول على أكبر قدر ممكن من البيانات. قضايا التحليل والاستنتاجات بناءً على النتيجة تقع خارج نطاق هذه المقالة.
المتطلبات
لملف تعريف التطبيق بالكامل ، تحتاج إلى هاتف يعمل بنظام Android 8 أو إصدار أحدث (API 27). في التجربة ، يعد التنميط مع إصدارات Android الأقدم مغامرًا أكثر منه جيدًا. لهذا السبب ، أوصي بالحصول على مجموعة كاملة من أجهزة Nexus ، حيث أنها تحتوي على أجهزة قديمة وآخر تحديثات Android.
إعداد مشروع الوحدة
للحصول على النتيجة ، يجب عليك تكوين مشروع الوحدة بطريقة معينة.
الإعدادات في إعدادات البناء

- بادئ ذي بدء ، يجب عليك تبديل نظام Build إلى "Gradle" وتحديد المربع بجوار "Export Project" . وبالتالي ، سوف نحصل على مشروع Android Studio جاهز ، والذي سنستمر في التعريف به. من الممكن أيضًا إنشاء ملفات تعريف APK نهائية ، ولكن أكثر محدودية ويتطلب المزيد من الإعداد.
- يُنصح بإيقاف تشغيل وضع "تطوير البنية" ، لأن التوقيت الناتج في الملف التعريفي سيكون أقرب ما يكون إلى الأوقات الحقيقية.
الإعدادات في إعدادات المشغل

- تثبيت Scripting Backend في IL2CPP . إذا تركت Mono ، فحينئذٍ مع التنميط الأصلي سنرى العديد من وظائف Mono ، دون معلومات حول كيفية ارتباطها برمز C #.
- خيار "تكوين المترجم C ++" لنظام Android ليس له تأثير (في Unity 2018.3). يمكنك وضعه في "الإصدار" ، وربما في الإصدارات المستقبلية من سلسلة أدوات Unity Android ، سيؤثر هذا الإعداد على إعدادات برنامج التحويل البرمجي.
- من المستحسن قصر " الهيكل المستهدف" على ARMv7 . لذلك يمكنك توفير وقت التجميع وتجربة العديد من الهياكل في بعض الأحيان يضع Android Studio في ذهول.
- يجدر أيضًا تعيين عدد من الإعدادات الإضافية:
- تثبيت الموقع - "تفضيل خارجي"
- الوصول إلى الإنترنت - "يتطلب"
- إذن الكتابة - "خارجي (SDCard)"
يستخدم Android Studio وملفات التعريف الأخرى simpleperf لجمع الإحصاءات ، وسيحتاج الأمر إلى الوصول إلى بطاقة ذاكرة لتسجيل الملفات المؤقتة.
إعداد مشروع Gradle
بعد تثبيت جميع الإعدادات ، قم ببناء مشروع الوحدة. يجب أن تحصل على مجلد مع مشروع Gradle.

الوحدة الافتراضية لبناء مشروع بحيث تخطط لبناء APK النهائي منه. لذلك ، تم حذف جميع معلومات تصحيح الأخطاء منه ، ولكن لحسن الحظ يمكن إرجاعها. للقيام بذلك ، تحتاج إلى استبدال libil2cpp.so و libunity.so بالإصدار بمعلومات تصحيح الأخطاء.
libil2cpp.so
هذا ملف يحتوي على كل رمز C ++ الذي أنشأه IL2CPP من رمز C # الخاص بك. تنشئ الوحدة جميع المعلومات اللازمة للتوصيفات ، ولكن لتحسين حجم ملف APK ، فإنها تخفضه أثناء عملية الإنشاء. لإعادته:
- انتقل إلى مجلد المشروع الخاص بك
- حدد موقع المجلد الفرعي Temp فيه وانتقل إلى المجلد المؤقت Temp / StagingArea / symbols / armeabi-v7a
- ابحث عن 'libil2cpp.so.debug' فيه. هذا هو إصدار "libil2cpp.so" مع معلومات تصحيح الأخطاء.
- انتقل الآن إلى مشروع Gradle وابحث عن المجلد '\ src \ main \ jniLibs \ armeabi-v7a' فيه
- استبدل "libil2cpp.so" بالملف "libil2cpp.so.debug"
libunity.so
هذا هو الملف الذي يحتوي على الجزء المنخفض المستوى من Unity Player. نظرًا لأننا نقوم ببناء الإصدار ، وضعت Unity ملفًا في مشروعك دون تصحيح أخطاء المعلومات. تحتاج إلى استبدال libunity.so بملف حرف.
- انتقل إلى المجلد حيث قمت بتثبيت الوحدة
- انتقل إلى المجلد "\ Data \ PlaybackEngines \ AndroidPlayer \ Variations \ il2cpp \ Development \ Libs \ armeabi-v7a \"
- خذ ملف libunity.so من هناك ، واستبدل الملف في مشروعك ، الموجود في المجلد '\ src \ main \ jniLibs \ armeabi-v7a'
التنميط
الآن يمكنك البدء في إنشاء ملفات تعريف في Android Studio ، ما عليك سوى النقر فوق زر بدء منشئ ملفات التعريف.

يقوم Android Studio بتشغيل التطبيق وتبدأ جلسة التنميط

افتراضيًا ، يعرض Android Studio الرسومات ، لكنه لا يقوم بتجربة البيانات. لبدء العملية ، تحتاج إلى النقر على مسار وحدة المعالجة المركزية بحيث ينتقل المحول البرمجي إلى عرض وحدة المعالجة المركزية. في هذه الحالة ، سوف تظهر القائمة المنسدلة والزر "تسجيل" أعلى النافذة.

حدد Sampled "Native" (في Android Studio 3.3 - C / C ++ Native) ، وانقر فوق الزر "تسجيل".
نظرًا لأن التسجيل يتم على قرص الجهاز ، فمن الأفضل عدم تسجيل أكثر من 5-8 ثوانٍ من التجربة ، وستفشل العديد من الأجهزة أيضًا في كمية أقل من البيانات (انظر قائمة الأجهزة التي تم اختبارها في نهاية المقالة).
للحصول على النتيجة ، انقر فوق "إيقاف" ثم مربع أحمر لمقاطعة الجلسة. من الصعب فهم فكرة المؤلفين ، ولكن إذا لم توقف التسجيل تمامًا ، فلن يبدأ المحلل دائمًا في تحليل البيانات المستلمة وسيذهب مقطعك بالبيانات بعيدًا.

بعد ذلك ، يبقى فقط الانتظار قليلاً ، وبعد 30 إلى 50 ثانية ، سيمنحك المُنشئ النتيجة. إذا تم إعداد كل شيء بشكل صحيح ، فسوف تحصل على التقاط مع جميع أسماء الوظائف

الميزات المعروفة
- يمكن الحصول على النتائج الأكثر ثباتًا على أجهزة الجذر
- لا تستخدم Samsung ، ولديها العديد من أجراس وصفارات الحماية التي تتداخل مع تصحيح الأخطاء
- في العديد من الأماكن ، ستنطلق مكدسك الجماعي في وظائف النموذج "kernel.kptr + address". هذه مكالمات داخل Android Kernel محمية بسبب سياسات الأمان. على جهاز جذر ، يمكن تعطيل الحماية:
- تشغيل `قذيفة بنك التنمية الآسيوي
- قم بتشغيل `su` للحصول على امتيازات الجذر
- Run 'sysctl -w kernel.kptr_restrict = 0' - سيؤدي ذلك إلى إزالة الحماية من kernel
- [!] بعد انتهاء تصحيح الأخطاء ، قم بتنفيذ 'sysctl -w kernel.kptr_restrict = 1'. لن تتمكن بعض الأجهزة من تشغيل نظام التشغيل بطريقة أخرى عند إعادة التشغيل. في كثير من الحالات ، يتم التعامل معها فقط عن طريق وميض نواة نظيفة.
- إذا تعطل Android Studio بشكل متكرر ، يمكنك محاولة زيادة كومة Java VM:
- 2 جيجا بايت - للمشاريع متوسطة الحجم ("-xmx2g")
- 4GB - للمشاريع الكبيرة ('-Xmx4g')
- على الأجهزة غير الجذر ، يؤدي تبديل الوضع في بعض الأحيان إلى "وضع متساهل" إلى تحسين الموقف.
- قم بتشغيل الأمر "adb shell setenforce 0"
تفاصيل الوحدة
- يُطلق على سلسلة UnityMain الرئيسية موضوع UnityMain ، ولكن يمكنك أن ترى الكثير من UnityMain عند التوصيف. هذه هي سلاسل عمليات المستخدم التي تقوم بإنشائها داخل كود C #. بشكل افتراضي ، يحصلون على نفس الاسم. عادة ما يكون من السهل تمييز الخيط الرئيسي للوحدة ، لأنه سيكون الأكثر تحميلًا.
- يسمى دفق الرسومات UnityGfxWorkerW
- تسمى مؤشرات نظام الوحدة الوظيفية مؤشر ترابط العامل.
- لسوء الحظ ، فإن بعض وظائف الانتظار التي تستخدمها Unity (futex-s) ، يُظهر Android Studio ولا يعتبر وقت انتظار ، بل نشاط.
- عندما تنظر إلى الرسم البياني للمكالمات في عرض Top Down ، يجب عليك المرور عبر العديد من المستويات من خلال مكالمة Java ، وللأسف لا يمكنك تصفية ذلك في Android Studio.

الأجهزة الموصى بها
استخدمنا الأجهزة التالية لإجراء التجارب:
- Samsung Galaxy S8
- جوجل بكسل 2XL
- جوجل بكسل
- سوني اريكسون XA1
- هواوي هونر 7
- Huawei Nexus 6P
- موتو G5P
- Asus Nexus 7 (2013)
تم تثبيت جميع الأجهزة ، من أجل Huawei Nexus 6P قمنا بتجميع اللب و
AOSP . ونتيجة لذلك ، تبين أن Google و Sony هما الأكثر خلوًا من المشاكل وسهل العمل. تمتلك Sony موقعًا رائعًا للمطورين -
الأجهزة المفتوحة . لم يعد Huawei يسمح لك بإلغاء قفل الأجهزة بطريقة سهلة ، حيث تسبب Samsung في صعوبات مستمرة مع مستويات إضافية من الحماية. غالبًا ما تعطل Moto G5P عملية جمع بيانات ملفات التعريف (simpleperf).