في الإصدار القديم من تطبيق Open Mushaf للأندرويد، كان ملف التثبيت بصيغة AAB يبلغ حجمه 218 ميجابايت. السبب؟ صور PNG لطبقتين فقط من المصحف كانت مضمّنة بالكامل داخل الحزمة، بالإضافة إلى ملفات تفسير بصيغة JSON. كان القرار التطويري التالي هو الانتقال إلى مستودع quranpediad/quran-svg المليء بملفات SVG أدق وأخف – لكن هنا ظهرت المشكلة الحقيقية: المستودع يحتوي على أكثر من خمس طبقات، كل منها تضم 604 ملف SVG، بحجم يتجاوز 200 ميجابايت للطبقة الواحدة. تضمين طبقة واحدة فقط كان سيُفجّر الحد المسموح به في Google Play فوراً.
القيد التقني الصارم من Google
تفرض Google Play حداً أقصى لحجم التحميل المضغوط (compressed download size) للوحدة الأساسية (base module) في حزمة Android App Bundle قدره 200 ميجابايت فقط. أي أن مجرد طبقة SVG واحدة ستتجاوز هذا الحد. كانت المعضلة أشمل من مجرد تحسين تدريجي – كان لا بد من إعادة بناء آلية التحميل من الصفر.
الحل: فصل المحتوى عن الحزمة والتحميل عند الطلب
بدلاً من حشر ملفات SVG وبيانات التفسير داخل ملف التثبيت، قمنا بنقلها بالكامل إلى مستودعات GitHub مستقلة، وأصبح التطبيق يحمّلها عند الحاجة عبر شاشة تحميل مخصصة (Download Screen). استخدمنا jsDelivr كشبكة توصيل محتوى (CDN) مجانية وموثوقة:
كيف تعمل jsDelivr مع GitHub تحديداً
تمنحنا jsDelivr رابطاً مباشراً لأي ملف في مستودع عام على GitHub دون أي إعداد إضافي. صيغة الرابط:
https://cdn.jsdelivr.net/gh/USER/REPO@VERSION/PATH/TO/FILE
حيث يمكن أن يكون VERSION اسم فرع أو رقم إصدار أو هاش commit.
تثبيت الإصدار بهاش commit: ضمان ثبات المحتوى
اعتمدت على هاش commit محدد بدلاً من اسم فرع دائم التغير. بهذا:
الملف المرتبط بهاش معيّن لا يتغير أبداً، لأنه يشير إلى حالة دقيقة وثابتة من المستودع.
أي نسخة من التطبيق تظل تحمّل الملفات التي اختُبرت معها حصراً، حتى لو استمر تحديث المستودع لاحقاً.
عند الحاجة لتحديث البيانات، يكفي إصدار commit أو tag جديد وتحديث الهاش في الإصدار التالي من التطبيق.
قدرات jsDelivr وحدودها (من التوثيق الرسمي)
بنية تحتية موزّعة عبر عدة مزودي CDN (مثل Cloudflare وFastly) ومزودي DNS، مما يضمن استمرارية الخدمة.
حتى لو حُذف الملف من المستودع الأصلي، تستمر jsDelivr في تقديم النسخة المخزّنة دون انقطاع.
التخزين المحلي بعد التحميل
البيانات التي تُحمَّل لأول مرة (SVG وJSON) لا تبقى عالقة في الذاكرة المؤقتة للمتصفح فحسب، بل تُخزَّن بشكل دائم على جهاز المستخدم:
- على أندرويد وiOS: باستخدام Expo FileSystem، الذي يسمح بحفظ الملفات في مسار مخصص للتطبيق والوصول إليها دون الحاجة لإعادة تحميلها.
- على الويب: بالاعتماد على واجهة التخزين الدائم للمتصفح (navigator.storage)، مما يضمن بقاء الملفات عبر الجلسات.
هكذا تُحمَّل ملفات الطبقة الواحدة مرة واحدة فقط، ولا تتأثر سرعة التنقل بين الصفحات بعد ذلك.
النتيجة العملية
انخفض حجم ملف AAB النهائي إلى 83 ميجابايت فقط، أي أقل من نصف الحد الأقصى الذي تفرضه Google، وأقل بكثير من 218 ميجابايت السابقة. النتيجة:
- تثبيت أولي أسرع وأخف لمستخدمي الأجهزة ذات المساحة المحدودة أو الاتصال البطيء.
- إمكانية إضافة طبقات مصحف جديدة مستقبلاً دون أي قلق من تجاوز حدود المتجر، لأنها تُحمَّل عند الطلب فقط.
- بنية تحتية عالمية مجانية بالكامل، دون أي تكلفة استضافة إضافية على المشروع.
التنفيذ الكامل متاح على الفرع الخاص بهذا التعديل:
https://github.com/adelpro/open-mushaf-native/tree/develop-svg
مستودع SVG المستخدم:
https://github.com/quranpediad/quran-svg
للراغبين في تجربة النسخة التجريبية على أندرويد ومشاركة ملاحظاتهم:
https://play.google.com/apps/internaltest/4701660154182872717