20

यह मेरा ज्ञान साझा करने के लिए स्वयं उत्तर दिया गया प्रश्न है।क्रैशलिटिक्स (फैब्रिक) अनुप्रयोग प्रकारों के लिए अलग-अलग संगठन (बिल्ड प्रकार, उत्पाद स्वाद)

मेरे पास कई उत्पाद स्वाद के साथ एक प्रोजेक्ट है और मैं प्रत्येक उत्पाद स्वाद के लिए अलग-अलग संगठनों का उपयोग करके फैब्रिक को एकीकृत करना चाहता हूं।

मैंने एंड्रॉइड स्टूडियो फैब्रिक प्लगइन का उपयोग करके फैब्रिक को एकीकृत करने की कोशिश की। यह main स्रोत सेट के AndroidManifest.xml को

<meta-data 
    android:name="io.fabric.ApiKey" 
    android:value="DEFAULT_ORGANIZATION_API_KEY" /> 

प्रविष्टि जोड़ देता है।

<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools"> 

    <application> 
     <meta-data 
      android:name="io.fabric.ApiKey" 
      android:value="SECOND_ORGANIZATION_API_KEY" 
      tools:replace="android:value" /> 
    </application> 
</manifest> 

तब मुझे पता चला कि कपड़ा Gradle प्लगइन निर्माण के दौरान कपड़े एपीआई गुप्त (उर्फ गुप्त निर्माण) के साथ crashlytics.properties फ़ाइल उत्पन्न करता है और मैं इस शामिल करना चाहिए:

मैं आवेदन संस्करण विशिष्ट स्रोत सेटों में इस प्रविष्टि को फिर से लिखने का फैसला किया स्रोत नियंत्रण के लिए फ़ाइल। लेकिन प्रत्येक बार जब मैं विशिष्ट एप्लिकेशन संस्करण बनाता हूं तो यह फ़ाइल ओवरराइट की जाती है क्योंकि एपीआई गुप्त प्रत्येक एप्लिकेशन के लिए अद्वितीय है।

मैं प्रत्येक एप्लिकेशन संस्करण के लिए अलग-अलग संगठनों का उपयोग करके फैब्रिक को कैसे एकीकृत कर सकता हूं?

उत्तर

20

निर्माण fabricGenerateResources कार्य के दौरान कहा जाता है और यह निम्नलिखित सामग्री के साथ fabric.properties नाम की एक फ़ाइल के लिए लग रहा है:

apiSecret=YOUR_BUILD_SECRET 
apiKey=YOUR_API_KEY 

तो हम सभी की जरूरत है इस से पहले fabric.properties फ़ाइल उत्पन्न करने के लिए है।

मुझे this solution मिला और इसे केवल प्रकार के प्रकारों को न केवल अनुप्रयोग प्रकारों का समर्थन करने के लिए संशोधित किया।

build.gradle की android खंड के लिए इस कोड जोड़ें:

File crashlyticsProperties = new File("${project.projectDir.absolutePath}/fabric.properties") 
applicationVariants.all { variant -> 
    variant.productFlavors.each { flavor -> 
     def variantSuffix = variant.name.capitalize() 
     def generatePropertiesTask = task("fabricGenerateProperties${variantSuffix}") << { 
      Properties properties = new Properties() 
      properties.put("apiKey", flavor.fabricApiKey) 
      properties.put("apiSecret", flavor.fabricApiSecret) 
      properties.store(new FileWriter(crashlyticsProperties), "") 
     } 

     def generateResourcesTask = project.tasks.getByName("fabricGenerateResources${variantSuffix}") 
     generateResourcesTask.dependsOn generatePropertiesTask 
     generateResourcesTask.doLast { 
      println "Removing fabric.properties" 
      crashlyticsProperties.delete() 
     } 
    } 
} 

यह आवेदन वेरिएंट से अधिक iterates और प्रत्येक आवेदन संस्करण के लिए काम है कि fabric.properties फ़ाइल और काम है कि इस फाइल को हटाने के बाद कपड़ा Gradle प्लगइन एप्लिकेशन संसाधनों को उत्पन्न करता है उत्पन्न करता है बनाता है।

productFlavors { 
    flavor1 { 
     ext.fabricApiKey = "FLAVOR1_API_KEY" 
     ext.fabricApiSecret = "FLAVOR1_API_SECRET" 
    } 
} 

ext हर ExtensionAware वस्तु द्वारा प्रदान की एक ExtraPropertiesExtention वस्तु है:

तुम सब अब जरूरत उत्पाद स्वाद परिभाषित या विशिष्ट fabricApiKey और fabricApiSecret प्रकार का निर्माण करना है। यह मौजूदा गुणों में नई गुणों को जोड़ने की अनुमति देता है। मेरे मामले में flavor1ExtensionAware ऑब्जेक्ट है और इसे ext.someProperty = "value" सिंटैक्स का उपयोग करके नई गुणों के साथ बढ़ाया जा सकता है और बाद में इन गुणों का उपयोग flavor.someProperty, flavor.fabricApiKey के रूप में किया जा सकता है।

इसके अलावा fabric.properties से .gitignore शामिल करना बेहतर है।

और डीबग बिल्ड प्रकार से ext.enableCrashlytics = false को हटाने के लिए मत भूलना अगर आपने डीबग के दौरान क्रैशलिटिक्स को अक्षम करने के लिए उपयोग किया है।इस के बजाय आप Application.onCreate में अक्षम कर सकते हैं:

Fabric.with(this, new Crashlytics.Builder().core(
    new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build()).build()); 
+0

एक्सटी ऑब्जेक्ट क्या है? –

+0

@YouQi मैंने अपना जवाब अपडेट किया। – mixel

+0

क्या यह विधि अभी भी काम करती है? मैं क्रैशलिटिक्स 2.5.7 और फैब्रिक टूल्स 1.21.7 का उपयोग कर रहा हूं। मुझे स्प्रिंग त्रुटि मिलती है "नाम के साथ कार्य करें 'fabricGenerateResourcesDebug' प्रोजेक्ट में नहीं मिला ': ऐप'।" –

2

आप किसी अनुप्रयोग आईडी प्रत्यय का उपयोग कर के लिए विरोध नहीं कर रहे हैं, तो आप अलग-अलग संगठनों की जरूरत नहीं है। क्रैश और उत्तरों को अलग-अलग ऐप्स के रूप में माना जाएगा।

buildTypes { 
    debug { 
    applicationIdSuffix ".debug" 
    } 
    release { 
    //options 
    } 
} 

आप एक उपकरण या एम्युलेटर को डिबग संस्करण को तैनात करने के बाद, कपड़ा साइट पर आप देखेंगे:

उदाहरण के लिए, मान लीजिए कि अपने आवेदन आईडी io.example

अपने build.gradle में है चलो दो क्षुधा:

  • io.example
  • io.example.debug

एक बात है कि इस दृष्टिकोण के बारे में अच्छा है कि आप भी seprately अन्य निर्माण जायके का ट्रैक रख सकते है: io.exmaple.free, io.exmaple.paid, io.example.exterprise, और इतने पर।

+0

यह त्रुटि के साथ विफल रहा है 'पैकेज नाम com.xxx.xxx.debug' के लिए कोई मेल नहीं मिला क्लाइंट। यह त्रुटि ': ऐप के कारण होती है: processLiveGoogleServices' –

+2

@CerlinBoss यह एक अलग त्रुटि है। आपने इस "नए" ऐप के लिए अपने Google एपीआई सेट अप नहीं किए हैं। .debug एक नया ऐप है! – Radu

संबंधित मुद्दे