مقدمة: الألم المألوف لكل مطور Android
\nتقوم بتشغيل Build → Clean Project في Android Studio، على أمل إعادة بناء سريعة للمشروع، ولكن بدلاً من ذلك ترى نصًا أحمر في نافذة Build:
Error: Execution failed for task ':app:clean'.\n> Unable to delete file: C:\\Users\\User\\AndroidStudioProjects\\MyApp\\app\\build\\...\\some_file.dex\nهل هذا مألوف؟ إذا كنت تكتب بلغة Kotlin لنظام Android، فقد يظهر هذا الخطأ بتكرار مزعج، خاصة على نظام Windows. فهو لا يبطئ التطوير فحسب، بل يجعلك تبحث عن حلول "سحرية" مثل إعادة تشغيل الكمبيوتر.
\nفي هذه المقالة، سنشرح لماذا يحدث خطأ تعذر حذف الملف، وكيفية إصلاحه نهائيًا، وسنعرض أمثلة على كود بلغة Kotlin لأتمتة الحل. بنهاية المقالة، ستتمكن ليس فقط من إصلاح المشكلة، بل أيضًا من منعها.
\nسنبدأ بالأسباب، ثم ننتقل إلى الحلول - من البسيطة إلى المتقدمة.
\n\nلماذا لا يستطيع Gradle حذف الملف؟
\nيحدث خطأ Unable to delete file عند تنفيذ المهمة :app:clean عندما يحاول Gradle تنظيف مجلد build/، لكنه لا يستطيع حذف ملف أو أكثر. الأسباب الرئيسية:
- \n
- الملف محظور بواسطة عملية أخرى - غالبًا ما يكون برنامج مكافحة الفيروسات، أو Windows Search Indexer، أو Android Studio نفسها. \n
- المسارات الطويلة (Windows) - إذا تجاوز مسار الملف 260 حرفًا، فقد يرفض Windows حذفه. \n
- تدفقات الإدخال/الإخراج غير المغلقة - قد يبقي تطبيقك أو مكتبتك الملف مفتوحًا. \n
- تعارض مع Instant Run / Apply Changes - الإصدارات القديمة من Android Studio قد تحظر الملفات. \n
غالبًا ما تظهر المشكلة على نظام Windows، ولكنها قد تظهر أيضًا على macOS/Linux عند استخدام مشاركة SMB أو Docker.
\n\nحلول سريعة (في 5 دقائق)
\nقبل الخوض في الكود، جرب هذه الخطوات البسيطة. فهي تساعد في 80% من الحالات.
\n\n1. أغلق Android Studio واحذف يدويًا
\nالطريقة الأكثر موثوقية هي إغلاق IDE وحذف مجلد app/build يدويًا. إذا لم يتم حذف الملف، استخدم Unlocker (Windows) أو أمر lsof (macOS/Linux) للعثور على العملية المحظورة.
2. استخدم الطرفية بدلاً من الواجهة الرسومية
\nأحيانًا "تتجمد" Android Studio في مهمة clean. نفذ الأمر في الطرفية:
\n./gradlew clean --no-daemon\nالعلامة --no-daemon تشغل Gradle بدون عملية خلفية، مما يحل غالبًا مشكلة الحظر.
3. قم بتعطيل Instant Run / Apply Changes
\nفي Android Studio 3.x والإصدارات الأقدم، قد يحظر Instant Run الملفات. قم بتعطيله:
\n- \n
- انتقل إلى
File → Settings → Build, Execution, Deployment → Instant Run. \n - قم بإلغاء تحديد
Enable Instant Run. \n
في الإصدارات الأحدث (Arctic Fox+) تم استبدال هذا الخيار بـ Apply Changes، لكن المشكلة أقل شيوعًا.
\n\nحلول متقدمة: الأتمتة بلغة Kotlin
\nإذا لم تساعد الطرق السريعة، فقد حان الوقت لأتمتة العملية. سنكتب نصًا صغيرًا بلغة Kotlin، سيتم تشغيله قبل مهمة clean وإغلاق العمليات المحظورة قسرًا.
\n\n4. استخدام Kotlin DSL في Gradle لمهمة مخصصة
\nأضف إلى ملف build.gradle.kts (على مستوى الوحدة) الكود التالي:
// build.gradle.kts (app level)\ntasks.register<Exec>("killFileLocks") {\n description = "يغلق العمليات التي تحظر الملفات في مجلد build"\n commandLine("cmd", "/c", "taskkill /f /im java.exe 2>nul || exit 0")\n // لنظام macOS/Linux استبدل بـ:\n // commandLine("sh", "-c", "lsof -ti:8080 | xargs kill -9 2>/dev/null || true")\n}\n\ntasks.named("clean") {\n dependsOn