एंड्रॉइड फ्लेवर, एक ही कोड बेस का उपयोग करके स्वाद के आधार पर अपने बिल्ड और परिसंपत्तियों के आइकन कैसे बदलें।

हाल ही में मुझे एक ही कोडबेस रखते हुए, आवेदन में संपत्ति के एक अलग सेट का उपयोग करने के लिए कार्य के साथ सामना किया गया था। और यह लेख इस बारे में है कि मैंने इसे कैसे हल किया।

मुझे लगता है कि आप मूल प्रतिक्रिया-मूल से परिचित हैं, जानते हैं क्या तथा हैं, आपके सिस्टम पर Android स्टूडियो और ADB स्थापित हैं।

हम 2 स्वादों के साथ एक परीक्षण एप्लिकेशन बनाएंगे - स्पंज बॉब और मारियो। संपूर्ण समाधान स्रोत कोड यहां पाया जा सकता है: https://github.com/niktechnopro/android_flavors।

चरण 1।

RN ऐप बनाएं (एक्सपो नहीं):

  1. रिएक्ट-देशी init android_flavors (मैक ओएस उपयोगकर्ता - एसडीके के पथ के साथ स्थानीय.प्रयोगों को जोड़ने के लिए मत भूलना);
  2. अपनी परियोजना की जड़ में संपत्ति फ़ोल्डर जोड़ें और इसमें 2 छवियां रखें - मैं mario.png और spongebob.png का उपयोग करता हूं।
  3. लॉन्च आइकन बनाएं - एंड्रॉइड स्टूडियो लॉन्च करें, चुनें मेनू से, फिर अपने प्रोजेक्ट के अंदर एंड्रॉइड फोल्डर पर जाएं और ओपन होने के बाद एक बार प्रोजेक्ट ओपन हो जाए और सिंक हो जाए, इसे आसान बनाना है शीर्ष पर:
सही दृश्य चुनना

4. फिर "एप्लिकेशन / src / main / res" पर जाएं, उस पर राइट क्लिक करें, नया चुनें और फिर इमेज एसेट चुनें (यदि आपका प्रोजेक्ट खुले पर सिंक नहीं हुआ - तो आपको यह विकल्प दिखाई नहीं देगा) - और फिर फ़ॉलो करें प्रतीक बनाने के लिए संकेत:

तो फिर चलो मुख्य / रेस / मान / स्ट्रिंग्स.xml के अंदर जाते हैं और app_name को

5. अब इस एप्लिकेशन को कमांड लाइन से चलाने का प्रयास करें और एक बार एमुलेटर पर स्थापित - सत्यापित करें कि आप आइकन से कर सकते हैं "स्पंज बॉब" नाम के साथ एमुलेटर में लॉन्च आइकन के रूप में देखा जा सकता है;

6. स्वाद "मारियो" जोड़ें - मुख्य और अंदर की तरह समान स्तर पर एक और फ़ोल्डर से फ़ोल्डर , इसलिए आपकी निर्देशिका संरचना कुछ इस तरह दिखनी चाहिए:

की संरचना परियोजना

आपको हर चीज से कॉपी करने की जरूरत नहीं है , क्योंकि जो कुछ भी गायब है , स्वचालित रूप से डिफ़ॉल्ट हो जाएगा , तो हम नीचे डाल दिया केवल इस स्वाद में क्या बदलने की जरूरत है;

7. दोहराएँ चरण <6>, लेकिन इस बार - "मारियो / रेस" के लिए आइकन बनाने के लिए। तो फिर चलो mario / res / values ​​/ strings.xml के अंदर जाते हैं और app_name को "मारियो" में बदलते हैं।

2 चरण।

इस चरण में, हम फ्लेवर की घोषणा करेंगे और "स्क्रिप्ट" को संशोधित करें ।

  1. कैसे संशोधित करें यहाँ वर्णित है: "https://developer.android.com/studio/build/build-variants#product-flavors", इसलिए हम निर्देशों का पालन करने जा रहे हैं और हमारे संशोधन इस तरह:
build.gradle productFlavors

यहाँ हम 2 फ्लेवर बनाते हैं: "spongebob" और "mario", और इन बिल्ड्स के बीच अंतर करने के लिए हम मुख्य ऐप एप्लीकेशनआईड / पैकेज नाम = "com.android_flavors" में ApplicationIdSuffix जोड़ने जा रहे हैं। तो अंतिम पैकेज कुछ इस तरह दिखेगा: "com.android_flavors.spcraft" और "com.android_flavors.mario"।

