زوميت/ متن باز بودن اندرويد اين امکان را به شما ميدهد که نسخهي خالص آن را براي گوشي خود بسازيد و از جديدترين نسخهي اين سيستمعامل لذت ببريد.
به لطف متن باز بودن سيستمعامل اندرويد، هميشه بعد از ارائهي نسخهاي از آن توسط گوگل، کد منبع يا سورس کد آن نسخه توسط گوگل در قالب AOSP منتشر ميشود. درست در همين زمان است که توسعهدهندگان اقدام به دانلود و شخصيسازي اين کدها ميکنند. LineageOS که براي آشنايي بيشتر با آن ميتوانيد به اين مطلب مراجعه کنيد، نام يکي از رامهايي است که توسط يک تيم نخبه و مجرب توسعه داده ميشود و همواره براي اينکه بتوانيد آخرين نسخهي اندرويد را روي گوشي نسبتا قديمي خود داشته باشيد، ميتوانيد روي آن حساب کنيد. بسياري از کاربران گوشيهاي جديد که اندرويد خالص را به پوستههاي شرکتهاي مختلف ترجيح ميدهند نيز فارغ از نسخهي اندرويد رام اصلي، سراغ اين رام کاستوم ميروند تا اندرويد خالص و سبک را تجربه کنند. به کمک آموزشي که در اين مقاله از سري مقالات آموزشي زوميت تقديم حضور شما ميشود، قادر خواهيد بود پس از دانلود و نصب موارد لازم، رام LineageOS را از کد منبع آن براي گوشي خود بسازيد و به اصطلاح بيلد يا کامپايل کنيد.
نميتوان گفت که دقيقا براي انجام اين کار و استفاده از آموزش پيش رو چقدر مهارت و تجربه لازم است. اگر قصد داريد با استفاده از اين آموزش براي گوشي خود رام بيلد کنيد، لازم نيست يک توسعهدهندهي باتجربه باشيد؛ ولي با مباني ابتدايي اندرويد آشنا باشيد. ما در زوميت سعي کردهايم هر آنچه بهعنوان يک کاربر اندرويد براي ساخت رام LineageOS لازم داريد، قدم به قدم براي شما فراهم آوريم؛ با اين حال، از آنجايي که تجربه، دانش قبلي و هوش و ذکاوت افراد متفاوت است، شايد عدهاي بهراحتي به نتيجه برسند و عدهاي با مشکلات عديده روبهرو شوند.
به خاطر داشته باشيد، همواره انجام چنين امور تخصصي با درصدي از ريسک همراه است که مسئوليت آن فقط و فقط متوجه خود شما است؛ اگر تمامي مراحل را بهدرستي پشت سر بگذاريد، ميتوانيد از لذت کار با رام دستساز خود بهرهمند شويد. هنگامي که بهتدريج در اين کار حرفهاي شويد، ميتوانيد ويژگيهايي به رامهاي مختلف اضافه کنيد، رفع مشکل کنيد، زبان اضافه کنيد و حتي با آنچه در خصوص بيلد کردن فرا گرفتهايد، اپليکيشنهاي متن باز را از کد منبع بيلد کنيد يا از رامهاي مختلف پورت کنيد.
سورس کد اندرويد چيست؟
اندرويد سيستمعامل متن باز محسوب ميشود که براي دستگاههاي متنوعي در دسترس است. هدف اصلي اندرويد ايجاد و ارائهي يک پلتفرم نرمافزاري باز است که اپراتورها، توليدکنندهها و توسعهدهندهها بتوانند با استفاده از آن، ايدههاي خلاقانهي خود را به واقعيت تبديل کنند و در نتيجه يک محصول موفق را در زمينهي تجربهي کاربري عرضه کنند. نتيجهي متن باز بودن، ارائهي محصولي متناسب با سليقهي کاربر است که توسعهدهندگان امکان تغيير کدها و شخصيسازي آن را نيز دارند؛ بنابراين، اندرويد اساسا اين اجازه را به شما ميدهد که بدون محدوديت در کدهاي آن دخل و تصرف کنيد و آنها را به ميل خود تغيير دهيد و شخصيسازي کنيد.
رام اندرويد چيست؟
منظور از رام اندرويد همان فرمور يا سيستمعامل اندرويد است. در واقع نوع رام تعيين ميکند که گوشي شما رابط کاربري Sense UI داشته باشد يا MIUI يا EMUI و.... رام، کرنل لينوکس و افزونههاي ديگري را نيز در خود جاي داده است که به عملکرد دستگاه کمک ميکنند.
رام اندرويد شامل چه چيزهايي است؟
بهطور کلي يک رام اندرويد موارد زير را شامل ميشود:
کرنل
بوتلودر
ريکاوري
راديو
فريمورک
برنامهها (Apps)
هسته (Core)
اندرويد رانتايم و...
کرنل چيست؟
کرنل مهمترين بخش اندرويد و اساسا هر سيستمعاملي است. ميتوانيد کرنل را پُلي از اپليکيشنها به سمت سختافزار دستگاه تصور کنيد. دستگاههاي اندرويدي از کرنل لينوکس استفاده ميکنند؛ اما اين دقيقا همان کرنلي نيست که ساير سيستمهاي عامل لينوکسي استفاده ميکنند. کدهاي بسياري در کرنل اندرويد وجود دارند که مختص اندرويد هستند. توسعهدهندگان گوگل وقت زيادي صرف اين کدها ميکنند. سازندگان پردازندهها نيز بايد در ساخت کرنل همکاري کنند؛ چرا که بايد درايورهاي مخصوص تراشهي خود را در کرنل جاي دهند. به همين دليل است که بعد از انتشار نسخهي جديدي از اندرويد، توسعهدهندگان مستقل به کمي زمان براي راهاندازي نسخهي جديد با کرنل موجود نياز دارند. درايورهايي که مثلا براي کار با کرنل اندرويد کيتکت نوشته شدهاند، لزوما روي کرنل اندرويد لاليپاپ بهدرستي کار نخواهند کرد. اين نکتهي مهمي است؛ زيرا وظيفهي اصلي کرنل، کنترل سختافزار است. تمام کدهايي که هنگام بيلد يک کرنل مشاهده ميکنيد، در واقع نقش واسط بين نرمافزار و سختافزار گوشي شما را بازي ميکنند؛ بنابراين، هر درخواستي که از گوشي خود داريد، ابتدا به کرنل فرستاده و سپس اجرا ميشوند.
بوتلودر
بوتلودر در واقع کدي است که قبل از اجراي هر سيستمعاملي عمل ميکند. بوتلودرها دستورالعملهاي اجراي کرنل سيستمعامل را ارسال ميکنند. ميتوانيد بوتلودر را به منزلهي يک ايست بازرسي براي کليهي پارتيشنها تصور کنيد. بوتلودر معمولا بسته است؛ چرا که اگر باز باشد و شما بتوانيد در پارتيشنهاي مختلف دخل و تصرف کنيد، امکان دارد به گوشي صدمه بزنيد. پس، بوتلودر اساسا به کرنل دستگاه شما دستور ميدهد که سيستم را بهدرستي بوت کنيد و بالا بياورد.
ريکاوري
به زبان ساده، ريکاوري بهعنوان مرجعي براي پشتيبانگيري يا برگرداندن اوضاع به حالت قبل است. هر زمان فرمور گوشي شما دچار نقص شود، ريکاوري شما را در حل مشکل و بازگرداني آن به حالت قبل ياري خواهد کرد. همچنين، از ريکاوري براي فلش کردن رام، کرنل و... استفاده ميشود. معروفترين و رايجترين ريکاوري کاستوم موجود در حال حاضر TWRP است.
راديو
پايينترين لايهي نرمافزاري در رام، راديو است. يعني بهمحض روشن شدن گوشي، اولين چيزي که حتي قبل از بوتلودر اجرا ميشود راديو است. راديو تمام اتصالات بيسيم، جياسام و جيپياس و... را کنترل ميکند.
موارد لازم
يک دستگاه اندرويدي که توسط لاينج پشتيباني شود.
يک رايانهاي نسبتا جديد ۶۴ بيتي لينوکسي يا ويندوزي که مقدار معقولي رم و حدود ۱۰۰ گيگابايت فضاي ذخيرهسازي داشته باشد. لازم است بدانيد هر چه رم کمتري در اختيار داشته باشيد، زمان بيلد بيشتر خواهد بود؛ بنابراين، بهتر است روي حافظهي رم ۸ گيگابايت به بالا حساب باز کنيد. همچنين استفاده از اساسدي در مقايسه با هاردديسک معمولي بهشدت در افزايش سرعت بيلد مؤثر است.
يک کابل يواسبي سازگار با گوشي شما
اتصال اينترنت پرسرعت و جريان برق مطمئن
آشنايي با اندرويد و اصطلاحات آن که به تعدادي از آنها در بخش بعد اشاره ميکنيم. اينکه شما قبلا رام کاستوم نصب کرده باشيد و مثلا با ريکاوري آشنايي داشته باشيد ميتواند مفيد باشد. آشنايي با برخي دستورهاي سادهي لينوکسي مثل cd به معني تغيير دايرکتوري، يا اينکه توالي مسيرها در لينوکس با / نشان داده ميشود نيز ميتواند مفيد باشد.
نصب SDK
در صورتي که قبلا adb و فستبوت را نصب نکردهايد، ميتوانيد آنها را از وبسايت گوگل دريافت و با استفاده از دستور زير استخراج کنيد.
unzip platform-tools-latest-linux.zip -d ~
حالا بايد adb و فستبوت را به مسير کار خود منتقل کنيد. براي اين منظور profile./~ را باز و دستور زير را وارد کنيد.
# add Android SDK platform tools to path
if [ -d "$HOME/platform-tools" ] ; then
PATH="$HOME/platform-tools:$PATH"
fi
سپس براي بهروزرساني محيط خود source ~/.profile را اجرا کنيد.
نصب بستههاي مربوط به بيلد
براي بيلد رام لاينج به چند بستهي نرمافزاري نياز است. ميتوانيد اين بستهها را از طريق قسمت package manager در توزيع لينوکس خود نصب کنيد.
نکته: پکج منجر در لينوکس، سيستمي براي نصب و حذف نرمافزار است. نرمافزاري که معمولا از اينترنت گرفته و در رايانهي شما نصب ميشود. چنانچه از اوبونتو استفاده ميکنيد، ميتوانيد از Ubuntu Software Center استفاده کنيد. راه بهتر، استفاده از دستور نصب apt-get install بهصورت مستقيم در خود ترمينال است.
براي لاينج به موارد زير نياز داريد:
bc bison build-essential ccache curl flex g++-multilib gcc-multilib git gnupg gperf imagemagick lib32ncurses5-dev lib32readline-dev lib32z1-dev libesd0-dev liblz4-tool libncurses5-dev libsdl1.2-dev libssl-dev libwxgtk3.0-dev libxml2 libxml2-utils lzop pngcrush rsync schedtool squashfs-tools xsltproc zip zlib1g-dev
براي اوبونتوهاي قديميتر از نسخهي ۱۶.۰۴ جايگزيني زير را انجام دهيد.
libwxgtk3.0-dev → libwxgtk2.8-dev
جاوا
نسخههاي مختلف لاينج اواس نياز به نسخههاي مختلف JDK يا کيت برنامهنويسي جاوا دارند.
ساخت دايرکتوري
لازم است در محيط بيلد خود چند مسير ايجاد کنيد. براي ساخت اين دايرکتوريها دستورات زير را وارد کنيد:
mkdir -p ~/bin
mkdir -p ~/android/lineage
دايرکتوري bin/~ مخزن يا ريپازيتوري (repo) شما را شامل خواهد شد و دايرکتوري android/lineage/~ سورس کد لاينج را در بر ميگيرد.
دستور نصب مخزن
دستور زير را براي دانلود باينري ريپو و قابل اجرا کردن آن وارد کنيد.
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
chmod a+x ~/bin/repo
دايرکتوري bin/~ را در مسير اجرا قرار دهيد.
در نسخههاي اخير اوبونتو bin/~ بايد خود به خود در مسير کار شما قرار داشته باشد. ميتوانيد اين مسئله را باز کردن profile./~ توسط يک ويرايشگر متن بررسي کنيد و ببينيد که آيا کد زير در آن وجود دارد يا خير. در صورت عدم وجود، ميتوانيد آن را اضافه کنيد.
# set PATH so it includes user's private bin if it exists
if [ -d "$HOME/bin" ] ; then
PATH="$HOME/bin:$PATH"
fi
سپس دستور source ~/.profile را براي بهروزرساني محيط اجرا کنيد.
راهاندازي مخزن کدهاي لاينج اواس
از آنجايي که هنوز رام ۱۵.۱ براي بسياري از دستگاهها بهصورت رسمي منتشر نشده است، در اينجا نسخهي ۱۴.۱ را مثال ميزنيم. پس برنچ يا شاخهي مورد نظر ما cm-14.1 خواهد بود و کدي که بايد وارد کنيم به شکل زير است؛ اما دقت کنيد شما نام شاخهي مورد نظر خود را وارد کنيد.
cd ~/android/lineage
repo init -u https://github.com/LineageOS/android.git -b cm-14.1
دانلود کد منبع يا سورس کد
براي بارگذاري سورس کد در رايانهي خود از کد زير استفاده کنيد.
repo sync
مانيفست LineageOS بهصورت پيشفرض تنظيماتي منطقي دارد و توصيه ميشود آن را تغيير ندهيد. مثلا مقادير 4 j- و c- يکي نشاندهندهي شاخههاي اتصال همزمان و دومي براي اين است که صرفا شاخهي مورد نظر همگامسازي شود، نه تمام شاخههاي موجود در گيتهاب لاينج. تنها در صورتي که در همگامسازي دچار مشکل هستيد، ميتوانيد مقدار 4 j- را به 3 j- و 2 j- کاهش دهيد.
توجه: دانلود سورس کد با حجم حدود ۱۵ گيگابايت ممکن است زمان زيادي طول بکشد، پس صبور باشيد. از دفعات بعد فقط تغييرات اعمالشده را همگامسازي خواهيد کرد و نيازي به دانلود مجدد اين حجم از داده نخواهد بود.
نکته: دستور repo sync بهمنظور بهروزرساني کدهاي موجود در رايانهي شما و همگامسازي آنها با سورس کدهاي لاينج و گوگل به کار ميرود. پس اين کد را به خاطر داشته باشيد؛ چرا که ممکن است بخواهيد هر چند روز يک بار از آن استفاده کنيد تا رام خود را بهروز نگه داريد.
کدهاي مخصوص دستگاه خود را تهيه کنيد
بعد از دانلود سورس کد، مطمئن شويد که در روت يا مسير اصلي سورس کد هستيد. کد cd ~/android/lineage هر جا که باشيد شما را به مسير اصلي خواهد برد. حال دستور زير را تايپ کنيد:
source build/envsetup.sh
breakfast codename
به جاي codename بايد کدنام مخصوص دستگاه خود را وارد کنيد. دستور فوق که به آن برکفست ميگويند، تغييرات مختص دستگاه شما و کرنل آن را دانلود خواهد کرد. اگر از کدنام دستگاه اندرويدي خود اطلاع نداريد ميتوانيد در اينترنت آن را جستجو کنيد. در جدول زير کدنام تعدادي از دستگاههاي اندرويدي فهرست شده است. براي مشاهدهي ساير کدنامها ميتوانيد به
اين صفحه مراجعه کنيد.
مهم: برخي دستگاهها به يک دايرکتوري مخصوص درايورهاي گوشي يا vendor نياز دارند که بايد قبل از اجراي برکفست آن را ايجاد کرد. در صورتي که در ساخت فايلهاي vendor در اين قسمت با خطا مواجه شديد، ابتدا بايد بلابهاي اختصاصي را استخراج کنيد و سپس دستور برکفست را مجددا اجرا کنيد.
استخراج بلابهاي اختصاصي
براي استخراج اين فايلها دو حالت وجود دارد. حالت اول اين که براي اولين بار است که قصد بيلد رام لاينج براي يک گوشي را داريد. در حالت دوم گوشي شما در حال اجراي آخرين نسخه از LineageOS از همان شاخهاي است که قصد بيلد آن را داريد.
حالت اول: استخراج بلابها از رام
در صورتي که براي اولين بار براي دستگاهي رام LineageOS ميسازيم بايد بلابها را از يک رام زيپشده استخراج کنيم.
قبل از شروع لازم است تفاوت بين بستهي OTA از نوع بلوکبنيان و OTA از نوع پوشهبنيان را بدانيد. در رام پوشهبنيان، محتواي پارتيشن سيستم در فولدري زيپ با نام system وجود دارد. در رام بلوکبنيان محتواي پارتيشن سيستم در يک فايل به شکل دادهي باينري ذخيره شده است. اگر رام زيپشدهي شما هيچ فولدري به نام system ندارد (يا داخل فولدر سيستم آن خالي است) و فايلي به نام system.transfer.list در روت رام شما وجود دارد، OTA از نوع بلوکبنيان است. از سوي ديگر، چنانچه پوشهي system با تمام محتويات آن را مشاهده ميکنيد و خبري از system.transfer.list نيست، رام از نوع پوشهبنيان است.
استخراج بلابهاي اختصاصي از بستهي بهروزرساني بلوکبنيان
به کمک دستورهاي زير يک دايرکتوري موقت ايجاد کنيد و به مسير آن برويد.
mkdir ~/android/system_dump/
cd ~/android/system_dump/
با دستور زير system.transfer.list و system.new.dat را از رام زيپشده استخراج کنيد.
unzip path/to/lineage-*.zip system.transfer.list system.new.dat
دقت کنيد بايد بعد از /path/to نام رام زيپشده را وارد کنيد.
حال بايد براي تبديل کردن رام بلوکبنيان به دامپي که بتوان آن را مانت کرد از sdat2img استفاده کنيد. اين اسکريپت در گيتهاب موجود است. براي کلون کردن آن از دستور زير استفاده کنيد.
git clone https://github.com/xpirt/sdat2img
وقتي sdat2img را به دست آورديد، به کمک دستور زير از آن براي استخراج ايمج سيستم استفاده کنيد.
python sdat2img/sdat2img.py system.transfer.list system.new.dat system.img
حال بايد فايلي تحت عنوان system.img داشته باشيد. با دستور زير مسيري براي آن بسازيد و محتويات سيستم را در آن مانت کنيد.
mkdir system/
sudo mount system.img system/
بعد از اين کار به دايرکتوري روت يا اصلي کدهاي دستگاه خود برويد و extract-files.sh را اجرا کنيد.
./extract-files.sh ~/android/system_dump/
اين دستور به extract-files.sh خواهد گفت که فايلها را به جاي گوشي از دامپ مانتشدهي سيستم بگيرد.
پس از اينکه تمام فايلهاي مخصوص گوشي خود را استخراج کرديد، با دستورهاي زير دامپ سيستم را آنمانت کنيد و فايلهايي را که ديگر به آنها نياز نداريد پاک کنيد.
sudo umount ~/android/system_dump/system
rm -rf ~/android/system_dump/
استخراج بلابهاي اختصاصي از بستهي بهروزرساني پوشهبنيان
به کمک دستورهاي زير يک دايرکتوري موقت ايجاد کنيد و به مسير آن برويد.
mkdir ~/android/system_dump/
cd ~/android/system_dump/
فولدر system را با دستور زير از رام استخراج کنيد.
unzip path/to/lineage-*.zip system/
دقت کنيد بايد بعد از /path/to نام رام زيپشده را وارد کنيد.
بعد از اين کار به دايرکتوري روت يا اصلي کدهاي دستگاه خود برويد و extract-files.sh را با دستور زير اجرا کنيد.
./extract-files.sh ~/android/system_dump/
اين دستور به extract-files.sh خواهد گفت که فايلها را به جاي گوشي از دامپ مانتشدهي سيستم بگيرد.
پس از اينکه تمام فايلهاي مخصوص گوشي خود را استخراج کرديد، با دستورهاي زير دامپ سيستم را آنمانت کنيد و فايلهايي را که ديگر به آنها نياز نداريد پاک کنيد.
rm -rf ~/android/system_dump/
حالت دوم: گوشي شما در حال اجراي آخرين نسخه از شاخهاي است که قصد بيلد آن را داريد.
گوشي خود را با کابل يواسبي به رايانه وصل کنيد. گوشي بايد روت باشد، adb فعال باشد و شما در مسير فايلهاي اختصاصي گوشي خود يعني /android/lineage/vendor/device/your_device/codename/~ هستيد. extract-files.sh را اجرا کنيد.
./extract-files.sh
حال بلابها بايد در فولدر /android/lineage/vendor/device/your_device/codename/~ بارگيري شده باشند. در خط فوق your_device نام شرکت سازندهي گوشي شما و codename کدنام آن خواهد بود. چنانچه خطاهايي با مضمون command not found مشاهده کرديد، ممکن است لازم باشد adb در bin/~ قرار داده شود.
فعال کردن کشگذاري براي بالا بردن سرعت بيلد
با اجراي دستور زير ميتوانيد ccach را براي بيلدهاي آتي فعال کنيد.
export USE_CCACHE=1
دستور فوق را به فايل bashrc. /~ خود وارد کنيد و سپس با دستور زير بيشينهي فضايي را که ميخواهيد در سيستم خود به کشگذاري اختصاص دهيد مشخص کنيد.
ccache -M 50G
در خط فوق 50G به معني پنجاه گيگابايت است. اين دستور را فقط براي بار اول اجرا کنيد و مقدار را چيزي بين ۲۵ تا ۱۰۰ گيگابايت انتخاب کنيد. اين کار سرعت بيلد را بهطرز قابل توجهي افزايش ميدهد؛ بهطور مثال روند بيلدي که در يک ساعت پايان ميپذيرد، در صورت فعالسازي کشگذاري طي ۲۰ دقيقه به اتمام ميرسد. اگر فقط براي يک دستگاه رام ميسازيد، ۲۵ تا ۵۰ گيگابايت فضا مناسب خواهد بود؛ اما در صورتي که براي چند دستگاه که سورس کرنل مشترکي ندارند، رام بيلد ميکنيد، بهتر است مقداري بين ۷۵ تا ۱۰۰ گيگابايت را تعيين کنيد. توجه داشته باشيد که اين فضا بهطور مستمر روي درايو شما اشغال خواهد شد.
همچنين ميتوانيد فشردهسازي کش را فعال کنيد تا تعداد فايلهاي بيشتري در فضاي شما جا بگيرند. هرچند اين کار کمي سرعت را پايين خواهد آورد. براي فعال کردن فشردهسازي کش از دستور زير استفاده کنيد يا آن را به bashrc. /~ اضافه کنيد.
export CCACHE_COMPRESS=1
نکته: با فعال کردن فشردهسازي ميتوانيد فضاي اختصاصيافته به آن را کاهش دهيد و مثلا براي يک دستگاه مقدار ۲۰ گيگابايت را در نظر بگيريد.
تنظيمات جک (jack)
جک در حال حاضر ابزار بيلد يا کامپايلر LineageOS نسخهي ۱۴.۱ به بالا است. اگر اين ابزار را بهدرستي تنظيم نکنيد، خطاي کمبود حافظه خواهد داد. حل اين مشکل با اضافه کردن خط زير به فايل bashrc. /~ صورت ميگيرد.
export ANDROID_JACK_VM_ARGS="-Dfile.encoding=UTF-8 -XX:+TieredCompilation -Xmx4G"
در خط فوق 4G در انتهاي خط به معني ۴ گيگابايت است و در واقع اين دستور به جک ميگويد که تنها از ۴ گيگابايت حافظه براي بيلد استفاده کن.
آغاز عمليات بيلد
وقت آن رسيده است که بيلد رام را آغاز کنيد. براي اين کار دستور زير را با تغيير codename به کدنام گوشي خود، وارد کنيد.
croot
brunch codename
با اين کار بيلد رام لاينج براي دستگاه شما آغاز خواهد شد. در صورتي که ساخت رام بدون خطا انجام گيرد و بيلد پايان يابد، ميتوانيد براي دسترسي به رام و ريکاوري بيلد شده دستور زير را وارد کنيد.
cd $OUT
فايل recovery.img ريکاوري LineageOS و فايل زيپي که نام آن با lineage-14.1 آغاز شده است، رام لاينج او اس شما خواهد بود که ميتوانيد با ريکاوري TWRP آن را روي دستگاه خود فلش کنيد.
اميدواريم از اين مقاله استفادهي کافي را برده باشيد و بهزودي به جمع توسعهدهندگان اندرويد اضافه شويد تا از دنياي نامتناهي اندرويد به سليقهي خود لذت ببريد. به خاطر داشته باشيد دنياي اندرويد آنقدر وسيع است که هر زمان که با خطايي مواجه شديد، ميتوانيد با جستجوي آن در گوگل راه حل مشکل خود را پيدا کنيد. همچنين براي حرفهايتر شدن و آشنايي با مفاهيمي چون گيت و گيتهاب پيشنهاد ميکنيم اين مقاله را از دست ندهيد. با آرزوي موفقيت، لطفا نظرات خود را در بخش ديدگاهها با ما به اشتراک بگذاريد.
همراهان عزيز، آخرين خبر را بر روي بسترهاي زير دنبال کنيد:
آخرين خبر در تلگرام
https://t.me/akharinkhabar
آخرين خبر در ويسپي
http://wispi.me/channel/akharinkhabar
آخرين خبر در سروش
http://sapp.ir/akharinkhabar
آخرين خبر در گپ
https://gap.im/akharinkhabar
بازار