كيفية تشخيص مشاكل تكامل SDK. تجربة فريق تطوير Yandex Mobile Ads SDK

مرحبا بالجميع! اسمي ديمتري فيسكو ، أنا أقوم بتطوير Yandex Mobile Ads SDK. تم تصميم مكتبتنا لتحقيق الدخل من تطبيقات الجوال على منصات Android و iOS. أريد أن أخبركم اليوم عن كيفية تبسيط تحليل أخطاء تكامل SDK المعقدة في تطبيقات Android. ربما ستكون تجربتنا مفيدة لك.

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

لسوء الحظ ، لا يمكن تحديد جميع أخطاء تكامل SDK من خلال المراقبة. في حالة ظهور مثل هذا الموقف ، ننتقل إلى الشريك لتوضيح تفاصيل التكامل. ثم نحاول تحديد سبب المشكلات والمساعدة في حلها. إذا لم تكن هذه المعلومات كافية لتحديد سبب الأخطاء ، فإننا نطلب من الشريك الحصول على إذن لإعادة هندسة التطبيق. بعد إذن ، نبدأ في النظر إلى عمل SDK الإعلان في التطبيق كمربع أسود. نقوم بعرض نشاط الشبكة من خلال وكيل ، والتحقق من عرض طرق عرض الإعلانات من خلال Layout Inspector ، إلخ.

يعد عرض نشاط الشبكة لأحد التطبيقات التي تبدأ بـ Android 7.0 مشكلة ، لأن النظام لا يثق بالشهادات التي يحددها المستخدم افتراضيًا. مطلوب تثبيت شهادة لعرض حركة مرور SSL للتطبيق من خلال وكيل. سيؤدي ذلك إلى حل المشكلة إما عن طريق تشغيل التطبيق على إصدارات Android الأقدم من 7.0 ، أو عن طريق إضافة network_security_config إلى التطبيق ، على سبيل المثال ، من خلال Apktool. يمكنك عرض عرض طرق عرض الإعلانات من خلال الأداة المساعدة Layout Inspector من خلال تشغيل التطبيق على محاكي أو على جهاز. في هذه الحالة ، تحتاج إلى تعديل ملف AndroidManifest.xml عن طريق إضافة السمة debuggable = true عبر Apktool.

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

تثبيت تطبيق SDK جديد في تطبيق ما


يتيح لك تغيير رمز SDK تضمين كود تعسفي في التطبيق من خلال فئات إصدار SDK المعدلة ، على سبيل المثال ، تمكين وضع التسجيل الإضافي. خوارزمية العملية هي كما يلي. السيناريو:

  1. تفكيك تطبيق ملفات DEX في smali ؛
  2. يحول ملف JAR من الإصدار الجديد من SDK إلى smali ؛
  3. يستبدل تنفيذ ملفات SDK smali في ملفات التطبيق smali ؛
  4. يعيد تجميع التطبيق مع الإصدار الجديد من SDK.


D يقوم بتجميع ملفات DEX للتطبيق في smali


تحتاج إلى تحليل التطبيق ، وتقسيمه إلى وحدات أصغر ، بحيث يمكنك تغيير رمز فئات SDK دون تغيير رمز التطبيق. كيفية التعامل مع التطبيق المجمّع؟ تفكيك DEX إلى ملفات smali.

في Android ، يقوم التطبيق بتخزين الرمز في ملفات DEX. يمكنك استخراجها من التطبيق من خلال أداة unzip ، لأن APK هو أرشيف منتظم مع محتوى منظم. تحتوي ملفات DEX على تنسيق ثنائي لتعبئة رمز الكثافة مقارنةً بـ JARs. نظرًا لطبيعة DEX الثنائية ، فهي غير إنسانية ، لذا فإن تغيير DEX بحد ذاته أمر غير عقلاني. أول ما يتبادر إلى الذهن هو فك تشفير DEX في Java. مثل هذا التحويل ممكن ، لكنه غير تافه ويحدث مع فقدان وظائف الكود. لذلك ، سوف نستخدم الترجمة إلى smali-code. يتيح لك التحويل إلى smali نقل التعليمات بدقة من DEX في شكل يمكن قراءته بواسطة الإنسان مع إمكانية التحويل اللاحق إلى تعليمات برمجية قابلة للتطبيق.

