android करण बहु-मॉड्यूल एंड्रॉइड लाइब्रेरी के साथ ग्रैडल कॉन्फ़िगरेशन



हिंदी में छात्रों के लिए पुस्तकालय नियम (1)

आपको ऐसा कुछ करना चाहिए:

root:
  |- test_app (apk just for testing, not deployed anywhere)
  |- core 
  |- extra_1
  |- extra_2
  |- extra_ ... etc
  |- android-sdk

core/build.gradle :

apply plugin: 'com.android.library'
//...

अतिरिक्त 1 extra1/build.gradle :

apply plugin: 'com.android.library'
//...
dependencies {
   compile project(':core')
}

android-sdk/build.gradle :

apply plugin: 'com.android.library'
//...
dependencies {
   compile project(':core')
   compile project(':extra')
}

वापस इतिहास

मेरे पास यह एंड्रॉइड लाइब्रेरी है कि देव सामान्य रूप से उपयोग कर सकते हैं

compile 'com.companyname.sdk:android-sdk:2.x'

और अब हम वी 3 बनाने के लिए खरोंच से पुस्तकालय का एक पुनः लिख रहे हैं।

इस पुनः संगठन पर हमने लिब को मॉड्यूल में तोड़ने में कामयाब रहे। तो एक यह कह सकता है कि वी 3 पर हम निम्नलिखित कलाकृतियों को बनाएंगे

compile 'com.companyname.sdk:core:3.x'
compile 'com.companyname.sdk:extra_1:3.x'
compile 'com.companyname.sdk:extra_2:3.x'
compile 'com.companyname.sdk:extra_ ....

और यह निम्न मॉड्यूल को ढाल संरचना पर देना होगा:

root:
  |- test_app (apk just for testing, not deployed anywhere)
  |- sdk (aka: core)
  |- extra_1
  |- extra_2
  |- extra_ ... etc

अपने build.gradle पर प्रत्येक extra मॉड्यूल के लिए provided (':sdk') ताकि sdk मॉड्यूल से सब कुछ उपयोग कर सकें, लेकिन वास्तव में इसे स्वयं के अंदर संकलित न करें।

लेकिन मैं मौजूदा होस्ट ऐप्स के लिए आसान माइग्रेशन पथ भी प्रदान करना चाहता हूं। जिसका अर्थ है, मैं V3 पर निम्न extra_1 लिए भी extra_1 जो कि core और अतिरिक्त_1 को extra_1 (जो कि मूल रूप से वर्तमान में V2 पर है)।

compile 'com.companyname.sdk:android-sdk:3.0.0'

ये सभी सिद्धांतों पर बहुत अच्छा लगता है लेकिन मुझे वाकई मुश्किल ढांचा लग रहा है, जिससे मुझे आसानी से उन सभी को निर्यात कर सकें।

मैं क्या हासिल करना चाहता हूं

इसलिए मैं निम्नलिखित कलाकृतियों का निर्माण करने में सक्षम होना चाहूंगा:

  • android-sdk जिसमें core और extra_1 दोनों शामिल हैं
  • core
  • extra_1
  • ... सभी अन्य अतिरिक्त

मैंने क्या कोशिश की है

  • legacy नामक एक अतिरिक्त मॉड्यूल जोड़ें, com.android.library बिना किसी कोड के लागू करें और दोनों मॉड्यूल दोनों के लिए compile project जोड़ें। यह एक खाली विमान उत्पन्न करता है

  • कोर / लीगेसी बिल्ड जोड़ें स्रोत के साथ टाइप दोनों मॉड्यूल सेसेट्स कभी नहीं उत्पन्न 2 aar

  • दोनों मॉड्यूल से स्त्रोतसेट्स के साथ कोर / लेगेसी उत्पादफ्लॉवर शामिल करें संकलित नहीं है क्योंकि यह sdk से आयात नहीं पा सकता है जो अतिरिक्त_1 में घोषित किया गया है (जिनमें से कुछ एनोटेशन प्रोसेसर, या extra_1 दौरान उत्पन्न होते हैं)

  • compile project('extra_1') साथ कोर / लीगेसी उत्पादफ़्लॉवर शामिल करें संकलित नहीं है क्योंकि एसडीके और अतिरिक्त_1 के बीच चक्रीय निर्भरता है।

उत्तर

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

दृष्टिकोण पर एक चेतावनी maven-publish प्लगइन के लिए कॉन्फ़िगरेशन पर है। आम तौर पर आपको publications और एक pom.withXml नोड के साथ एक publishing ऑब्जेक्ट की आवश्यकता pom.withXml है। मेरा निम्नलिखित जैसा था:

   pom.withXml {
                def root = asNode()
                def license = root.appendNode('licenses').appendNode('license')
                license.appendNode('name', 'The Apache Software License, Version 2.0')
                license.appendNode('url', 'http://www.apache.org/licenses/LICENSE-2.0.txt')
                license.appendNode('distribution', 'repo')
                def dependenciesNode = asNode().appendNode('dependencies')
                configurations.compile.allDependencies.each { dependency ->
                    def dependencyNode = dependenciesNode.appendNode('dependency')
                    dependencyNode.appendNode('groupId', dependency.group)
                    dependencyNode.appendNode('artifactId', dependency.name)
                    dependencyNode.appendNode('version', dependency.version)
                }
            }

उस दृष्टिकोण के साथ मुद्दा यह है कि dependency.version (अंत में) अनिर्दिष्ट है, और जैसे यह <version>unspecified</version> साथ एक पीओएम फ़ाइल उत्पन्न करता है

समाधान वहाँ सरल है, देर से की जगह कुछ चर यू स्क्रिप्ट पर सही संस्करण संख्या के साथ है। मेरा ऐसा दिखता है:

dependencyNode.appendNode('version', "${rootProject.ext.SDK_VERSION}")




aar