Google
خانه / آموزش / مزایا و نحوه استفاده از Product Flavors در Gradle

مزایا و نحوه استفاده از Product Flavors در Gradle

Product Flavor به معنی عطر و طعم محصول است و استفاده از آن امکانات بسیار را به ما در Build گرفتن از پروژه می دهد. خود بخش defaultConfig در  gradle که اطلاعات مربوط به کمترین sdk، نام پکیج و غیره را وارد می کنیم، خود یک کلاس flavor است. با استفاده از flavor امکانات زیادی می توان به برنامه اضافه کرد، از قبیل minSdk, applicationId, targertSdkVersion  و کلاً تمام تنظیماتی که در بخش defaultConfig می نویسیم. حتی می توانید نسخه دیگری از برنامه با package دیگر را به کمک آن بدون نیاز به تکثیر کلاس ها داشته باشیم.

Creating product flavors is similar to creating build types: add them to the productFlavors block and configure the settings you want. The product flavors support the same properties as defaultConfig —this is because defaultConfig actually belongs to the ProductFlavor class. This means you can provide the base configuration for all flavors in the defaultConfig block, and each flavor can change any of these default values, such as the applicationId.

فرض کنید می خواهیم برنامه را در دو نسخه رایگان و پولی تهیه کنید که هرکدام دارای پکیج جداگانه است و می توانند همزمان روی گوشی نصب شوند. اگر این امکان یعنی flavor در gradle وجود نداشت باید دو پروژه با نام پکیج های مختلف ایجاد می کردیم. اما به کمک Flavor به راحتی می توان این کار را انجام داد. برای اضافه کردن flavor می توان از منوی بالا Build/Edit flavors اقدام کرد و یا بصورت دستی نام و مشخصات موردنیاز را در gradle سطح ماژول اضافه کرد.

ما دو flavor ساختیم که اطلاعات پیش فرض خود را از DefaultConfig  می گیرد. ما به  gradle گفتیم که در نسخه رایگان نام پکیج را تغییر دهد. در صورت انتخاب هرکدام و Build گرفتن، خود gradle اتومات پکیج مورد نظر را تولید می کند و لازم نیست دستی اینکار را انجام دهیم. حال فرض کنید که لازم است در نسخه رایگان در یکسری از کلاس ها اتفاقات دیگری بیافتد. برای اینکار لازم نیست  کلاس های مجزا (ولی همنام) را جداگانه برای هر flavor ایجاد کنیم. کافیست در هر کلاس که قرار است با توجه به flavor اتفاق خاصی بیافتد، بصورت زیر چک کنیم:

از طرفی اگر قرار است با توجه به flavor های گوناگون تغییری در resource ها داشته باشیم در این صورت باید فایل مربوط به آن را در پکیج همنام flavor ساخته شده قرار دهیم. مثلا فرض کنید قرار است در  freeVersion نام برنامه متفاوت بوده و صفحه اصلی برنامه کلاً فرق داشته باشد و همچنین دیتابیس Sqlite همراه پروژه نیز متفاوت باشد. (یعنی نمی خواهیم این تغییرات را از درون کد انجام دهیم بلکه می خواهیم خودش بطور خودکار resource مربوطه را استفاده کند! ) پس باید پکیج جدید را به همراه فایل های مورد نیاز که قرار است جایگزین شود بسازیم. یادتان باشد این قضیه فقط در مورد Resource ها می باشد و در کلاس ها ایجاد کلاس تکراری بخاطر اندک تفاوت درست نیست و افزونگی ایجاد می کند، بلکه همانطور که گفتم بهتر است با یک if ساده، اتفاقات مربوط به این flavor را در همان یک کلاس هندل کنید. حتماً توجه دارید که این قضیه در مورد کلاس های متفاوت صدق نمی کند ( قرار است یک کلاس خاصی در یک flavor خاصی وجود داشته باشد!)  و باید کلاس های متفاوت اضافه شوند. در تصویر زیر نحوه و محل ساخت قایل های flavor نمایش داده ام:

یک پکیج همنام با  flavor ایجاد شده موازی  main  در  gem/src/main . پس دیدیم که تمامی Resource هایی که قرار بود متفاوت باشند را قرار دادیم. از جمله DB، فایل CSS مربوطه نمایش وب ویو، layout مربوط به MainActivity و حتی strings که در آن نام برنامه و تعدادی متن دیگر را تغییر داده ام. در ضمن اگر قرار است کلاسی فقط در اینجا وجود داشته باشد همانطور که گفته شد آن را باتوجه به نیاز اضافه می کنیم و در داخل کد استفاده. خیلی راحت و خوش مزه!

حالا نوبت به نحوه استفاده از flavor ایجاد شده می رسد، قبلش یک نکته کوچک:

همانطور که حتماً مستحضر هستید می توان حالات مختلفی برای  Build با  BuildTypes   داشته باشیم. می توان متغیر تعریف کرد، obfuscate کرد و یا تسک خاصی را به همراه Build اجرا کرد. بطور مثال تفاوت آدرس های  api در Release و debbug را می توان با BuildTypes هندل کرد. به مثال زیر توجه کنید:

همانطور که ملاحظه می کنید در این سه نوع خروجی از برنامه سه تا متغیر تعریف شده که با توجه به انتخاب build خودش بطور خودکار انتخاب و در برنامه استفاده می شود. فقط کافیست درجایی از کد بصورت زیر استفاده کنید:

خیلی خوب، بر می گردم سر موضوع اصلی یعنی نحوه استفاده از flavor

برای استفاده از flavor باید به منوی Build Varians در Android Studio رفته و بعد از انتخاب گزینه مورد نظر برنامه را لانچ یا build بگیریم. نکته جالب این است که می توان با ترکیب BuildConfig و Flavor حالات بسیار زیادی برای Build برنامه ایجاد کرد که واقعاً کاربردی و ضروری است یعنی به تعداد BuildType در تعداد flavor ، حالت Build خواهیم داشت ( همانطور که می بینید  ۴  = (debug | release )ضرب(freeVersion | primary) حالت داریم.) و به راحتی می توانیم درهرلحظه Build مورد نظر را با حداقل تغییرات در کد( تغریباً صفر!) انجام دهیم.

امیدوارم این آموزش براتون مفید بوده باشه. سوالات و نقطه نظرات خود را با من به اشتراک بگذارید.

منبع: بایت کد

۲ دیدگاه

  1. سلام رفیق،
    عالی بود.
    فونت و فاصله بین خطوطت هم خیلی بهتر و خواناتر شده.
    به نظرم آدرس سرور نگین رو از تو اسکرین شات های build type پاک کن

دیدگاهتان را ثبت کنید

آدرس ایمیل شما منتشر نخواهد شدعلامتدارها لازمند *

*

bigtheme