ProGuard لحماية وتحسن اداء تطبيقك

ماهو ProGuard ؟

ProGuard هي عبارة عن اداة لتقليل وتصفية الاكواد الخاصة بمشروعك عن طريق حذف الاكواد الغير مستخدمة مما ينتج عنه ملف .apk بحجم اصغر وبنسبة  25% اقل من حجمه الاساسي, كما انها تقوم بتغيير اسماء الـ classes, fields, and methods باسماء ورموز عشوائية فـ يصعب فك تشفير الاكواد, ويمكن اختصار عمل الاداء على ثلاث مصطلحات Shrinkage, Optimization & Obfuscation .

تنبيه: قد تظهر لك بعض المشاكل في مشروعك ان استخدمت الـ ProGuard مثل ظهور بعض الـ bugs وخاصة ان تعاملت مع التنبيهات (push notifications) او مع الـ app purchases او في حالة استخدامك لبعض المكتبات الخارجية, ولكن هذه الامور تحدث فقط في حالة لم تستخدم الاداة بالشكل الصحيح, لذلك سنوضح في هذه المقالة بعض التفاصيل المهمة في طريقة التعامل معها.

Obfuscation

retrace-2

عندما نقوم بعمل Complie للمشروع ويخرج لك ملف apk, فإن جميع المعلومات مثل classes, fields, methods, and attributes وغيرها ستتضمن وستكون واضحة مثل ماهي, وبالتالي يستطيع اي شخص ان يقوم بعمل decompile للمشروع ويستخرج جميع معلومات تطبيقك, والحل هو باستخدام ProGuard مع مشروعك ليصعب على اي شخص من استرجاع هذه المعلومات.

ProGuard تستخدم تقنية تسمى Obfuscator والتي تقوم باستبدال كل حرف الى حرف اخر خاص (special characters) وباسلوب شبه عشوائي يصعب على المبرمج قرائته.

الصور بالاسفل هي لتطبقين تم عمل decompile لهم ومن ثم استخدمنا اداة Dex2jar لاستخراج ملف الـ jar.

uuplay-proguard

محمي بـ ProGuard

jd-gui-decompiler

لايستخدم ProGuard

 


تفعيل ProGuard

توجه الى ملف build.gradle وقم بتغير minifyEnabled  الى true

Proguard Rules

كما قلنا سابقاً فإن الـ ProGuard سيقوم بحذف اي كلاس او كود غير مستخدم, لذلك في بعض الاحيان قد يحذف كلاسات مستخدمه في تطبيقك مماينتج عنه Bugs او Force Close , ولتجنب هذا الامر فاننا نقوم باضافة بعض الاسطر والتي تسمى قواعد (Rules) للـ  ProGuard تجبره على عدم حذف الاكواد وابقائها, هذه القواعد تكتب جميعاً في ملف proguard-rules.pro 

القواعد تكتب بالاسلوب التالي:

كما ترى في الاسطر السابقة فإننا استخدمنا بعض الرموز مثل keep , keepclasswithmembers وغيرها, كل رمز منها يستخدم لامرمعين فعلى سبيل المثال keep تستخدم لابقاء كلاس معين وابقاء جميع مايتضمنه الكلاس من متغيرات وميثود واي امور اخرى, بينما keepclassmembers تستخدم لابقاء بعض خصائص الكلاس مثل متغير او ميثود معينه.

كما يجب التنبيه الى ان بعض مطوري المكتبات يقومون بتوفير الـ Rules الخاصة بمكتباتهم والتي تجدها مع شرح اي مكتبة.

Optimization

   كما قلنا سابقا فإن الـ ProGuard يقوم بتحسين اداء تطبيقك وتسرعه, ولكن هذه الخاصية غير مفعله بشكل تلقائي, لذلك يجب عليك اضافة القواعد التالية ان اردت تفعيها:

Shrinkage

هي خاصية اختيارية  تقوم بحذف اي كود غير مستخدم في تطبيقك مما تؤدي الى تقليل حجم التطبيق و يفضل تفعيلها ان اردت استخدام ProGuard عن طريق ملف build.gradle

امور مهمة

الـ ProGuard تعمل فقط على الاكواد, اي انها تقوم بتشفير اسماء الكلاسات او الميثود او حتى تعيد ترتيبها في ملفات منفصلة ولكنها لاتعمل مع النصوص او البيانات المكتوبة بداخل الكود بشكل مسبق, فمثلاً لو كان لديك متغير قيمته String password  = "pass" فإن الاداة ربما تقوم بتغير موقع او اسم المتغير ولكنها لاتقوم بتشفير البيانات الموجودة داخل عبارتي التنصيص "pass", لذلك لايفضل ان تقوم بكتابة المعلومات المهمة مثل اسم المستخدم او كلمة المرور او اي بيانات مهمة بشكل مباشر داخل الكود Hard coded.

يوجد بعض الحلول لهذه المشكلة وهي ان تقوم بتخزين القيم داخل المتغيرات ولكن بشكل مشفر String password  = "QWJkYWg=" عن طريق Base64 مثلا, وفي كل مرة تريد استخدام قيمة المتغير تقوم بفك التشفير عنه.

مراجع اضافية

Share:
1 comments on ProGuard لحماية وتحسن اداء تطبيقك
R
  • يونيو 8 2016
  • رد
معلومات قيمه مشكور على مجهودك الأكثر من رائع

Post a comment

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *