في الاندرويد ستديو اذا اردت ان تضمن مكتبة في مشروعك, كل ماعليك فعله هو اضافة بعض الأسطر البسيطة الى ملف build.gradle

dependencies { compile 'net.alhazmy13.MediaPicker:libary:2.2.5' }

انتهينا, الامر بسيط!!

ولكن قد تتساءل من أين يقوم الاندرويد ستديو بجلب وتحميل هذه المكتبات؟ سأوضح في هذه المقالة بالتفاصيل كيف يقوم الاندرويد ستديو بجلب المكتبات وتضمينها في المشاريع وكيف تقوم ببناء مكتبك الخاصة وتقوم بنشرها ليستفيد منها المطورين الآخرين.

من اين يقوم الاندرويد ستديو بجلب المكتبات؟

سأبدأ بهذا السؤال البسيط من اين يقوم الاندرويد ستديو بجلب المكتبات التي تُضمنها في مشروعك, هل يقوم البرنامج بالبحث عنها في قوقل ويقوم بتحميلها ؟ بالتأكيد لا والامر غير معقد بالشكل الذي تعتقده.

كل مافي الامر ان الاندرويد ستديو يقوم بتحميل جميع المكتبات من سيرفر Maven Repository والمعرف مسبقاً في ملف build.gradle و معظم المكتبات التي نستخدمها في مشاريعنا هي مستضافة على سيرفرين وهي المتعارف عليها jcenter & Maven Central .

jcenter

jcenter هو عبارة عن Maven Repository مستضاف من قبل bintray.com وتستطيع الاطلاع على جميع المكتبات المستضافة هنا عن طريق الرابط التالي:

http://jcenter.bintray.com
ولجلب المكتبات من jcenter كل ماعليك فعله هو تضمينه في ملف الـ build.gradle

	allprojects { repositories { jcenter() } }

Maven Central

Maven Central هي عبارة عن Maven Repository مستضافة من قبل sonatype.org وتستطيع الاطلاع على جميع المكتبات المستضافة هنا عن طريق الرابط التالي:

https://oss.sonatype.org/content/repositories/releases/
ولجلب المكتبات من الـ maven central كل ماعليك فعله هو تضمينه في ملف الـ build.gradle

allprojects { repositories { mavenCentral() } }

ملاحظة: صحيح ان الـ jcenter و Maven Central هما المتعارف عليهم ومعظم المكتبات مستضافة هناك إلى أن كل واحد منهم مسؤول عنه جهة مختلفة عن الأخرى ولايوجد اي علاقة بينهم وقد تجد بعض المكتبات موجودة في واحد منهم دون الآخر.

معلومات إضافية حول Jcenter & Maven Central

في السابق كان الـ repo المعتمد في الاندرويد ستديو هو mavenCentral وهو الذي يتم تعريفه في ملف build.gradle بشكل افتراضي عند انشاء مشروع جديد ولك الخيار لاحقاً بتضمين الـ jcenter ولكن بعد فترة من الزمن قررت قوقل تغير الـ repo الافتراضي إلى الـ jcenter وذلك لأسباب عديدة منها:

  • jcenter يعتبر أكبر repo موجود حتى الآن للجافا لذلك نادراً ما تجد مكتبة موجودة في maven ولا تجدها في jcenter هذا يعني أن معظم المكتبات التي قد تحتاجها هي موجودة في jcenter إلا في بعض الحالات التي سأوضحها لاحقاً.
  • الـ jcenter يعتبر اسهل من maven في عملية رفع المكتبات عليه, ولايحتاج منك الى عمل sign على الاكواد.
  • التحميل من الـ jcenter يكون عن طريق CDN وهذا مايعطي سرعة أفضل في التحميل.

كيف يقوم الـ Gradle بتحميل بتحميل المكتبات؟

للأسباب السابقة ولأسباب عديدة قررت قوقل الانتقال الـ jcenter ولذلك سأركز في هذه المقالة على طريقة رفع مكتبتك الخاصة إلى الـ jcenter وبعد ذلك لديك الخيار برفعها إلى Maven Centralكيف يقوم الـ Gradle بتحميل بتحميل المكتبات؟

