2015-07-28 8 views
5

मैं res/raw फ़ोल्डर में कुछ संसाधनों स्वैप करने के लिए कोशिश कर रहा हूँ और jniLibs/armeabi फ़ोल्डर के आधार पर है कि क्या उसके एक release buildType या एक debug buildType। मेरे पास वर्तमान में दो उत्पाद स्वाद भी हैं।Gradle स्वैप jniLibs संसाधनों पर आधारित निर्माण स्वाद

build.gradle फ़ाइल:

apply plugin: 'com.android.application' 

android { 
    dexOptions { 
     preDexLibraries = false 
    } 

    compileSdkVersion 21 
    buildToolsVersion "22.0.1" 

    defaultConfig { 
     applicationId "com.example.test" 
     minSdkVersion 17 
     targetSdkVersion 22 
     compileOptions { 
      sourceCompatibility JavaVersion.VERSION_1_7 
      targetCompatibility JavaVersion.VERSION_1_7 
     } 
    } 

    productFlavors{ 
     phone{ 
      applicationId "com.example.testPhone" 
     } 
     tablet{ 
      applicationId "com.example.testTablet" 
     } 
    } 

    buildTypes { 
     release { 
      minifyEnabled false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 

    sourceSets{ 
     release{ 
      res.srcDirs = ['androidRelease/res/raw'] 
     } 
    } 
} 

dependencies { 
    compile project(':facebook') 

} 

का उपयोग कर रहा है sourceSet सही तरीके से ऐसा करने के लिए? यदि ऐसा है, तो कौन सा फ़ोल्डर बनाया जाना चाहिए ताकि यह buildType पर आधारित और productFlavors के बावजूद उपयुक्त संसाधनों को स्वैप कर सके?

संपादित करें: क्या jniLibs और raw फ़ोल्डर संसाधनों को स्वैप करना भी संभव है?

फ़ोल्डर संरचना:

src/main/jniLibs/armeabi 
phoneRelease/jniLibs/armeabi 
tabletRelease/jniLibs/armeabi 

फ़ोल्डर संरचना सही है।?

संपादित करें 2: जेवियर्स जवाब के आधार पर होना चाहिए इस तरह Gradle देखो:

android { 

     sourcesets { 
     phone { 
      jniLibs.srcDirs = ['phoneRelease/jniLibs/'] 
      res.srcDirs = ['androidRelease/res/raw'] 
     } 
     tablet { 
      jniLibs.srcDirs = ['tabletRelease/jniLibs/'] 
      res.srcDirs = ['androidRelease/res/raw'] 
     } 
     } 
    } 

मैं परस्पर विरोधी जवाब में से बहुत कुछ पढ़ना जारी रखते हैं, उनमें से कुछ है कि आप बस का निर्माण संस्करण और कुछ के आधार पर अलग फ़ोल्डर की जरूरत का उल्लेख sourceSet का उपयोग करने के बारे में उल्लेख करें? धन्यवाद!

+0

मेरे समझ है कि आप प्रकार का निर्माण का उपयोग नहीं करते है इसके लिए, बल्कि स्वाद। मुझे लगता है कि आप 2 डी समाधान की तलाश में हैं। –

+0

मैं स्वादों का उपयोग करने के बारे में कैसे जाता हूं? क्या आप कृपया विस्तृत कर सकते हैं? – user2511882

उत्तर

4

उनमें से कुछ है कि आप बस का निर्माण संस्करण और sourceSet उपयोग करने के लिए होने के बारे में कुछ उल्लेख के आधार पर अलग फ़ोल्डर की जरूरत का उल्लेख? jniLibs/

  • में
  • जावा स्रोत पेड़ में java/
  • पूर्व संकलित JNI पुस्तकालयों res/ में

    • एंड्रॉयड संसाधन:

  • Gradle/Android के लिए Gradle एक sourceset के लिए एक उम्मीद संरचना है assets/

  • आदि
  • 01 में संपत्तियां foo/ bar/ में
  • जावा स्रोत पेड़
  • पूर्व में

    • एंड्रॉयड संसाधन:

    कहाँ sourceSets बंद खेलने में आता है, किसी दिए गए sourceset के लिए, आप एक अलग संरचना चाहते है ickyNativeStuff/

  • assetsBecauseThatSeemsLikeADecentName/
  • में संपत्तियां जेएनआई पुस्तकालयों में संकलित
  • आदि
  • प्रत्येक बिल्ड प्रकार, उत्पाद स्वाद, और निर्माण संस्करण main साथ जाने के लिए (के रूप में कर सकते हैं उपकरण के परीक्षण के लिए androidTest) एक अलग sourceset हो सकता है,। उन्हें बिल्ड प्रकार/उत्पाद स्वाद/निर्माण संस्करण के समान नाम दिया गया है। ये स्टॉक स्ट्रक्चर में होंगे, जब तक कि आप चीजों को बदलने के लिए sourceSets का उपयोग न करें। क्या उसके एक रिलीज buildType या एक डिबग buildType के आधार पर

    मैं रेस/कच्चे फ़ोल्डर में कुछ संसाधनों स्वैप करने के लिए कोशिश कर रहा हूँ और jniLibs/armeabi फ़ोल्डर:

    तो, वापस करने के लिए सभी तरह से रोल करने

    संसाधनों के मामले में, अन्य स्रोत ओवरले main। तो, आप src/main/res/... और src/main/debug/... और src/main/release/... है, और आप एक debug निर्माण, जो कुछ भी src/main/release/... में है नजरअंदाज कर दिया है कर रहे हैं (जैसा कि हम release नहीं कर रहे हैं) और अगर जो कुछ भी src/main/res/... में है और src/main/debug/... इस्तेमाल किया जाएगा। यदि दोनों में एक ही संसाधन है (src/main/res/raw/boom.ogg और src/debug/res/raw/boom.ogg), debug एक main एक ट्रम्प करता है।

    मैंने संस्करण बनाकर अलग-अलग jniLibs/ के साथ प्रयोग नहीं किया है। मेरा अनुमान है कि यह जावा कोड की तरह व्यवहार करेगा, जहां आप बिल्ड संस्करण के स्रोत में क्या है और main में क्या है, के बीच संघर्ष नहीं हो सकता है, लेकिन यह सिर्फ एक अनुमान है। तो, आपके पास src/debug/jniLibs/ में आपके संकलित जेएनआई कोड का डीबग संस्करण हो सकता है और src/release/jniLibs/ में आपके संकलित जेएनआई कोड का रिलीज़ संस्करण हो सकता है। केवल src/main/jniLibs/ में कोई भी पुस्तकालय है जो अलग-अलग नहीं है। ऐसा कहा जा रहा है, जैसा कि मैंने उल्लेख किया है, मैंने यह कोशिश नहीं की है, और इसलिए यहां हिचकी हो सकती है।

    तो, मैं आप build.gradle में एक sourcesets बंद नहीं करने के लिए, और सिर्फ अपने विभिन्न बिट्स के लिए शेयर sourcesets संरचना, उपयोग करने के लिए उम्मीद करेंगे:

    src/ 
        main/ 
        ... 
        debug/ 
        jniLibs/ 
        res/ 
         raw/ 
        release 
        jniLibs/ 
        res/ 
         raw/ 
    
    +1

    स्पॉट ऑन। मैं 'jniLibs/'के साथ इस काम की पुष्टि कर सकता हूं। –

    +0

    जिस तरह से बहुत अधिक देरी प्रतिक्रिया के लिए माफी माँगती है। यह काम किया। धन्यवाद! – user2511882

    0

    जायके का उपयोग करने के स्रोत सेट भिन्न करने,

    productFlavors{ 
        phone{ 
        } 
        tablet{ 
        } 
    } 
    

    अब आप अपने कोड की तरह की संरचना,

    src 
        main 
        phone 
        tablet 
    

    main में कोड दोनों जायके के बीच आम है, लेकिन phone या tablet में कोड है केवल तभी शामिल किया जाता है जब संबंधित स्वाद बनाया जाता है। यही है, आपको कुछ और करने की ज़रूरत नहीं है।

    संरचना phone और tablet के तहत के तहत रूप में ही है main (res, java, आदि)। स्वाद निर्देशिका के तहत आप कस्टम AndroidManifest.xml भी प्राप्त कर सकते हैं। ग्रैडल स्वाद के AndroidManifest.xml को मुख्य में से एक के साथ विलय करने का प्रयास करता है। कुछ मामलों में आपको विलय करने के लिए नियम प्रदान करना होगा।

    +0

    उपरोक्त संरचना डीबग और रिलीज प्रकार के प्रकार के बीच अंतर कैसे करती है? मैं केवल रिलीज या डीबग – user2511882

    +0

    के आधार पर संसाधनों को स्वैप करना चाहता हूं जैसा कि मैंने उपरोक्त कहा है, आप इसके लिए स्वाद का उपयोग करते हैं, प्रकारों का निर्माण नहीं करते हैं। फिर आपने यह पूछा: "मैं स्वादों का उपयोग करने के बारे में कैसे जाता हूं?" जिसमें से मैंने ऊपर जवाब दिया। –

    +0

    लेकिन क्या यह केवल उत्पाद स्वाद के लिए काम नहीं करेगा? उदाहरण के लिए इसे फोन के लिए कैसे काम करना है कृपया केवल – user2511882

    4

    कुछ भी src/main/ के तहत सामान्य रूप से है कि एक अलग फ़ोल्डर में रखा जा सकता है:

    src/<element>/AndroidManifest.xml 
    src/<element>/java 
    src/<element>/res 
    src/<element>/assets 
    src/<element>/resources 
    src/<element>/jni 
    src/<element>/jniLibs 
    src/<element>/aidl 
    src/<element>/rs 
    

    कहाँ element एक build type या एक product flavor का नाम है। अपने संस्करण इस तरह के एक तत्व (प्रकार या स्वाद का निर्माण) भी शामिल है, तो उस स्रोत सेट भी अलावा में करने के लिए src/main

    नोट प्रयोग किया जाता है कि स्थान वास्तव में प्रासंगिक नहीं है अगर आप इसे कॉन्फ़िगर किया है। क्या मायने रखता है कि android.sourcesets.main तत्व है जिसमें सभी प्रकारों के लिए सामान्य स्रोत शामिल हैं, और प्रत्येक संस्करण में स्रोतों का एक सेट होता है।

    उदाहरण के लिए आप यह वास्तव में निम्नलिखित sourcesets उपयोग कर रहा है एक स्वाद phoneRelease अगर:

    android.sourcesets.main 
    android.sourcesets.tablet 
    android.sourcesets.release 
    android.sourcesets.phoneRelease 
    

    तो phone:

    android.sourcesets.main 
    android.sourcesets.phone 
    android.sourcesets.release 
    android.sourcesets.phoneRelease 
    

    यदि आप किसी अन्य संस्करण tabletRelease है, तो यह निम्न का उपयोग करेंगे/tablet स्रोत अलग है और जहां आप वेरिएंट विशिष्ट स्रोत डाल देंगे, जब तक कि आप और भी विशिष्ट नहीं बनना चाहते हैं और phoneRelease/का उपयोग करेंस्रोत (हालांकि उनको आम तौर पर कम उपयोग किया जाता है।) डिफ़ॉल्ट रूप से ये src/phone/... और src/tablet/... (या src/phoneRelease/...) होंगे, लेकिन आप इसे तब भी बदल सकते हैं जब तक आप चाहते हैं और जब तक यह android.sourcesets.* ऑब्जेक्ट्स से कनेक्ट हो, यह ठीक रहेगा।

    उदाहरण के लिए

    , कर:

    android { 
        sourcesets { 
        phone { 
         jniLibs.srcDirs = ['phoneRelease/jniLibs/'] 
        } 
        tablet { 
         jniLibs.srcDirs = ['tabletRelease/jniLibs/'] 
        } 
        } 
    } 
    

    ठीक है। लेकिन ध्यान रखें कि आप केवल jniLibs फ़ोल्डर और नहीं अन्य स्रोत तत्वों (जावा, रेस, आदि ...)

    यदि आप main sourcesets के लिए डिफ़ॉल्ट स्थान रखा बदल बनो, मैं सिर्फ सब कुछ src/ के तहत रखना चाहते हैं

    आप sourcesets और कैसे कई sourcesets के बारे में अधिक जानकारी देख सकते हैं यहाँ जोड़ दिया जाता है: http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Sourcesets-and-Dependencies

    +0

    इतनी जल्दी वापस आने के लिए धन्यवाद .. !! मेरे पास अलग-अलग उत्पाद फ़्लेवर्स के लिए पहले से बनाए गए अलग फ़ोल्डर हैं। लेकिन किसी कारण से ऐसा लगता है कि यह गलत है। मैं इसे हाइलाइट करने के लिए यहां अपना प्रश्न संपादित करूंगा। मैं विशेष रूप से उत्पाद पर आधारित jniLibs/armeabi से एक .so फ़ाइल को स्वैप करने की कोशिश कर रहा हूं Favors – user2511882

    +0

    फ़ोल्डर का वास्तविक स्थान कोई फर्क नहीं पड़ता। मैं अपना जवाब संपादित करूंगा। देरी प्रतिक्रिया के लिए –

    +0

    माफी। मैं अब पूरी तरह से उलझन में हूँ। मैंने अपना प्रश्न संपादित किया है। बस मुझे रिलीज बिल्ड के लिए jniLibs और कच्चे फ़ोल्डर को स्वैप करना चाहते हैं। क्या किये जाने की आवश्यकता है? धन्यवाद!!! – user2511882

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