يوفر البناء القابل لإعادة الإنتاج رابطًا قابلًا للتحقق بين الكود المصدري المنشور والملف الثنائي للإصدار. تنطبق تغطيتنا الحالية للبناء القابل لإعادة الإنتاج على إصدار Android عبر F-Droid. ونعتزم توسيع هذه التغطية لتشمل قنوات توزيع إضافية على Android و iOS.
Android
F-Droid
يستخدم Gem Wallet البنية التحتية المستقلة للبناء لدى F-Droid لإعادة بناء ملف APK الخاص بـ F-Droid والتحقق منه قبل النشر.
نموذج التحقق
ينشر Gem Wallet ملف APK موقّعًا لـ F-Droid مع كل إصدار. وبشكل منفصل، تنفّذ خوادم البناء لدى F-Droid وصفة البناء العامة انطلاقًا من بيئة نظيفة:
- تحدد بيانات F-Droid الوصفية التزام (commit) Git دقيقًا وإصدار Android NDK.
- يسحب F-Droid ذلك الالتزام من مستودع Gem Wallet العام.
- تقوم سكربتات البناء القابل لإعادة الإنتاج العامة بتثبيت سلسلة الأدوات الأصلية المثبّتة الإصدارات وتشغيل
:app:assembleFdroidRelease. - ينتج البناء ملف APK غير موقّع. يقوم F-Droid بتنزيل ملف APK المقابل الموقّع من المطوّر، ويتأكد من أنه موقّع بواسطة بصمة الشهادة المعلنة في
AllowedAPKSigningKeys. - ينسخ F-Droid توقيع APK إلى الملف المعاد بناؤه ويتحقق منه. تغطي توقيعات Android APK Signature Scheme v2/v3 ملف APK بالكامل خارج كتلة التوقيع، لذا يتطلب نجاح التحقق أن تطابق حمولة APK المعاد بناؤها إصدار Gem Wallet بايتًا ببايت.
- ينشر F-Droid ملف APK الموقّع من المطوّر فقط عند نجاح التحقق. أما الإصدار الذي لا يمكن إعادة إنتاجه فلا يُنشر.
ضوابط البناء الحتمية
يتضمن Gem Wallet مكتبات Rust أصلية، ما يجعل المخرجات حساسة للاختلافات في المُصرِّف والرابط و NDK ومنصة المضيف والمُحسِّن. تتحكم عملية البناء لدى F-Droid في هذه المدخلات عبر:
- تثبيت إصدارات سلسلة أدوات Rust و
cargo-ndkفيandroid/reproducible/versions.sh؛ - تثبيت
cargo-ndkباستخدام--locked، بينما تُحل اعتماديات Rust الخاصة بالتطبيق عبر ملفCargo.lockالمضمّن في المستودع؛ - تثبيت مراجعة Android NDK الدقيقة في كل من مشروع Android وبيانات F-Droid الوصفية؛
- البناء على مضيف Linux بمعمارية
x86_64مع مسارات صريحة لرابط NDK وأداة الأرشفة الخاصة به؛ - قصر أهداف APK الأصلية على
armeabi-v7aوarm64-v8a، بشكل مستقل عن مضيف البناءx86_64؛ - استخدام قناة المنتج المخصصة
fdroid، دون وحدات Google للإشعارات والمراجعة؛ - تعطيل تحسين R8 باستخدام
-dontoptimizeلمنع مخرجات DEX غير الحتمية ومعرّفات الربط (mapping)؛ - تشغيل Gradle دون الـ daemon أو ذاكرة التخزين المؤقت للتهيئة، ومسح ذاكرات التحويل المؤقتة قبل بناء الإصدار.
إن الالتزام المصدري الدقيق وأوامر البناء ومسار المخرجات ومراجعة NDK ورابط APK الأصلي (upstream) وشهادة التوقيع المسموح بها كلها متاحة للعامة في بيانات F-Droid الوصفية. أما السكربتات التي تهيّئ Rust و Cargo وسلسلة أدوات NDK و Gradle فتُصان مع الكود المصدري للتطبيق ضمن android/reproducible.
الخصائص الأمنية والقيود
يُثبت نجاح تحقق F-Droid أن ملف APK الموقّع الذي ينشره Gem Wallet يمكن إعادة إنتاجه من الالتزام المصدري المعلن ووصفة البناء. تُنفَّذ إعادة البناء خارج البنية التحتية لـ Gem Wallet، ما يقلل الاعتماد على خط الإصدار لدينا كنقطة ثقة وحيدة.
لا تُثبت قابلية إعادة الإنتاج أن الكود المصدري خالٍ من الثغرات، أو أن كل اعتمادية جديرة بالثقة، أو أن سلسلة أدوات المُصرِّف المختارة خالية من الاختراق. فهذه المخاطر تتطلب مراجعة المصدر وضوابط الاعتماديات وأمن سلسلة الأدوات إضافة إلى البناء القابل لإعادة الإنتاج.
تتوفر حالة البناء والإصدارات المتحقق منها على صفحة Gem Wallet على F-Droid.
Universal APK و Google Play
إن ملف Universal APK الخاص بـ Gem Wallet وإصدار Google Play غير مشمولين حاليًا بتحقق F-Droid الموضح أعلاه. ومن المخطط دعم البناء القابل لإعادة الإنتاج لقناتي التوزيع هاتين على Android في عمل مستقبلي.
iOS
إصدار App Store غير قابل لإعادة الإنتاج حاليًا. ومن المخطط في عمل مستقبلي دعم البناء القابل لإعادة الإنتاج لنظام iOS والتحقق المستقل من الملف الثنائي في App Store.