قبل ان نتكلم عن طريقة رفع مكتبك الخاصة إلى الـ jcenter سنوضح اولا كيف يقوم الـ gradle بقراءة وتحميل المكتبات التي تقوم بتضمينها في الملف, فعلى سبيل المثال اذا اردت تضمين مكتبة MediaPciker في مشروعك فستقوم باضافة السطر التالي:

compile 'net.alhazmy13.MediaPicker:libary:2.2.5'

لو تلاحظ ان السطر مقسم الى جزئين الاول compile والثاني يرمز إلى معلومات عن المكتبة وهذا السطر يتكون من اكثر من مقطع ويفصل بينها علامة : وتقرأ كالتالي:

GROUP_ID:ARTIFACT_ID:VERSION

في المثال السابق GROUP_ID هو net.alhazmy13.MediaPicker وهو المعرف الخاص بالمطور, ARTIFACT_ID هو اسم الـ module الخاص بالمكتبة وفي حالتنا هذه فان اسم الـ module هو library مع التنبيه أن اسم الـ ARTIFACT_ID قد لا يطابق اسم الـ module ولكن المتعارف عليه انهما متطابقان, VERSION هو رقم الاصدار للمكتبة وفي مثالنا فان رقم الاصدار هو 2.2.5 .

ما الذي يحدث عندما نقوم بتضمين السطر السابق في مشروعنا؟

بكل بساطة سيتوجه الـ Gradle الى سيرفر الـ Maven Repository ويبحث عن المكتبة التي قمنا بتضمينها ويجلب رابط الملفات http://jcenter.bintray.com/net/alhazmy13/MediaPicker/libary/2.2.5/ وبعدها مباشرة سيقوم الاندرويد ستديو بتحميل الملفات ويضمنها من ضمن المشروع على شكل ملفات jar or aar .

ماهي ملفات jar و aar ؟

ملفات الـ jar كما نعرف جميعنا هي مثل الملف المضغوط يحتوي على كلاسات الجافا بينما ملفات الـ aar تختلف قليلاً, فـ جميع المكتبات التي نُعرفها ونستخدمها تحتوي على ملفات خاصة ببيئة الاندرويد, هذه الملفات قد تكون ملفات الـ xml الخاصة بالواجهات او النصوص او الالوان او حتى ملف الـ AndroidManifest.xml , وجميع الملفات السابقة لايمكن تضمينها في ملف الـ jar بل في ملف بامتداد aar.

ملف الـ aar يحتوي على جميع ملفات مكتبتك ومن ضمنها ستجد ملف الـ jar الخاص بأكواد الجافا classes.jar.

- /AndroidManifest.xml (mandatory) 
- /classes.jar (mandatory) 
- /res/ (mandatory) 
- /R.txt (mandatory)
-  /assets/ (optional) 
- /libs/*.jar (optional) 
- /jni/<abi>/*.so (optional) 
- /proguard.txt (optional) 
- /lint.jar (optional)

كما تشاهد بالأعلى فإن ملف aar هو مصمم بالأساس للاندرويد وجميع ما نشرحه في هذه المقالة سينتج عنه ملف aar .

ماهو الـ jitPack؟

الـ jitPack هو من Github ويتعبر repo مثله مثل الـ maven و الـ jcenter لاستضافة المكتبات الخاصة بالجافا والاندرويد ولكن الفرق بينهم ان الـ maven & jcenter يستضيف ملفات الـ jar & aar وعندما يطلبها المستخدم فإنه يقوم بتحميلها مباشرة بينما الـ jitPack فإنك تقوم برفع اكواد المشروع على الـ github ويقوم الـ jitPack بعمل build لملفات الـ jar or aar عندما يطلبها المستخدم.

لتحميل المكتبات من jitPack فانك بحاجة الى تضمينه في ملف الـ gradle عن طريق السطر التالي:

allprojects {
 
repositories {
 
...
 
maven { url 'https://jitpack.io' }
 
}
 
}