استدعاء الأداة المساعدة smali يحول DEX إلى مجموعة من الفئات في رمز smali. في هذه الحالة ، يتم الحفاظ على الترتيب الأولي للفئات بواسطة الحزم الفرعية.


تحويل SDK الجديد إلى smali


سنقوم بإعداد نسخة SDK بديلة. لضمان استنساخ المشكلة ، سنقوم بإنشاء إصدار من SDK مع تمكين التسجيل استنادًا إلى نفس الإصدار الذي تم دمجه بالفعل في التطبيق. تتمثل إحدى أسهل الطرق للعثور على الإصدار المتصل من Yandex Mobile Ads SDK في التطبيق في عرض محتويات الطريقة في فئة MobileAds.getLibraryVersion () عبر Apk Analizer في Android Studio. بعد اكتشاف الإصدار المستخدم من SDK للإعلان ، ننتقل إلى فرع هذا الإصدار ونجمع إصدار المكتبة مع تسجيل إضافي. نتيجة لذلك ، نحصل على ملف AAR. أنه يحتوي على الموارد ورمز المكتبة. في ملف AAR ، نحن مهتمون فقط بالكود الموجود في ملف JAR ، حيث لا توجد موارد خارجية في SDK لدينا: جميع الموارد مضمنة مباشرة في الكود أو تأتي من الواجهة الخلفية. يؤدي عدم وجود ملفات الموارد إلى تبسيط دمج SDK في IDE دون دعم أنظمة الإنشاء الحديثة.

لتغيير إصدار SDK في التطبيق إلى إصدار جديد ، نأتي AAR إلى نفس الحالة مثل التطبيق المفكك ، أي من AAR نحصل على مجموعة من ملفات smali. يتم التحويل على طول السلسلة: AAR → JAR → DEX → SMALI:

  1. من AAR باستخدام الأداة المساعدة لفك الضغط نقوم باستخراج JAR بالكود ؛
  2. نقوم بتحويل JAR إلى DEX من خلال الأداة المساعدة dxdump من أدوات Android SDK.
  3. نحصل على الملفات في رمز smali باستخدام الأداة المساعدة smali مع ملف DEX كمعلمة.


تنفيذ SDK


بعد تلقي ملفات smali الخاصة بالتطبيق و SDK مع السجلات ، استبدلنا تطبيق SDK بتطبيق جديد. ثم نعيد بناء التطبيق. عند البث إلى smali ، تحتفظ الطبقات الناتجة بموقعها بواسطة حزم فرعية. لذلك ، إذا كانت الحزمة التي توجد بها فصول SDK معروفة ، فمن السهل التمييز بين فئة المكتبة وفئات التطبيق. يمكن توزيع فئات SDK عبر DEXs متعددة. لذلك تختلف الخوارزمية التي يتم من خلالها استبدال تطبيق SDK لتطبيق مع واحد أو عدة ملفات DEX.

والخوارزمية لاستبدال تطبيق SDK في تطبيق واحد DEX


في تطبيق DEX واحد ، نقوم ببساطة بنسخ فئات SDK smali الجديدة فوق جميع فئات التطبيقات وإنشاء DEX معدّل. يمكنك إنشاء ملف DEX باستخدام الأداة المساعدة baksmali. يتم تغذية الدليل مع ملفات الحزمة للفئات في كود smali إلى إدخال الأداة المساعدة. بعد اجتياز baksmali الملفات المدمجة smali للتطبيق و SDK الجديد ، حصلنا على ملف DEX معدّل مع منطق SDK الذي تم تغييره.


والخوارزمية لاستبدال تطبيق SDK في تطبيق مع MultiDex