ग्रैड अपने बिल्ड प्रकारों और उत्पाद स्वादों और नामों के आधार पर स्वचालित रूप से बिल्ड वेरिएंट बनाता है - तो चलिए आगे बढ़ते हैं कि “स्क्रिप्ट्स” के तहत package.json में जोड़ें:

इस डेमो के लिए मैंने केवल । इसके अलावा, रिलीज़ संस्करण के लिए, साइनिंग कुंजी उत्पन्न करने की आवश्यकता होगी - बस Google यह कैसे करना है (एंड्रॉइड स्टूडियो के साथ अपने एपीपी पर हस्ताक्षर करना बहुत आसान है)।" src="https://imgstore.nyc3.cdn.digitaloceanspaces.com/raw3h/1586309503045.png" />
  1. स्पंज बॉब स्वाद बनाने के लिए रन कमांड "npm रन एंड्रॉइड-बॉब", कॉपीलेट बनाने के बाद, हम एपीपी को "स्पंज बॉब" और संबंधित आइकन के साथ देखेंगे। फिर कमांड चलाएं: (यह स्थापित संकुल को सूचीबद्ध करेगा) टर्मिनल में और आपको पैकेज देखना चाहिए: "com.android_flavors.spcraft";
  2. अब कमांड चलाएं सत्यापित करने के लिए मारियो स्वाद बनाने के लिए, और ऊपर से 1 के समान चरणों को दोहराएं)।

इस बिंदु पर हमारे पास अलग-अलग आइकन और एपीपी नामों के साथ एक ही एपीपी के 2 फ्लेवर स्थापित होने चाहिए! - अच्छा, हुह?

चरण 3।

इस चरण में हम अपने एपीपी के होमपेज पर विभिन्न संपत्तियों / छवियों को दिखाने के लिए तर्क को जोड़ने जा रहे हैं, जो कि स्थापित स्वाद पर निर्भर करता है। हम सीधे पैकेज का नाम पढ़ेंगे और संपत्ति में सही छवि को इंगित करेंगे।

हमें पैकेज का नाम पाने के लिए और सही छवि बनाने के लिए उसके आधार पर कस्टम मूल पैकेज जोड़ने की आवश्यकता है। Android डेवलपर लिंक: https://developer.android.com/reference/android/content/Context#getPackageName ();

हम मूल मॉड्यूल बनाने के लिए इन चरणों का पालन करेंगे, पैकेज नाम पढ़ें, और फिर इस जानकारी को भेजें ब्रिज <-> जेएस> पुल, इसलिए हम इसे अपने एपीपी तर्क के भीतर उपयोग कर सकते हैं।

https://reactnative.dev/docs/native-modules-android

  1. में - नई कक्षा बनाएँ - PackageReader.java, और इसे निम्नलिखित कॉपी करें:

2. अगला, हमें मॉड्यूल को पंजीकृत करना होगा, इसलिए हम कॉल कर सकते हैं जेएस से विधि, नामक एक अन्य वर्ग बनाएं और निम्नलिखित की प्रतिलिपि बनाएँ:

3. घोषणा MainApplication.java में, जैसे:

4. और अंत में, पैकेज के नाम के आधार पर सही छवि बनाने के लिए हमारे जेएस में तर्क जोड़ें, यहां "होम पेज" के लिए एक कोड I है:

ध्यान दें कि मैंने कैसे घटकडाइमाउंट में पैकेज पढ़ा (आप उपयोग कर सकते हैं यदि आप ऐसा पसंद करते हैं)।

किया हुआ!

तो अब पैकेज के स्वाद के आधार पर, हमारे पास अलग-अलग पैकेज के नाम और अलग-अलग संपत्तियाँ होंगी:

रन स्क्रिप्ट "npm रन एंड्रॉइड-बॉब" और हम प्राप्त करते हैं:

और स्क्रिप्ट "npm रन android-mario" हमें मिलेगा:

और आपके पास हमारे ये दोनों फ्लेवर एक साथ स्थापित हैं, क्योंकि उनके अलग-अलग पैकेज नाम हैं:

चीयर्स!