ProGuard هي أداة ضغط وتحسين وتعمية لبايت كود Java، مدمجة في Android SDK لحماية التطبيقات من الهندسة العكسية. وفقًا لجلسة Google I/O Security (2025)، التكوين الصحيح لـ ProGuard يقلل حجم APK بنسبة 15-25% ويخفض خطر تسرب الكود بنسبة 60%. أصبحت الأداة معيارًا لتطوير Android وتُستخدم في ملايين التطبيقات حول العالم.
الخلاصة
ProGuard هي أداة مجانية التوزيع لمعالجة بايت كود Java، طورتها شركة Guardsquare. وهي مدمجة في Android SDK وتؤدي ثلاث وظائف رئيسية: الضغط والتحسين والتعمية. يحلل ProGuard جميع البايت كود للتطبيق وتبعياته، ويحدد الفئات والطرق غير المستخدمة، ويزيلها، ثم يُعمي الكود المتبقي.
تم إنشاء ProGuard بواسطة Eric Lafortune في عام 2000 كأداة لتحسين تطبيقات Java. مع ظهور Android في عام 2008، تم دمج ProGuard في Android SDK وأصبح الأداة القياسية لحماية التطبيقات. وفقًا لإحصائيات Guardsquare (2024)، يُستخدم ProGuard في أكثر من 80% من تطبيقات Google Play، بما في ذلك تطبيقات البنوك الكبرى وشركات التكنولوجيا.
يقوم ProGuard بالمعالجة على أربع مراحل. في المرحلة الأولى (الضغط)، تحلل الأداة نقاط الدخول إلى التطبيق وتحدد الفئات والطرق والحقول التي يمكن الوصول إليها أثناء التنفيذ. في المرحلة الثانية (التحسين)، يحول ProGuard البايت كود لتحسين الأداء. المرحلة الثالثة (التعمية) تعيد تسمية المعرفات. في المرحلة النهائية، يضيف preverify البيانات الوصفية اللازمة للتحقق من البايت كود على الآلة الافتراضية.
دعونا نفحص بالتفصيل كل وظيفة من الوظائف الرئيسية الثلاث لـ ProGuard: الضغط والتحسين والتعمية. فهم كل آلية سيساعد في تكوين الأداة بالشكل الأمثل.
يقوم ProGuard بتحليل رسم بياني للاستدعاءات من نقاط الدخول (طريقة main، Activity، BroadcastReceiver) ويزيل الكود غير المستخدم. في مشروع Android نموذجي مع مكتبات مثل Retrofit وOkHttp وGson، يمكن للضغط إزالة ما يصل إلى 40% من البايت كود، بما في ذلك طرق المكتبات غير المستخدمة وكود التصحيح وفئات الاختبار. هذا يقلل مباشرة من حجم APK ويقصر وقت تحميل التطبيق.
في مرحلة التحسين، ينفذ ProGuard أكثر من 20 تحويلاً مختلفًا للبايت كود: تضمين الطرق القصيرة، إزالة المعلمات غير المستخدمة، تبسيط التعبيرات المنطقية، دمج كتل الكود المتطابقة. على سبيل المثال، يمكن استبدال الدوال القصيرة للوصول إلى الحقول بالوصول المباشر. يمكن للتحسين تسريع تنفيذ الكود بنسبة 5-15% حسب هيكل التطبيق.
تعمل التعمية في ProGuard عن طريق إعادة تسمية الفئات والطرق والحقول إلى متواليات قصيرة من الأحرف: a, b, c, a.a, a.b وهكذا. يتم تحديث جميع المراجع إلى العناصر المعاد تسميتها تلقائيًا في جميع أنحاء الكود. من المهم ملاحظة أن التعمية لا تغير سلوك البرنامج، بل تجعل فهم الكود المفكك أكثر صعوبة. يجب استبعاد المكتبات وواجهات برمجة التطبيقات العامة من التعمية عبر قواعد keep.
// قبل تعمية ProGuard
public class LoginManager {
public User authenticateUser(String username, String password) {
// منطق المصادقة
}
}
// بعد تعمية ProGuard
public class a {
public Object a(String b, String c) {
// نفس المنطق مع معرفات مُعاد تسميتها
}
}
تكوين ProGuard هو خطوة حاسمة في إعداد بناء تطبيق Android. يمكن أن تؤدي القواعد غير الصحيحة إلى إزالة الفئات الضرورية، وبالتالي إلى أعطال في إصدار الإصدار.
يتضمن تفعيل ProGuard في مشروع Android تعيين علامة minifyEnabled إلى true لنوع بناء الإصدار. يتم تضمين قواعد ProGuard القياسية مع Android SDK في ملف proguard-android-optimize.txt. تتم إضافة القواعد المخصصة في ملف منفصل proguard-rules.pro. أثناء البناء، يطبق ProGuard القواعد القياسية أولاً، ثم القواعد المخصصة، مما يسمح بتجاوز التكوين الأساسي.
android {
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
يحتوي ملف القواعد المخصص على توجيهات محددة للمشروع. تتضمن القواعد النموذجية الاحتفاظ بالفئات المستخدمة عبر الانعكاس، ونماذج البيانات لتسلسل Gson/Moshi، وواجهات استدعاء المكتبات، والفئات المُعلّقة بتعليقات توضيحية محددة. يبدأ كل توجيه بكلمة رئيسية -keep أو -dontwarn أو -keepclassmembers ويحدد نمطًا للفئة التي لا يجب على ProGuard تعديلها.
# الاحتفاظ بنماذج البيانات لـ Gson
-keep class com.example.data.model.** { *; }
# الاحتفاظ بالفئات المستخدمة عبر الانعكاس
-keep class * implements com.google.gson.TypeAdapterFactory
# تجاهل تحذيرات المكتبات
-dontwarn okhttp3.internal.**
-dontwarn retrofit2.**
# الاحتفاظ بالتعدادات (ميزة ProGuard)
-keep class * extends java.lang.Enum { *; }
تتضمن قواعد تكوين ProGuard عدة فئات من التوجيهات، يدير كل منها جانبًا محددًا من المعالجة. دعونا نلقي نظرة على التوجيهات الرئيسية الضرورية للتكوين الصحيح.
| التوجيه | الغرض | مثال |
|---|---|---|
| -keep | الاحتفاظ بالكامل بالفئة وأعضائها | -keep class com.example.MyClass |
| -keepclassmembers | الاحتفاظ بأعضاء الفئة فقط | -keepclassmembers class * { @Inject *; } |
| -dontwarn | تجاهل التحذيرات | -dontwarn okhttp3.internal.** |
| -keepparameternames | الاحتفاظ بأسماء معلمات الطرق | -keepparameternames |
| -keepattributes | الاحتفاظ بالسمات (التعليقات التوضيحية، EnclosingMethod) | -keepattributes *Annotation* |
| -dontoptimize | تعطيل التحسين | -dontoptimize |
لا يمكن لـ ProGuard تحليل الكود المُحمّل عبر الانعكاس (Class.forName()) أو ServiceLoader أو التحميل الديناميكي لملفات DEX بشكل ثابت. إذا تم إنشاء فئة باسمها النصي، فإن ProGuard لا يعلم بوجودها وقد يزيلها كغير مستخدمة. يجب الاحتفاظ بجميع هذه الفئات بشكل صريح عبر -keep. هذا هو السبب الأكثر شيوعًا للأعطال في إصدارات الإصدار بعد تفعيل ProGuard.
غالبًا ما تتضمن المكتبات قواعد ProGuard الخاصة بها، والتي تُضاف تلقائيًا إلى البناء عبر consumer-rules.pro المضمن في ملف AAR. يطبق Android Gradle Plugin هذه القواعد تلقائيًا أثناء البناء. يحتاج المطور فقط إلى التأكد من أن جميع المكتبات المستخدمة توفر قواعد صحيحة، وتكميلها في المشروع إذا لزم الأمر.
عند حدوث أخطاء بعد تفعيل ProGuard، استخدم ملف mapping لفك تعمية تتبع المكدس. للتشخيص، استخدم المفتاح -whyareyoukeeping الذي يوضح سبب الاحتفاظ بالفئة في بناء الإخراج. تعطيل -optimizationpasses و -obfuscation مؤقتًا يسمح بتحديد موقع المشكلة. وفقًا لـ Guardsquare، 80% من مشاكل ProGuard تُحل بإضافة قواعد -keep لفئات الانعكاس.
مع إصدار Android Gradle Plugin 3.4 (2019)، قدمت Google R8 — خليفة ProGuard، المدمج مباشرة في مترجم D8/R8. بحلول عام 2023، حل R8 محل ProGuard بالكامل في AGP 8.0، لكن فهم الاختلافات المعمارية مهم لترحيل المشاريع.
يعمل ProGuard كأداة منفصلة تعالج بايت كود Java (ملفات .class) قبل التحويل إلى DEX. R8 مدمج في مترجم DEX ويعالج الكود على مستوى أدنى، مما يسمح بتحسينات غير متاحة في ProGuard. يدعم R8 أيضًا إزالة السكر — تحويل السكر النحوي لـ Java 8+ إلى كود متوافق مع الإصدارات السابقة لمستويات API القديمة في Android.
وفقًا لفريق أداء Android في Google (2025)، يوفر R8 ضغط كود أفضل بنسبة 10-15% مقارنة بـ ProGuard مع نفس القواعد. R8 أسرع — ينخفض وقت البناء بنسبة 20-30%. بالإضافة إلى ذلك، يزيل R8 كودًا ميتًا أكثر بفضل التحليل على مستوى DEX بدلاً من مستوى ملفات الفئة. R8 متوافق تمامًا مع صيغة قواعد ProGuard، مما يجعل الترحيل شفافًا للمطور.
الانتقال من ProGuard إلى R8 بسيط: في AGP 8.0+، يُستخدم R8 افتراضيًا. للمشاريع القديمة، تحتاج إلى إزالة ProGuard من classpath وتحديث gradle.properties: android.enableR8=true. قواعد ProGuard متوافقة مع R8 بدون تغييرات في معظم الحالات. يُوصى باختبار بناء الإصدار على جميع الأجهزة المستهدفة بعد التبديل، حيث قد يزيل R8 كودًا كان ProGuard يحتفظ به.
الأسئلة الشائعة
السبب الأكثر شيوعًا هو إزالة الفئات المستخدمة عبر الانعكاس، أو تسلسل Gson/Moshi، أو المكتبات ذات التحميل الديناميكي لملفات DEX. الحل: إضافة قواعد -keep لجميع الفئات التي يتم إنشاؤها عبر Class.forName()، أو التي تطبق Parcelable، أو يتم تسلسلها عبر JSON، أو مُعلّقة بـ @Inject. استخدم ملف mapping لـ فك التعمية من تتبع المكدس وتحديد الفئة المحذوفة من البناء.
يوجد ملف mapping في build/outputs/mapping/release/mapping.txt بعد البناء. التنسيق: الاسم_الأصلي -> الاسم_المُعمّى -> النوع. يدعم Android Studio فك التعمية عبر Build > Analyze APK: حمّل APK، وألصق تتبع المكدس واحصل على أسماء فئات قابلة للقراءة. لـ CI/CD، خزّن ملفات mapping لكل إصدار في مستودع منفصل أو تخزين سحابي.
نعم، يجب تفعيل ProGuard فقط لـ builds الإصدار. تستخدم builds التصحيح minifyEnabled false، مما يسرّع التجميع ويحافظ على أسماء الفئات القابلة للقراءة للمصحح. في وضع التصحيح، تتداخل التعمية مع التصحيح والتنفيذ خطوة بخطوة، بينما يبطئ الضغط التكرارات. لاختبار صحة التعمية، استخدم بناء إصدار على جهاز فعلي.
تشير تحذيرات ProGuard (WARNING) إلى مشاكل لا توقف البناء ولكنها قد تشير إلى أخطاء محتملة في وقت التشغيل. إذا لم يؤدِ التحذير إلى تعطل، أضف -dontwarn للمكتبة المقابلة. إذا كان التحذير مرتبطًا بفئة مفقودة غير مستخدمة في التطبيق، استخدم أيضًا -dontwarn. تجاهل جميع التحذيرات دفعة واحدة دون تمييز ليس موصى به.
ProGuard هي أداة مجانية بميزات أساسية: الضغط والتحسين وإعادة تسمية الفئات والطرق. DexGuard هو منتج تجاري من نفس شركة Guardsquare يضيف تعمية تدفق التحكم وتشفير السلاسل والموارد والحماية من التصحيح وتعمية الموارد. يُستخدم DexGuard في التطبيقات المصرفية والألعاب ذات المتطلبات الأمنية العالية.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.