بالنسبة لتطبيق ما مع MultiDex ، أضف SDK منفصل إلى DEX الجديد وقم بإزالة الإصدار السابق من SDK من باقي ملفات DEX الخاصة بالتطبيق. إضافة نسخة جديدة من SDK إلى DEXs الفردية سيتجنب القيد على عدد الطرق في تنسيق DEX. سوف يقوم MultiDex بتحميل ملف DEX الإضافي تلقائيًا برمز SDK إذا تم تسميته بشكل صحيح. يبحث MultiDex عن ملفات DEX بدورها ، باستخدام الفهرس الموجود في نهاية الملف: dex1 أولاً ، ثم dex2 - وما إلى ذلك. إذا قمت بتسمية الملف بفهرس إضافي ، فسيقوم MultiDex بتحميله تلقائيًا إلى الجهاز الظاهري. وبالتالي ، من خلال baksmali ، سنقوم بإنشاء ملفات DEX بناءً على ملفات smali للتطبيقات التي تم تلقيها مسبقًا ، ولكن مع الفئات المحذوفة من إصدار SDK القديم. وجمع أيضًا ملف DEX إضافي مع نسخة معدلة من SDK ، مما يزيد الفهرس باسم ملف DEX.


إعادة إنشاء التطبيق مع الإصدار الجديد من SDK


لقد حصلنا على ملفات DEX للتطبيق مع نسخة معدلة من SDK. الشيء صغير: سنقوم باستبدال ملفات DEX في ملف APK الذي تم فك حزمه أصلاً من التطبيق بملفات DEX المعدلة. ومن خلال الاتصال بالأمر zip ، نحصل على الإصدار الأخير من APK ، والذي يبقى لم يتم التوقيع عليه. سنقوم بتسجيل الدخول باستخدام مفتاح التصحيح عبر apksigner حتى يمكن تثبيت التطبيق على الجهاز. التطبيق مع منطق SDK المعدلة جاهز.

ن إنقاذ


تعمل الخوارزمية في معظم الحالات ، لكن في بعض الأحيان لن تعمل على استبدال تطبيق SDK في التطبيق. أسباب هذا:

  1. التعتيم ProGuard. تمنع القواعد الموجودة في ملف العميل الخاص بالمكتبة ProGuard من نقل فئات SDK. ولكن إذا قام المطور بإلغاء هذه التعليمات ، فيمكن أن يقوم جزء من فصول المكتبة بتغيير الحزمة الخاصة به. في هذه الحالة ، لن تعمل الخوارزمية ، حيث لن يعثر البرنامج النصي على موقع فئات SDK القديمة.
  2. قيود تنسيق DEX. إذا تم تخزين كل الكود الموجود في التطبيق في ملف DEX واحد ، مما أدى إلى استنفاد الحد الأقصى للطرق المستخدمة تقريبًا. عند استبدال إصدار SDK في تطبيق بإصدار مع تسجيل إضافي ، سيزداد عدد الأساليب. سيتم تجاوز الحد. في تنسيق DEX ، الحد الأقصى هو 2 ^ 16.
  3. حماية التطبيق الخاص بك من التغيير. التطبيق يحتوي على آليات مدمجة لمكافحة التعديل. على سبيل المثال ، من خلال التحقق من صحة توقيع التطبيق. عن طريق تغيير ملف APK ، نقوم بتغيير توقيعه وفقًا لذلك. عند بدء تشغيل التطبيق ، يتحقق من التوقيع مقابل المرجع ويلقي استثناء. من الصعب بشكل خاص إزالة هذا الاختيار إذا تم وضعه في الجزء الأصلي.

و togas


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

من التحويل إلى smali ، يمكنك الحصول على مزايا إضافية: تتيح لك ملفات smali تصحيح التطبيق دون مصدر. لبدء تصحيح الأخطاء ، تحتاج إلى إنشاء مشروع في Android Studio استنادًا إلى ملفات smali الخاصة بالتطبيق وإرفاق مصحح الأخطاء بعملية الاهتمام. مزيد من التفاصيل مكتوبة في هذا المقال .

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


All Articles